Oracle 触发器:无法使用子查询或变量更新表

问题描述 投票:0回答:1

我在尝试根据子查询结果或声明的变量更新表时遇到 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”等直接值时,触发器就会起作用。但是,当我使用子查询或触发器中声明的变量时,它无法更新。我希望得到关于解决此问题并理解为什么子查询或变量赋值未按预期运行的指导。

sql oracle oracle11g triggers subquery
1个回答
0
投票

您似乎不需要任何 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;
/
© www.soinside.com 2019 - 2024. All rights reserved.