【发布时间】:2017-12-24 03:25:50
【问题描述】:
我想为名为 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'
有什么建议吗?谢谢
【问题讨论】:
-
使用
:NEW.ID_Payment而不是:NEW.payment.ID_payment。祝你好运。 -
您是否打算在每次有人修改单行的 get_out 时更新整个表?如果您只想更新正在修改的行的成本,只需将 :new.cost 设置为电缆。避免在触发器中运行 UPDATE 语句,这里是龙
-
to_date(payment.get_out)-to_date(payment.get_in)是否应该是trunc(payment.get_out)-trunc(payment.get_in),即以天为单位的经过时间?如果get_in和get_out已经是日期,那么在它们上使用to_date是不对的。 -
@Bob 感谢 bob,它正在工作,但是当我向 get_out 插入新值时,它说“表支付正在发生变化,触发器/函数可能看不到它”
-
@WilliamRobertson 代码“to_date(payment.get_out)-to_date(payment.get_in)”是正确的,我试过了,问题是从触发器代码中的表格位置获取价格值
标签: sql oracle triggers beforeupdate