Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sobre el mensaje de error "during execution of trigger" (https://www.clubdelphi.com/foros/showthread.php?t=56883)

Paulao 29-05-2008 21:41:48

Sobre el mensaje de error "during execution of trigger"
 
Porque este triger no funciona. Hay errores.

Código SQL [-]
CREATE OR REPLACE TRIGGER ATUALIZA_PROD_PRECO
AFTER UPDATE OR INSERT ON TB_PC_PRODUTO
FOR EACH ROW
DECLARE
 COD INTEGER;
BEGIN
  UPDATE TB_PC_PRODUTO SET VALOR = 5.98;
END;
/

Este es el error.

Código SQL [-]
ORA-04091: table DESENVOLVIMENTO.TB_PC_PRODUTO is mutating, trigger/function may not see it
ORA-06512: at "DESENVOLVIMENTO.ATUALIZA_PROD_PRECO", line 4
ORA-04088: error during execution of trigger 'DESENVOLVIMENTO.ATUALIZA_PROD_PRECO'
ORA-06512: at "DESENVOLVIMENTO.ATUALIZA_PROD", line 24
ORA-06512: at line 1

poliburro 29-05-2008 22:04:37

Existe muchisima documentación sobre las tablas mutantes, en el portal de desarrolladores de oracle encontrarás información al respecto.

Sobre tu triger.

La lógica es errónea, no puedes crear un triguer que se ejecute cuando una tabla se actualiza a si misma.

Si analizas un poco lo que provoca tu triger te darás cuenta que es erroneo:

al modificar una fila en TB_PC_PRODUTO

se actualiza la tabla TB_PC_PRODUTO estableciendo VALOR = 5.98

como se modificó la tabla TB_PC_PRODUTO vuelve a ejecutarse el triger

y así sucesivamente en un ciclo infinito.

Saludos.

Paulao 29-05-2008 22:25:38

Ola, pero yo hizo asi y viene el mismo error. Esta fue otra tentativa da hacer para ver si funciona o no. Abajo como estas ahora.

Código SQL [-]
CREATE OR REPLACE TRIGGER ATUALIZA_PROD_PRECO_CLIE
AFTER UPDATE OR INSERT ON TB_PC_CLIENTE
FOR EACH ROW

BEGIN
  UPDATE TB_PC_PRODUTO SET VALOR = 5.98;
  
END;
/

poliburro 29-05-2008 22:38:15

:P el problema tiene que ver con la mutación de las tablas,

Mientras estás realizando operaciones en una transacción que involucra ambas tablas (un bloque de código en un SP), se ejecuta el trigger, como la transacción no ha sido confirmada oracle considera que la tabla está mutando. Ello genera el error. Analiza bien la lógica de la operación que realizas, probablemente no sea necesario un trigger. y puedas realizar la operación en el mismo bloque.

Saludos

Paulao 29-05-2008 23:16:55

Esto es un aprendizado. Yo apender a escribir trigger. Se que puedo hacer de otra forma, pero mi gustaria de hacer con trigers, pues no lo conozco bien la PL/SQL y quiero aprender. Solo esto.

poliburro 07-06-2008 02:20:39

Cita:

Empezado por Paulao (Mensaje 290045)
Esto es un aprendizado. Yo apender a escribir trigger. Se que puedo hacer de otra forma, pero mi gustaria de hacer con trigers, pues no lo conozco bien la PL/SQL y quiero aprender. Solo esto.


El triguer está bien. lo que no es correcto es la lógica que implementas.

:D, suerte y aca andamos para ayudarte


La franja horaria es GMT +2. Ahora son las 09:50:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi