更新之前的Oracle SQL触发器,用于设置来自其他实体的列值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新之前的Oracle SQL触发器,用于设置来自其他实体的列值相关的知识,希望对你有一定的参考价值。
我想为名为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'
有什么建议吗?谢谢
答案
你试图在你的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_out
和get_in
是date
类型,只是在没有date value
(date and time info
,而不是24.12.2017
)的情况下持有24.12.2017 08:00
,那么就不需要在你的减法中使用to_date。
以上是关于更新之前的Oracle SQL触发器,用于设置来自其他实体的列值的主要内容,如果未能解决你的问题,请参考以下文章
使用 :new 和 :old 在更新和插入之前触发 Oracle
如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)