ORA-04084: невозможно изменить НОВЫЕ значения для этого типа триггера

Вопрос:Я пытаюсь включить триггер 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

Вопрос:

Я пытаюсь включить триггер 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 номер: 7total:

Я понимаю, что проблема заключается в обновлении таблицы во время запуска триггера, вызванного обновлением в той же таблице.

Лучший ответ:

В соответствии с требованиями комментариев я делаю свой комментарий в качестве ответа.

Ваша проблема в том, что вы пытаетесь изменить значение ПОСЛЕ того, что значение было сохранено, попробуйте изменить триггер на 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; /

Оцените статью
Добавить комментарий