【问题标题】:ORA-04084: cannot change NEW values for this trigger typeORA-04084: 无法更改此触发器类型的新值
【发布时间】:2016-04-10 20:13:58
【问题描述】:

我正在尝试打开 pl/sql 触发器,当故事发生变化时计算表中某些单元格的总数。这是代码:

  ALTER session SET nls_date_format='dd/mm/yyyy';

  CREATE OR REPLACE TRIGGER TOTAL
  AFTER UPDATE OR INSERT ON ORDER_ITEMS
  FOR EACH ROW
    DECLARE
temp  NUMBER;
today DATE;
  BEGIN
         temp:=(:NEW.item_price-:NEW.discount_amount)*:NEW.quantity;
         today := CURRENT_DATE;
        :NEW.TOTAL := temp;
          dbms_output.put_line('Updated on:' ||today || ' item number: ' ||:NEW.item_id|| 'order number:' ||:NEW.order_id|| 'total: ' ||:NEW.total);
  END;
  /
  show errors

  insert into order_items (ITEM_ID, ORDER_ID, PRODUCT_ID, ITEM_PRICE, discount_amount, QUANTITY)
  VALUES (13, 7, 3, 553, 209, 2);

我得到这个错误:

  1. 00000 - “无法更改此触发器类型的新值” *原因:新的触发变量只能在前行更改 插入或更新触发器。 *操作:更改触发器类型或删除变量引用。没有错误。插入 1 行 更新于:06/01/2016 项目编号:13order 数量:7 总数:

我了解问题是在触发器执行期间更新表,由对同一个表的更新引起。

【问题讨论】:

  • 您的问题是因为您试图在值被保留后更改值,尝试将触发器更改为 BEFORE 看看会发生什么。
  • 正如 Jorge 所说:将 AFTER UPDATE OR INSERT 更改为 BEFORE UPDATE OR INSERT
  • 另见the documentation,这里是列表中的最后一个限制。
  • 嘿,谢谢!解决了我的问题。

标签: oracle plsql triggers


【解决方案1】:

根据 cmets 的要求,我将发表评论作为答案。

您的问题是因为您在值被保留后尝试更改值,请尝试将触发器更改为BEFORE

CREATE OR REPLACE TRIGGER TOTAL
  BEFORE UPDATE OR INSERT ON ORDER_ITEMS
  FOR EACH ROW
DECLARE
  temp  NUMBER;
  today DATE;
BEGIN
    temp:=(:NEW.item_price-:NEW.discount_amount)*:NEW.quantity;
    today := CURRENT_DATE;
    :NEW.TOTAL := temp;
    dbms_output.put_line('Updated on:' || today || ' item number: '
                           || :NEW.item_id || 'order number:' || :NEW.order_id 
                           || 'total: ' ||:NEW.total);
END;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 2011-05-21
    • 2016-12-24
    • 2016-08-27
    • 2013-09-21
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多