更新之前的Oracle SQL触发器,用于设置来自其他实体的列值

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

我想为名为payment的表创建更新触发器,该表将更新成本列,其中get_outget_in之间的差异乘以另一个实体的价格值

我没有太多创建触发器的经验,但到目前为止这是我所拥有的

CREATE OR REPLACE TRIGGER o1 BEFORE UPDATE OF get_out ON payment 
FOR EACH ROW

BEGIN                            
    UPDATE payment
    SET payment.cost = ROUND (24 * (to_date(payment.get_out)-to_date(payment.get_in)),0) *
        (SELECT price FROM payment,book,place              
           WHERE book.ID_place = place.ID_place
                 AND payment.ID_payment = book.ID_payment
                 AND payment.ID_payment = :NEW.payment.ID_payment
        )
        ;
END;
/

创建触发器时出现此错误:

使用编译错误创建触发器。

LINE/COL   ERROR
---------- -----------------------------------------------------------
7/43       PLS-00049: bad bind variable 'NEW.PAYMENT'

有什么建议吗?谢谢

sql oracle triggers beforeupdate
1个回答
0
投票

你试图在你的update payment你的桌子update trigger。只需将join的返回值赋给:new.cost列。

更喜欢使用JOIN ON语法而不是弃用的前语法,并将表book作为表顺序语法中的第一个。

:new.payment.ID_payment上有一个不小心的尝试,而应该是:new.ID_payment

CREATE OR REPLACE TRIGGER o1 BEFORE UPDATE OF get_out ON payment 
FOR EACH ROW

BEGIN                            
    :new.cost := round(24 * (to_date(:new.get_out)-to_date(:new.get_in)),0) *
        ( select price 
            from book b 
            join payment py on py.id_payment = b.id_payment
            join place pl   on pl.id_place   = b.id_place            
           where py.id_payment = :new.id_payment            );
END;
/

顺便说一句,如果列get_outget_indate类型,只是在没有date valuedate and time info,而不是24.12.2017)的情况下持有24.12.2017 08:00,那么就不需要在你的减法中使用to_date。

© www.soinside.com 2019 - 2024. All rights reserved.