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 -

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;
        vEND_DATETIME := vPMM_DATETIME + 1/24;

        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

Original text of this message