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;
/
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 de jmorras
1