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

时间:2017-12-24 03:25:50

标签: sql oracle triggers beforeupdate

我想为名为付款的表创建更新触发器,该表将更新成本列,其中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'

有什么建议吗?感谢

1 个答案:

答案 0 :(得分:0)

您正试图update payment update trigger :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_out

顺便说一句,如果列get_indate属于date value类型,只需按住date and time info而不24.12.201724.12.2017 08:00 ,而不是<head> <title>Royal Page</title> <link href="${resource(dir: 'css', file: 'common.css')}" type="text/css" rel="stylesheet"> ),那么就不需要在你的减法中使用to_date。