Mutating tables

esparadis01
13 de Agosto del 2009
me da error de mutating tables al hacer un
insert into grprec values(1,1)

el trigger es el siguiente

CREATE OR REPLACE TRIGGER GRPREC_INSERT
AFTER INSERT
ON GrpRec
FOR EACH ROW
DECLARE
StoO_selcnt INTEGER;StoO_error INTEGER;StoO_rowcnt INTEGER := 1;
StoO_crowcnt INTEGER := 0;StoO_fetchstatus INTEGER := 0;
StoO_errmsg VARCHAR2(255);StoO_sqlstatus INTEGER;
idGrupo NUMBER(10,0);idUsuario NUMBER(10,0);
tempVar1 NUMBER :=2;tempVar2 NUMBER :=3;
tempVar3 NUMBER :=4;tempVar4 NUMBER :=5;
BEGIN
FOR rec IN ( SELECT :NEW.idGrupo tmpAlias1 FROM DUAL)
LOOP
idGrupo := rec.tmpAlias1 ;

END LOOP;
FOR rec IN ( SELECT :NEW.idUsuario tmpAlias1
FROM DUAL)
LOOP
idUsuario := rec.tmpAlias1 ;

END LOOP;
...
...
END GRPREC_INSERT;
/

COMO PUEDO SOLUCIONARLO??

David Lozano Lucas
13 de Agosto del 2009
Hola, el problema que estás teniendo es que accedes a la misma tabla sobre la que está hecha el trigger.
Hazte una tabla con la misma estructura llamada GrpRec_temp y haz el INSERT ahí, verás cómo te funciona.

Si encuentras otra solución escríbelo aquí. Yo estoy teniendo el mismo problema con un TRIGGER y es lo que se me ha ocurrido.

_______________________________
David Lozano
http://www.thehouseofblogs.com

Tira-Peos
13 de Agosto del 2009
Como inventor no tienes precio, chaval.

¿ para que montas es cursor si el valor ya le tienes ?

El trigger se te dispara UNA VEZ POR CADA INSERT, si insertas 100 filas de una vez, se te dispara 100 veces.

¿ no sería mas facil esto ? :

idgrupo := :new.idgrupo

Explica mejor que es lo que quieres hacer ( Aparte de una paja mental )

David Lozano
13 de Agosto del 2009
Digo yo que lo estará haciendo con un asistente del Toad o algo así.
Aún así le seguiría dando el error de mutating table

Tira-Peos
13 de Agosto del 2009
No.

EL TOAD no hace esas burradas.

David Lozano
13 de Agosto del 2009
Que estoy viendo que lo que quieres es modificar la misma línea que estás insertando.
Deberías probar algo más simple como esto:

(un ejemplo para que pases a minúsculas antes de insertar)

CREATE OR REPLACE TRIGGER AMINUSCULAS
BEFORE INSERT OR UPDATE
ON tutabla
FOR EACH ROW
BEGIN
:new.columnaamodificar := LOWER(:new.columnaamodificar);
END;

_______________________________
David Lozano
http://www.davidlozanolucas.com