MUTATING TABLES

esparadis01
06 de Julio del 2004
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??


pponte
06 de Julio del 2004
que hay en los puntos suspensivos??
NO SE PUEDE HACER DML SOBRE LA TABLA QUE DISPARA EL TRIGGER!!!!!!
es una restrinccion de la base para resguardar la integridad referencial , y es justamente por eso que te dice que la tabla esta mutando...
si tenes que hacer un DML hay otras maneras de solucionarlo...

esparadis01
06 de Julio del 2004
EL TRIGGER ENTERO 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;

BEGIN
StoO_selcnt := 0;
StoO_error := 0;
StoO_rowcnt := 0;
SELECT 1 INTO StoO_selcnt
FROM DUAL
WHERE 0 < (
SELECT Count(*)
FROM Usuarios
WHERE idUsuario = idUsuario );
StoO_rowcnt := SQL%ROWCOUNT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
StoO_rowcnt := 0;
StoO_selcnt := 0;

END;
IF StoO_selcnt != 0 THEN
BEGIN
-- si es asociacion con una empresa

BEGIN
BEGIN
StoO_selcnt := 0;
StoO_error := 0;
StoO_rowcnt := 0;
SELECT 1 INTO StoO_selcnt
FROM DUAL
WHERE 0 < (
SELECT Count(*)
FROM Empresas
WHERE idEmpresa = idGrupo );
StoO_rowcnt := SQL%ROWCOUNT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
StoO_rowcnt := 0;
StoO_selcnt := 0;

END;
IF StoO_selcnt != 0 THEN
BEGIN
BEGIN
set_UserSpace(idUsuario);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
END;
END IF;
END;
BEGIN
BEGIN
StoO_selcnt := 0;
StoO_error := 0;
StoO_rowcnt := 0;

SELECT 1 INTO StoO_selcnt
FROM DUAL
WHERE 0 = (
SELECT Count(*)
FROM agendsetting
WHERE iduser = idUsuario
and IdCount = idGrupo );

StoO_rowcnt := SQL%ROWCOUNT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
StoO_rowcnt := 0;
StoO_selcnt := 0;
raise_application_error(SQLCODE, SQLERRM,true);
END;

IF StoO_selcnt != 0 THEN
BEGIN

BEGIN

agd_InsertAgendViewGroup(idUsuario,
tempVar1,
idGrupo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;

END;
BEGIN

agd_InsertAgendViewGroup(idUsuario,
tempVar2,
idGrupo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;

END;
BEGIN

agd_InsertAgendViewGroup(idUsuario,
tempVar3,
idGrupo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;

END;
BEGIN
agd_InsertAgendViewGroup(idUsuario,
tempVar4,
idGrupo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;

END;
END;
END IF;
END;
END;
END IF;

END GRPREC_INSERT;

No se muy bien que son los DML, pero necesito hacer un insert sobre la tabla GRPREC i llamar a ciertos StoredProcedures que haran Selects sobre GRPREC esperando que ya este el insert echo.

Muchas gracias por responder