0

我想为一个名为 payment 的表创建一个更新触发器,它将用另一个实体的价格值之间的差值get_out和相乘的价格值更新成本列get_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'

有什么建议吗?谢谢

4

1 回答 1

0

您正在尝试在您update的. 只需将 join 的返回值分配给 column 。paymentupdate 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_outget_in的类型是date,并且只保留date value没有date and time info( 24.12.2017,而不是24.12.2017 08:00),则无需在减法中使用 to_date 进行强制转换。

于 2017-12-24T05:18:48.690 回答