我有一個請求添加觸發檢查一個條件的觸發器的資料,然后才將其添加到購買表中。他還對初始化 total_rasr 和 id_buyer 無效數字的行發誓,盡管表和觸發器中的型別相同。最大的問題是,這個觸發器有效,但在某一時刻它停止并給出了這些錯誤。
INSERT INTO PAYMENT (ID, ADDRESS, DATE_PAYMENT, PAYMENT_METHOD_ID, EMPLOYEE_ID, BUYER_ID)
VALUES (Key('PAYMENT'), 'Moscow', TO_DATE('2002-08-23', 'YYYY-MM-DD'),'005!00002','1','002!00005');
扳機
create or replace TRIGGER checking_the_availability_work
BEFORE INSERT
ON PAYMENT
FOR EACH ROW
DECLARE
rasr_is_possible boolean := true;
total_rasr VARCHAR(10);
id_buyer VARCHAR(10);
AVAILABILITY_OF_WORK VARCHAR(5);
xSQL VARCHAR(100);
BEGIN
total_rasr := :NEW.PAYMENT_METHOD_ID;
id_buyer := :NEW.BUYER_ID;
IF total_rasr = '005!00002' THEN
xSQL := 'select AVAILABILITY_OF_WORK FROM BUYER WHERE ID =' || id_buyer;
execute immediate xSQL into AVAILABILITY_OF_WORK;
IF AVAILABILITY_OF_WORK = 'Нет' THEN
rasr_is_possible := false;
END IF;
END IF;
if not rasr_is_possible THEN
Raise_application_error(-20201, 'У вас нет места работы!');
end if;
END;
uj5u.com熱心網友回復:
為什么要在這里使用動態 SQL?看起來真的很復雜,并導致錯誤,也許當 :new.buyer_id 為空或具有其他一些意外值時?嘗試這樣的事情,也許考慮檢查 :new.buyer_id 以確保它具有預期的值。
DECLARE
L_AVAILABILITY_OF_WORK VARCHAR(5);
BEGIN
IF :NEW.PAYMENT_METHOD_ID = '005!00002' THEN
select AVAILABILITY_OF_WORK into L_AVAILABILITY_OF_WORK
FROM BUYER WHERE ID = :NEW.BUYER_ID;
IF L_AVAILABILITY_OF_WORK = 'Нет' THEN
Raise_application_error(-20201, 'У вас нет места работы!');
END IF;
END IF;
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/481647.html
