我在尝试根据子查询结果或声明的变量更新表时遇到 Oracle 触发器问题。该触发器设计为在“BOOKS”表更新之前执行,特别是当“Status”列设置为“Canceled”时。触发器的有问题的部分涉及更新“CANCELATIONS”表中的“FEE”列。
CREATE OR REPLACE TRIGGER Cancel_Fee
BEFORE UPDATE ON BOOKS
FOR EACH ROW
BEGIN
DECLARE
C_Date DATE;
A_Date DATE;
CalculatedFee NUMBER;
date_diff NUMBER;
Cancel_date DATE;
Apt_Date DATE;
BEGIN
IF :NEW.Status = 'Canceled' THEN
-- Issue arises here
SELECT C.Cancel_date INTO C_Date FROM CANCELLATIONS C WHERE Cn_ID = :NEW.Apt_ID;
A_date := Apt_Date;
UPDATE Cancellations
SET FEE = (SELECT TO_NUMBER(c_date - A_date) FROM dual)
WHERE CN_ID = :NEW.Apt_ID;
END IF;
END;
END;
/
当我为“FEE”列提供 1 或“s”等直接值时,触发器就会起作用。但是,当我使用子查询或触发器中声明的变量时,它无法更新。我希望得到关于解决此问题并理解为什么子查询或变量赋值未按预期运行的指导。
您似乎不需要任何 PL/SQL 变量,因为
cancel_date
位于 cancellations
表中,并且您可以在同一个表的 UPDATE
期间访问该值,然后 Apt_Date
似乎是传递给触发器的 :NEW
记录(或者它是一个您从未为其赋值的变量)。
这意味着您可以使用:
CREATE OR REPLACE TRIGGER Cancel_Fee
BEFORE UPDATE ON BOOKS
FOR EACH ROW
BEGIN
IF :NEW.Status = 'Canceled' THEN
UPDATE Cancellations
SET fee = GREATEST(Cancel_date - :NEW.Apt_date, 0)
WHERE CN_ID = :NEW.Apt_ID;
END IF;
END;
/