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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新之前的Oracle SQL触发器,用于设置来自其他实体的列值相关的知识,希望对你有一定的参考价值。

我想为名为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'

有什么建议吗?谢谢

答案

你试图在你的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。

以上是关于更新之前的Oracle SQL触发器,用于设置来自其他实体的列值的主要内容,如果未能解决你的问题,请参考以下文章

使用 :new 和 :old 在更新和插入之前触发 Oracle

如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)

更新前Oracle SQL变异表触发器

在更新触发器之前或之后更改同一表中的值(oracle)

当我调用触发器更新 STUDENT 表中的总数时,Oracle 中的 SQL 出错

用于视图的 Oracle SQL 触发器