2015-02-01 2 views
-1

ребята, я понятия не имею, почему я получаю эту ошибку здесь, это код. Какая точность требует int? Я назначаю целое число PATIENT_SSA. Я попытался также присвоить это десятичной (19,2), но это не сработало.Ошибка Oracle (6,26): PLS-00103

CREATE TRIGGER TRIDOWYW 
BEFORE INSERT ON PRESCRIPTION_BILLS 
FOR EACH ROW 
DECLARE 
PATIENTID INT; 
PHARMACY_SSA INT; 
PATIENT_SSA INT; 
PHARMACYID INT; 
TOTAL_FOR_MEDICINE DOUBLE; 
PATIENTINSURANCEPERCENT DOUBLE; 
BEGIN 
    SELECT PATIENT_ID INTO PATIENTID 
    FROM PRESCRIPTIONS 
    WHERE PRESCRIPTION_ID = :NEW.PRESCRIPTION_ID; 

    SELECT PHARMACY_ID INTO PHARMACYID 
    FROM PRESCRIPTIONS 
    WHERE PRESCRIPTION_ID = :NEW.PRESCRIPTION_ID; 

    SELECT SSA_ID INTO PATIENT_SSA 
    FROM PATIENTS JOIN KIND_OF_INSURANCES USING (INSURANCE_ID) 
    WHERE PATIENT_ID=PATIENTID; 

    SELECT SSA_ID INTO PHARMACY_SSA 
    FROM CONTRACTS_WITH_PHARMACY 
    WHERE SSA_ID=PATIENT_SSA AND PHARMACY_ID = PHARMACYID AND SYSDATE BETWEEN BEGIN_DATE AND END_DATE; 

    SELECT SUM(MEDICINE.PRICE) AS SUM1 INTO TOTAL_FOR_MEDICINE 
    FROM MEDICINE_ON_PRESCRIPTION JOIN MEDICINE USING (MEDICINE_ID) 
    WHERE PRESCRIPTION_ID = :NEW.PRESCRIPTION_ID; 

    IF(PHARMACY_SSA)THEN 
    SELECT PERCENTAGE.PERCENTAGE_VALUE/100 INTO PATIENTINSURANCEPERCENT 
    FROM (PATIENTS JOIN KIND_OF_INSURANCES USING (INSURANCE_ID)) JOIN PERCENTAGE USING (PERCENTAGE_ID) 
    WHERE PATIENTS.PATIENT_ID = PATIENT_ID; 
    :NEW.TO_PAY_BY_PATIENT:= TOTAL_FOR_MEDICINE * PATIENTINSURANCEPERCENT; 
    :NEW.TO_PAY_BY_SSA := TOTAL_FOR_MEDICINE - :NEW.TO_PAY_BY_PATIENT; 
    ELSE 
    :NEW.TO_PAY_BY_PATIENT:= TOTAL_FOR_MEDICINE; 
    :NEW.TO_PAY_BY_SSA :=0; 
    END IF; 
END; 
/
+1

ОК отредактировал спасибо. –

+1

Что такое полный стек ошибок и сообщение? Является ли эта часть скрипта или нескольких операторов, с которыми вы работаете вместе? Строка 6 не является PATIENT_SSA, ошибка PL/SQL будет считать строки из DECLARE; но фактическая строка 6, TOTAL_FOR_MEDICINE, тоже выглядит нормально. Хотя я бы использовал число с точностью/шкалой, а не с двойным. Так что это, вероятно, не из этого бита кода ... –

+0

Изменения от двойного до числа помогли спасибо! –

ответ

1

Триггеры немного странные, так как CREATE TRIGGER - это SQL, но тело PL/SQL. Когда вы получаете ошибку PL/SQL, подобную этой, номер строки находится только внутри части PL/SQL, поэтому вам нужно начинать подсчет с DECLARE. Это делает шестую строку вашей декларации TOTAL_FOR_MEDICINE.

Как показано in the documentation, оракулы поддерживает типы ANSI, перечисленный в нем, но вам нужна ТОЧНОСТЬ ключевых слов:

типа двойного ТОЧНОСТИ данных представляет собой число с плавающей точкой с двоичной точностью 126.

Таким образом, вы должны использовать:

TOTAL_FOR_MEDICINE DOUBLE PRECISION; 

вы должны рассмотреть значения, которые вы хотите, хотя, и, возможно, используйте вместо этого тип данных NUMBER, указав соответствующие меры предосторожности и шкалы, чтобы избежать ошибок округления от типов float.

0

В вашем случае лучше, чтобы определить его точно так же, как это было определено в таблице:

DECLARE  
PATIENTID PRESCRIPTIONS.PATIENT_ID%TYPE; 

И так далее. В большинстве случаев лучше использовать тип данных NUMBER для столбца и для переменных.

Смежные вопросы