update trigger new examples ejercicios ejemplos before oracle plsql triggers

new - trigger update table oracle



ORA-04084: no se pueden cambiar los NUEVOS valores para este tipo de activador (1)

Estoy intentando activar el disparador pl / sql que calcula el total de algunas celdas en la tabla cuando se cambia el cuento. Este es el código:

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);

Y obtengo este error:

  1. 00000 - "no se pueden cambiar los NUEVOS valores para este tipo de activador" * Causa: las nuevas variables de activación solo pueden modificarse antes de insertar o actualizar los desencadenadores. * Acción: cambie el tipo de desencadenador o elimine la referencia de la variable. Sin errores. 1 filas insertadas Actualizado el: 01/06/2016 número de elemento: 13número de pedido: 7total:

Entiendo que el problema es actualizar una tabla durante la ejecución del desencadenador causada por una actualización en la misma tabla.


Como solicité en los comentarios, estoy haciendo mi comentario como una respuesta.

Su problema se debe a que está tratando de cambiar un valor DESPUÉS de que el valor se haya conservado, intente cambiar su desencadenador BEFORE como:

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; /