Tablas mutantes

Tengo una tabla que esta mutando, me creo una temporal e inserto registros
correctamente pero luego quiero hacer un update y para eso NECESITO hacer un select en esa tabla, y no me deja.
Tengo prisa, si me pudieras contestar rapido te lo agradecería TE MANDO UN TRIGGER EN EL QUE INSERTO Y OTRO EN EL QUE INTENTO MODIFICAR
CREATE OR REPLACE TRIGGER "CURSO3".ABG_GPOPERCLAS_AR_TRG
AFTER INSERT OR UPDATE
ON GPOPERCLAS
DECLARE
CUENTA_GTO GPOPERCLAS.VALOR%TYPE:=NULL;
CUENTA_ANT GPOPERCLAS.VALOR%TYPE:=NULL;
V_CUENTA_GTO GPOPERCLAS.VALOR%TYPE:=NULL;
V_CUENTA_GTO2 GPOPERCLAS.VALOR%TYPE:=NULL;
ZONA GPOPER.GPSECC_COD%TYPE;
SUBZONA GPOPER.GPMAQGRUPO_COD%TYPE;
DPTO GPOPER.GPMAQ_COD%TYPE;
OPERARIO GPOPER.COD%TYPE;
TIP_RRHH VARCHAR2(1);
NOMBRE_OPE GPOPER.NOMBRE%TYPE;
BEGIN
IF INSERTING THEN
IF ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GACLATIP(ABG_GPOPERCLAS_PKG.V_NUM) = 'TIP_RRHH' THEN
SELECT GPSECC_COD INTO ZONA FROM GPOPER WHERE
EMPGRUPO_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM) AND
EMP_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM) AND
COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM);
SELECT GPMAQGRUPO_COD INTO SUBZONA FROM GPOPER WHERE
EMPGRUPO_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM) AND
EMP_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM) AND
COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM);
SELECT SUBSTR(GPMAQ_COD,1,1) INTO DPTO FROM GPOPER WHERE
EMPGRUPO_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM) AND
EMP_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM) AND
COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM);
OPERARIO := SUBSTR(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM),2,5);
SELECT NOMBRE INTO NOMBRE_OPE FROM GPOPER WHERE
EMPGRUPO_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM) AND
EMP_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM) AND
COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM);
IF ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GACLASIF(ABG_GPOPERCLAS_PKG.V_NUM) = 'D' THEN
TIP_RRHH := '1';
ELSIF ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GACLASIF(ABG_GPOPERCLAS_PKG.V_NUM) = 'I' THEN
TIP_RRHH := '2';
END IF;
CUENTA_GTO := '6296'||TIP_RRHH||SUBZONA||DPTO||OPERARIO;
CUENTA_ANT := '460100'||ZONA||OPERARIO;
INSERT INTO GPOPERCLAS (EMPGRUPO_COD, EMP_COD, GPOPER_COD, GACLATIP_COD,VALOR) VALUES
(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM),
'CUENTA_GTO', CUENTA_GTO);
INSERT INTO GPOPERCLAS (EMPGRUPO_COD, EMP_COD, GPOPER_COD, GACLATIP_COD,VALOR) VALUES
(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM),
'CUENTA_ANT', CUENTA_ANT);
INSERT INTO CFCTA (EMPGRUPO_COD,EMP_COD,COD,NOMBRE,APTESDIR_SN,NIVEL_CTA) VALUES
(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM),
CUENTA_GTO, NOMBRE_OPE, 'S',12);
INSERT INTO CFCTA (EMPGRUPO_COD,EMP_COD,COD,NOMBRE,APTESDIR_SN,NIVEL_CTA) VALUES
(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM),
CUENTA_ANT, NOMBRE_OPE, 'S',12);
END IF;
END IF;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
/
CREATE OR REPLACE TRIGGER "CURSO3".ABG_GPOPERCLAS_GACLASIF_AR_TRG
AFTER UPDATE OF GACLASIF_COD
ON GPOPERCLAS
FOR EACH ROW
DECLARE
CUENTA_GTO GPOPERCLAS.VALOR%TYPE:=NULL;
V_CUENTA_GTO GPOPERCLAS.VALOR%TYPE:=NULL;
V_CUENTA_GTO2 GPOPERCLAS.VALOR%TYPE:=NULL;
BEGIN
IF ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GACLATIP(ABG_GPOPERCLAS_PKG.V_NUM) = 'TIP_RRHH' THEN
BEGIN
/*SELECT SUBSTR(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_VALOR(ABG_GPOPERCLAS_PKG.V_NUM),1,4)
INTO V_CUENTA_GTO FROM GPOPERCLAS WHERE
EMPGRUPO_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM) AND
EMP_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM) AND
GPOPER_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM) AND
GACLATIP_COD = 'CUENTA_GTO';
SELECT SUBSTR(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_VALOR(ABG_GPOPERCLAS_PKG.V_NUM),6,7)
INTO V_CUENTA_GTO2 FROM GPOPERCLAS WHERE
EMPGRUPO_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM) AND
EMP_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM) AND
GPOPER_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM) AND
GACLATIP_COD = 'CUENTA_GTO';*/
-- FUNCION K BASICAMENTE HACE LODE ARRIBA--
CUENTA_GTO := ABG_SACAR_CTA_GTO(ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM),
ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM));
V_CUENTA_GTO := SUBSTR(CUENTA_GTO,1,4);
V_CUENTA_GTO2 := SUBSTR(CUENTA_GTO,6,7);
RAISE_APPLICATION_ERROR(-20333,V_CUENTA_GTO||V_CUENTA_GTO2);
IF ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GACLASIF(ABG_GPOPERCLAS_PKG.V_NUM) = 'D' THEN
CUENTA_GTO := V_CUENTA_GTO||'1'||V_CUENTA_GTO2;
ELSIF ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GACLASIF(ABG_GPOPERCLAS_PKG.V_NUM) = 'I' THEN
CUENTA_GTO := V_CUENTA_GTO||'2'||V_CUENTA_GTO2;
END IF;
UPDATE GPOPERCLAS SET VALOR = CUENTA_GTO WHERE
EMPGRUPO_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPGRUPO(ABG_GPOPERCLAS_PKG.V_NUM) AND
EMP_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_EMPCOD(ABG_GPOPERCLAS_PKG.V_NUM) AND
GPOPER_COD = ABG_GPOPERCLAS_PKG.V_TABLA_TEMPORAL_GPOPER(ABG_GPOPERCLAS_PKG.V_NUM) AND
GACLATIP_COD = 'CUENTA_GTO';
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
--COMMIT;
END IF;
END;
/

1 Respuesta

Respuesta
1
Puedo imaginarme el proceso. El código que me pasas está básicamente bien (no tengo tus tablas ni SQL-Server), pero creo que es correcto. Es posible que el fallo esté en el modo de hacer las operaciones.
Corrígeme:
1.-Creas una tabla temporal.
2.-Le creas estos TRIGGERS
PEGA -> Se llaman igual y se sobreescribiran ¿es una errata? ("CURSO3". ABG_GPOPERCLAS_AR_TRG)
3.- Insertas datos en la tabla temporal.
4.- Updateas datos en la tabla temporal
5.- Metes los datos de la tabla temporal en la tabla ORIGINAL.
¿En qué paso te da el fallo?
¿O te falla el código del trigger?
Exite un truco para verificar los triggers. Ahora creo que ya hay herramientas adecuadas, pero antes...
Lo que tienes que hacer es quitar los triggers y en el código del programa (debuggeando linea por linea) después de un insert-update hacer (dos opciones):
a) Llamada a un procedimiento almacenado (con el código del trigger)y pasándole desde el programa los datos y parámetros.
b) Ir ejecutando una a una todas las sentencias de los trigger en el editor de consultas. Es muy costoso, pero te dará una idea de por donde falla.
Espero haberte ayudado, si veo algo más del código esta tarde te mandaré un emilio.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas