【问题标题】:Oracle SQL trigger before update to set column value from another entity更新前的 Oracle SQL 触发器以从另一个实体设置列值
【发布时间】:2017-12-24 03:25:50
【问题描述】:

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

有什么建议吗?谢谢

【问题讨论】:

  • 使用: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_inget_out 已经是日期,那么在它们上使用to_date 是不对的。
  • @Bob 感谢 bob,它正在工作,但是当我向 get_out 插入新值时,它说“表支付正在发生变化,触发器/函数可能看不到它”
  • @WilliamRobertson 代码“to_date(payment.get_out)-to_date(payment.get_in)”是正确的,我试过了,问题是从触发器代码中的表格位置获取价格值

标签: sql oracle triggers beforeupdate


【解决方案1】:

您正尝试在您的update triggerupdate 您的表payment。只需将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_in 列的类型为date,并且只保留date value 而没有date and time info24.12.2017,而不是24.12.2017 08:00),则无需在减法中使用 to_date 进行转换。

【讨论】:

  • 感谢@Barbaros,我已经尝试使用您的代码,但仍然说触发器创建时出现编译错误。是的,get_out 和 get_in 的类型是日期,但是我设置了 nls_date_format 所以时间可用
猜你喜欢
  • 2012-04-20
  • 2016-06-11
  • 2017-11-08
  • 1970-01-01
  • 2022-07-08
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多