Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

how to handle ORA-02291

chijarJun 20 2008 — edited Aug 18 2008
dear all.
i want to know how i can handle the ORA-0229: integity constraint - parent key not found.

i want to insert records in a table from another, and the records that not have parent key store in another table.

my plsql code handle some exceptions and "others" too but it not is function and i have to... i put an IF THEN ELSE (and here i put the insert to records that not have parent key but presents de ORA-02291 error)

********************************************************
DECLARE
VNUM_PAQ NUMBER;
v_code NUMBER;
v_errm VARCHAR2(64);
cuentareg NUMBER:=0;
CURSOR C1
IS
SELECT
"num_paq",
"formulario",
-- tabla 3, ojo cambio tip dato de int a char
--"cod_docide_dec",
DECODE("cod_docide_dec",6,'09',1,'01',4,'06',7,'08',11,'04',NULL,'15','-','15',"cod_docide_dec") AS ccod_docide_dec,
"num_docide_dec",
"norden",
"num_correl_a",
"periodo",
-- tabla 3, ojo cambio tip dato de int a char
--"cod_docide_aseg",
"num_docide_aseg",
DECODE("cod_docide_aseg",6,'09',1,'01',4,'06',7,'08',11,'04',NULL,'15','-','15',"cod_docide_aseg") AS ccod_docide_aseg,
"num_ruc",
"des_centro",
TRUNC(TO_NUMBER(TRIM("num_tasa"),'9999999999.9999'),2) AS cnum_tasa,
"num_correl_centro",
"num_correl_tasa"
FROM planelec.t3500f601sctro@ORAAPOLO.REGRESS.RDBMS.DEV.US.ORACLE.COM;
--WHERE rownum<10;
BEGIN
FOR cur1 IN c1 LOOP
cuentareg:=cuentareg+1;
--SELECT PARA ENCONTRAR SI EXISTE EL REG EN REMUNERACION
SELECT COUNT(*) INTO VNUM_PAQ
FROM PLANELEC.PEMVX_REMUNERACION DAP
WHERE cur1."num_paq"=DAP.V_NUMPAQTE
AND cur1."formulario"=DAP.V_NUMFORM
AND cur1.ccod_docide_dec=DAP.V_CODDOCIDE
AND cur1."num_docide_dec"=DAP.V_NUMDOCIDE
AND cur1."norden"=DAP.N_NUMORDEN
AND cur1."num_correl_a"=DAP.N_NUMCORAPO
AND cur1."periodo"=DAP.V_NUMPERIOD;

-- FIN DE SELECT

IF (VNUM_PAQ>0) THEN
BEGIN
INSERT INTO PLANELEC.PEMVX_SEGCOMPTRAB (
V_NUMPAQTE,
V_NUMFORM,
V_CODDOCIDE,
V_NUMDOCIDE,
N_NUMORDEN,
N_NUMCORAPO,
V_NUMPERIOD,
V_NUMDOCAPO,
V_CODDOCAPO,
V_RUCCENTRO,
V_NOMCENTRO,
N_NUMTASA,
N_CORRELCR,
N_CORRELTSA,
N_CODCATEGO
)
VALUES (
cur1."num_paq",
cur1."formulario",
cur1.ccod_docide_dec,
cur1."num_docide_dec",
cur1."norden",
cur1."num_correl_a",
cur1."periodo",
cur1."num_docide_aseg",
cur1.ccod_docide_aseg,
cur1."num_ruc",
cur1."des_centro",
cur1.cnum_tasa,
cur1."num_correl_centro",
cur1."num_correl_tasa",
1
);
--COMMIT;
EXCEPTION
WHEN dup_val_on_index THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM,1,300);
INSERT INTO PLANELEC.T3500_EXCEP (
V_NUMPAQTE,
V_NUMFORM,
V_CODDOCIDE,
V_NUMDOCIDE,
N_NUMORDEN,
N_NUMCORAPO,
V_NUMPERIOD,
V_NUMDOCAPO,
V_CODDOCAPO,
CODIGO_ERROR,
DESCRIPCION_ERROR
)
VALUES ( cur1."num_paq",
cur1."formulario",
cur1.ccod_docide_dec,
cur1."num_docide_dec",
cur1."norden",
cur1."num_correl_a",
cur1."periodo",
cur1.ccod_docide_aseg,
cur1."num_docide_aseg",
v_code,
v_errm
);
WHEN VALUE_ERROR THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM,1,300);
INSERT INTO PLANELEC.T3500_EXCEP (
V_NUMPAQTE,
V_NUMFORM,
V_CODDOCIDE,
V_NUMDOCIDE,
N_NUMORDEN,
N_NUMCORAPO,
V_NUMPERIOD,
V_NUMDOCAPO,
V_CODDOCAPO,
CODIGO_ERROR,
DESCRIPCION_ERROR
)
VALUES ( cur1."num_paq",
cur1."formulario",
cur1.ccod_docide_dec,
cur1."num_docide_dec",
cur1."norden",
cur1."num_correl_a",
cur1."periodo",
cur1.ccod_docide_aseg,
cur1."num_docide_aseg",
v_code,
v_errm
);
WHEN NO_DATA_FOUND THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM,1,300);
INSERT INTO PLANELEC.T3500_EXCEP (
V_NUMPAQTE,
V_NUMFORM,
V_CODDOCIDE,
V_NUMDOCIDE,
N_NUMORDEN,
N_NUMCORAPO,
V_NUMPERIOD,
V_NUMDOCAPO,
V_CODDOCAPO,
CODIGO_ERROR,
DESCRIPCION_ERROR
)
VALUES ( cur1."num_paq",
cur1."formulario",
cur1.ccod_docide_dec,
cur1."num_docide_dec",
cur1."norden",
cur1."num_correl_a",
cur1."periodo",
cur1.ccod_docide_aseg,
cur1."num_docide_aseg",
v_code,
v_errm
);
WHEN INVALID_NUMBER THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM,1,300);
INSERT INTO PLANELEC.T3500_EXCEP (
V_NUMPAQTE,
V_NUMFORM,
V_CODDOCIDE,
V_NUMDOCIDE,
N_NUMORDEN,
N_NUMCORAPO,
V_NUMPERIOD,
V_NUMDOCAPO,
V_CODDOCAPO,
CODIGO_ERROR,
DESCRIPCION_ERROR
)
VALUES ( cur1."num_paq",
cur1."formulario",
cur1.ccod_docide_dec,
cur1."num_docide_dec",
cur1."norden",
cur1."num_correl_a",
cur1."periodo",
cur1.ccod_docide_aseg,
cur1."num_docide_aseg",
v_code,
v_errm
);
WHEN OTHERS THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM,1,300);
INSERT INTO PLANELEC.T3500_EXCEP (
V_NUMPAQTE,
V_NUMFORM,
V_CODDOCIDE,
V_NUMDOCIDE,
N_NUMORDEN,
N_NUMCORAPO,
V_NUMPERIOD,
V_NUMDOCAPO,
V_CODDOCAPO,
CODIGO_ERROR,
DESCRIPCION_ERROR
)
VALUES ( cur1."num_paq",
cur1."formulario",
cur1.ccod_docide_dec,
cur1."num_docide_dec",
cur1."norden",
cur1."num_correl_a",
cur1."periodo",
cur1.ccod_docide_aseg,
cur1."num_docide_aseg",
v_code,
v_errm
);
IF cuentareg=50000 THEN
COMMIT;
cuentareg:=0;
DBMS_OUTPUT.PUT_LINE('HIZO COMMMIT');
END IF;
END;
ELSE -- SI NO ENCUENTRA EL REG EN REMUNERACION
INSERT INTO PLANELEC.T3500_EXCEP (
V_NUMPAQTE,
V_NUMFORM,
V_CODDOCIDE,
V_NUMDOCIDE,
N_NUMORDEN,
N_NUMCORAPO,
V_NUMPERIOD,
-- ya no son llave
V_NUMDOCAPO,
V_CODDOCAPO,
CODIGO_ERROR,
DESCRIPCION_ERROR
)
VALUES ( cur1."num_paq",
cur1."formulario",
cur1.ccod_docide_dec,
cur1."num_docide_dec",
cur1."norden",
cur1."num_correl_a",
cur1."periodo",
-- no son llave
cur1."num_docide_aseg",
cur1.ccod_docide_aseg,
v_code,
v_errm
);
END IF;-- DEL IF Q VERIFICAR SI HAY REG EN REMUNERACION
END LOOP;
COMMIT;
END;
/

********************************************************

Please help me... thre is a way to handle the ORA-02291 erro

ORacle 10g r2
RHEL AS v5 64bits.

thanks a lot
cesar
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 15 2008
Added on Jun 20 2008
5 comments
4,214 views