Re: error handling using stored procedure
From: Jorge Reyes <jorg_reyes_at_hotmail.com>
Date: Tue, 21 Apr 2009 14:25:44 -0700 (PDT)
Message-ID: <27079b56-2821-4cd6-ad18-270a9661e16b_at_l28g2000vba.googlegroups.com>
On 21 abr, 15:46, Jorge Reyes <jorg_re..._at_hotmail.com> wrote:
> On 21 abr, 15:21, Mladen Gogala <mla..._at_bogus.email.com> wrote:
>
>
>
>
>
> > On Tue, 21 Apr 2009 10:38:16 -0700, Jorge Reyes wrote:
> > > Hello everyone,
>
> > > Question: Is it possible to catch the error of duplicate key using an
> > > "insert into table select ...." inside of an stored procedure?
>
> > Yes.
>
> > > Target: Execute my stored procedure each 15 minutes and insert all the
> > > non-duplicate records from a source table, and if its possible, the
> > > values of the duplicate records SUM with the existing values.
>
> > MERGE statement would be faster than a stored procedure for that
> > purpose.
>
> > > 12:29:41.081 DBMS nmsnoc-db -- Error: PLS-00103: Encountered the
> > symbol
> > > "EXCEPTION" when expecting one of the following: 12:29:41.143 DBMS
> > > nmsnoc-db -- begin case declare end exit for goto if loop mod null
>
> > You have a syntax error, that's all.
>
> > --http://mgogala.freehostia.com
>
> 1. So there are no problem with using EXCEPTION inside of an Store
> Procedure?
> 2. What's about the second option? is it possible to implement inside
> of an Store Proc?
>
> Thanks in advanced- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -
END IF; dbms_output.put_line('Fin de procedimiento: ' || TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS'));
END PR_MAKE_CDRS_VALIDOS_1; Received on Tue Apr 21 2009 - 16:25:44 CDT
Date: Tue, 21 Apr 2009 14:25:44 -0700 (PDT)
Message-ID: <27079b56-2821-4cd6-ad18-270a9661e16b_at_l28g2000vba.googlegroups.com>
On 21 abr, 15:46, Jorge Reyes <jorg_re..._at_hotmail.com> wrote:
> On 21 abr, 15:21, Mladen Gogala <mla..._at_bogus.email.com> wrote:
>
>
>
>
>
> > On Tue, 21 Apr 2009 10:38:16 -0700, Jorge Reyes wrote:
> > > Hello everyone,
>
> > > Question: Is it possible to catch the error of duplicate key using an
> > > "insert into table select ...." inside of an stored procedure?
>
> > Yes.
>
> > > Target: Execute my stored procedure each 15 minutes and insert all the
> > > non-duplicate records from a source table, and if its possible, the
> > > values of the duplicate records SUM with the existing values.
>
> > MERGE statement would be faster than a stored procedure for that
> > purpose.
>
> > > 12:29:41.081 DBMS nmsnoc-db -- Error: PLS-00103: Encountered the
> > symbol
> > > "EXCEPTION" when expecting one of the following: 12:29:41.143 DBMS
> > > nmsnoc-db -- begin case declare end exit for goto if loop mod null
>
> > You have a syntax error, that's all.
>
> > --http://mgogala.freehostia.com
>
> 1. So there are no problem with using EXCEPTION inside of an Store
> Procedure?
> 2. What's about the second option? is it possible to implement inside
> of an Store Proc?
>
> Thanks in advanced- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -
Sorry!! i have this new issue...
Using MERGE i receive this errors:
16:23:09.149 DBMS nmsnoc-db -- Error: ORA-00923: FROM keyword not
found where expected
16:23:09.211 DBMS nmsnoc-db -- ORA-06512: at
"OM_DB.PR_MAKE_CDRS_VALIDOS_1", line 56
16:23:09.274 DBMS nmsnoc-db -- ORA-06512: at line 1, Batch 1 Line 1
Col 1
this is my whole code:
CREATE OR REPLACE PROCEDURE OM_DB.PR_MAKE_CDRS_VALIDOS_1 IS
vPMM_DATETIME TIMESTAMP(3); vMAX_PMM_DATETIME TIMESTAMP(3); vEND_DATETIME TIMESTAMP(3); v_rows_processed INT; count_violated INT;
BEGIN
dbms_output.enable(40000);
dbms_output.put_line('Inicio de procedimiento: ' || TO_CHAR
(sysdate, 'YYYY-MM-DD HH24:MI:SS'));
- Valida si existe informacion en la tabla de origen
--
count_violated := 0; SELECT COUNT(START_TIME) INTO count_violated FROM OM_DB.CDRS_PRUEBA; IF (count_violated=0) THEN dbms_output.put_line('No hay informacion en la tabla de origen'); ELSE SELECT TO_DATE(TO_CHAR(MIN(START_TIME),'YYYY-MM-DD HH24') || ': 00:00','YYYY-MM-DD HH24:MI:SS') INTO vPMM_DATETIME FROM OM_DB.CDRS_PRUEBA;
SELECT TO_DATE(TO_CHAR(MAX(START_TIME),'YYYY-MM-DD HH24') || ': 59:59','YYYY-MM-DD HH24:MI:SS')
INTO vMAX_PMM_DATETIME FROM om_db.CDRS_PRUEBA; WHILE (vPMM_DATETIME <= vMAX_PMM_DATETIME) LOOP MERGE INTO OM_DB.CDRS_VALIDOS X USING ( SELECT COALESCE(V_EXITOSOS.ESTADO, V_NO_EXITOSOS.ESTADO, V_NO_CONECT.ESTADO) AS ESTADO, COALESCE(V_EXITOSOS.MUNICIPIO, V_NO_EXITOSOS.MUNICIPIO, V_NO_CONECT.MUNICIPIO) AS MUNICIPIO, COALESCE(V_EXITOSOS.CALL_SOURCE_REGID,V_NO_EXITOSOS.CALL_SOURCE_REGID, V_NO_CONECT.CALL_SOURCE_REGID) AS CALL_SOURCE_REGID,
COALESCE(V_EXITOSOS.EXITOSOS,0) AS EXITOSOS, COALESCE(V_NO_EXITOSOS.NO_EXITOSOS,0) AS NO_EXITOSOS, COALESCE(V_NO_CONECT.NO_CONECT,0) AS NO_CONECT, vPMM_DATETIME AS PMM_DATETIME FROM ( SELECT DISTINCT(ESTADO) AS ESTADO, MUNICIPIO, CALL_SOURCE_REGID, COUNT(CALL_SOURCE_REGID) AS EXITOSOS FROM ( SELECT A.CALL_SOURCE_REGID, B.ESTADO, B.MUNICIPIO FROM OM_DB.CDRS_PRUEBA A, OM_DB.COFETEL B WHERE A.START_TIME BETWEEN vPMM_DATETIME AND vEND_DATETIME AND TO_NUMBER (A.CALLED_PARTY_ON_DEST_PART3) between B.NIR_INICIAL AND B.NIR_FINAL AND A.CALL_DURATION_INT >= 5 AND B.MODALIDAD IN ('CPP','FIJO','MPP') ) GROUP BY ESTADO, MUNICIPIO, CALL_SOURCE_REGID ) V_EXITOSOS FULL OUTER JOIN ( SELECT DISTINCT(ESTADO) AS ESTADO, MUNICIPIO, CALL_SOURCE_REGID, COUNT(CALL_SOURCE_REGID) AS NO_EXITOSOS FROM ( SELECT C.CALL_SOURCE_REGID, D.ESTADO, D.MUNICIPIO FROM OM_DB.CDRS_PRUEBA C, OM_DB.COFETEL D WHERE C.START_TIME BETWEEN vPMM_DATETIME AND vEND_DATETIME AND TO_NUMBER (C.CALLED_PARTY_ON_DEST_PART3) between D.NIR_INICIAL AND D.NIR_FINAL AND C.CALL_DURATION_INT >= 1 AND C.CALL_DURATION_INT < 5 AND D.MODALIDAD IN ('CPP','FIJO','MPP') ) GROUP BY ESTADO, MUNICIPIO, CALL_SOURCE_REGID ) V_NO_EXITOSOS ON V_EXITOSOS.ESTADO = V_NO_EXITOSOS.ESTADO AND V_EXITOSOS.MUNICIPIO = V_NO_EXITOSOS.MUNICIPIO AND V_EXITOSOS.CALL_SOURCE_REGID = V_NO_EXITOSOS.CALL_SOURCE_REGID FULL OUTER JOIN ( SELECT DISTINCT(ESTADO) AS ESTADO, MUNICIPIO, CALL_SOURCE_REGID, COUNT(CALL_SOURCE_REGID) AS NO_CONECT FROM ( SELECT C.CALL_SOURCE_REGID, D.ESTADO, D.MUNICIPIO FROM OM_DB.CDRS_PRUEBA C, OM_DB.COFETEL D WHERE C.START_TIME BETWEEN vPMM_DATETIME AND vEND_DATETIME AND TO_NUMBER (C.CALLED_PARTY_ON_DEST_PART3) between D.NIR_INICIAL AND D.NIR_FINAL AND C.CALL_DURATION_INT = 0 AND D.MODALIDAD IN ('CPP','FIJO','MPP') ) GROUP BY ESTADO, MUNICIPIO, CALL_SOURCE_REGID ) V_NO_CONECT ON V_NO_CONECT.ESTADO = V_EXITOSOS.ESTADO AND V_NO_CONECT.MUNICIPIO = V_EXITOSOS.MUNICIPIO AND V_NO_CONECT.CALL_SOURCE_REGID = V_EXITOSOS.CALL_SOURCE_REGID ) Y -- Cierra USING ON ( X.PMM_DATETIME = Y.PMM_DATETIME AND X.CALL_SOURCE_REGID = Y.CALL_SOURCE_REGID AND X.ESTADO = Y.ESTADO AND X.MUNICIPIO = Y.MUNICIPIO ) WHEN MATCHED THEN UPDATE SET X.EXITOSOS = X.EXITOSOS + Y.EXITOSOS, X.NO_EXITOSOS = X.NO_EXITOSOS + Y.NO_EXITOSOS, X.NO_CONECT = X.NO_CONECT + Y.NO_CONECT WHEN NOT MATCHED THEN INSERT (X.ESTADO, X.MUNICIPIO,X.CALL_SOURCE_REGID, X.EXITOSOS, X.NO_EXITOSOS, X.NO_CONECT, X.PMM_DATETIME)
VALUES (Y.ESTADO, Y.MUNICIPIO,Y.CALL_SOURCE_REGID, Y.EXITOSOS, Y.NO_EXITOSOS, Y.NO_CONECT, Y.PMM_DATETIME);
vPMM_DATETIME := vPMM_DATETIME + 1/24; vEND_DATETIME := vPMM_DATETIME + 1/24; END LOOP; COMMIT;
END IF; dbms_output.put_line('Fin de procedimiento: ' || TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS'));
END PR_MAKE_CDRS_VALIDOS_1; Received on Tue Apr 21 2009 - 16:25:44 CDT