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!

ORA-21700 in Oracle 12c

3150374May 4 2017 — edited May 5 2017

Hi there,

The procedure below is part of a package. The error raises esporadically, I can't reproduce it (or at least not yet).

This procedure is called from another procedure in the same package. I can't figure out what is wrong, there is no extremely weird stuff, and the loop I use is already used in around 20 other procedures exactly like this. Those procedures never raise this error.

I would be glad if you were so kind as to point me what I could try [to raise the error], or where should I look. Everything here is in the same schema.

PROCEDURE ZALE_KOPF_AUS_VER_REL( nVER_REL_ID IN VER_REL.VER_REL_ID%TYPE, sMKZ IN VARCHAR2, nERRORLOG_ID IN OUT ERRORLOG.ERRORLOG_ID%TYPE )

AS

vVR VER_REL%ROWTYPE;

vZK ZALE_KOPF%ROWTYPE;

nVER_LGRVER_ID ZALE_KOPF.VER_LGRVER_ID%TYPE;

nZALE_TYP ZALE_KOPF.ZALE_TYP%TYPE;

bResult BOOLEAN;

CURSOR curVR IS SELECT *

                  FROM VER_REL

                 WHERE VER_REL_ID = nVER_REL_ID;

CURSOR curZT IS SELECT DISTINCT VER_LGRVER_ID, ZALE_TYP

                  FROM ZALE_KOPF k

                 WHERE k.VER_LGRVER_ID IN (SELECT VER_LGRVER_ID FROM VER_LGRVER WHERE VER_ID = vVR.VER_ID)

                   AND k.ZALE_TYP BETWEEN 1 AND (CASE WHEN vVR.STA_ID = 63 THEN 59 ELSE 39 END)

                   AND NVL(k.DELETED, 0) = 0;

CURSOR curKP IS SELECT *

                  FROM ZALE_KOPF k

                 WHERE k.VER_LGRVER_ID = nVER_LGRVER_ID

                   AND k.ZALE_TYP = nZALE_TYP

                   AND NVL(k.ZALE_BETRAG, 0) != 0

                   AND k.ZALE_VON >= vVR.STA_GUELTIG_AB

--                   AND k.ZALE_BIS >= vVR.STA_GUELTIG_AB

                   AND NVL(k.ZALE_ZAHLWEISE, 0) != 0

                   AND NVL(k.DELETED, 0) = 0

                   AND NOT EXISTS( SELECT 1

                                     FROM ZALE_KOPF

                                    WHERE VER_LGRVER_ID = k.VER_LGRVER_ID

                                      AND ZALE_TYP = k.ZALE_TYP

                                      AND NVL(ZALE_BETRAG, 0) = 0

                                      AND NVL(ZALE_ZAHLWEISE, 0) != 0

                                      AND NVL(DELETED, 0) = 0

                                      AND ZALE_VON = vVR.STA_GUELTIG_AB

                                      AND ZALE_BIS = vVR.STA_GUELTIG_BIS )

              ORDER BY k.ZALE_BIS DESC;

CURSOR curKN IS SELECT *

                  FROM ZALE_KOPF k

                 WHERE k.VER_LGRVER_ID = nVER_LGRVER_ID

                   AND k.ZALE_TYP = nZALE_TYP

                   AND NVL(k.ZALE_BETRAG, 0) != 0

                   AND k.ZALE_BIS <= vVR.STA_GUELTIG_BIS

--                   AND k.ZALE_VON <= vVR.STA_GUELTIG_BIS

                   AND NVL(k.ZALE_ZAHLWEISE, 0) != 0

                   AND NVL(k.DELETED, 0) = 0

                   AND NOT EXISTS( SELECT 1

                                     FROM ZALE_KOPF

                                    WHERE VER_LGRVER_ID = k.VER_LGRVER_ID

                                      AND ZALE_TYP = k.ZALE_TYP

                                      AND NVL(ZALE_BETRAG, 0) = 0

                                      AND NVL(ZALE_ZAHLWEISE, 0) != 0

                                      AND NVL(DELETED, 0) = 0

                                      AND ZALE_VON = vVR.STA_GUELTIG_AB

                                      AND ZALE_BIS = vVR.STA_GUELTIG_BIS )

              ORDER BY k.ZALE_BIS DESC;

CURSOR curKU IS SELECT *

                  FROM ZALE_KOPF k

                 WHERE k.VER_LGRVER_ID = nVER_LGRVER_ID

                   AND k.ZALE_TYP = nZALE_TYP

                   AND NVL(k.ZALE_BETRAG, 0) != 0

                   AND k.ZALE_VON <= vVR.STA_GUELTIG_AB

                   AND k.ZALE_BIS >= vVR.STA_GUELTIG_BIS

--                   AND k.ZALE_VON >= vVR.STA_GUELTIG_AB

--                   AND k.ZALE_BIS <= vVR.STA_GUELTIG_BIS

                   AND NVL(k.ZALE_ZAHLWEISE, 0) != 0

                   AND NVL(k.DELETED, 0) = 0

                   AND NOT EXISTS( SELECT 1

                                     FROM ZALE_KOPF

                                    WHERE VER_LGRVER_ID = k.VER_LGRVER_ID

                                      AND ZALE_TYP = k.ZALE_TYP

                                      AND NVL(ZALE_BETRAG, 0) = 0

                                      AND NVL(ZALE_ZAHLWEISE, 0) != 0

                                      AND NVL(DELETED, 0) = 0

                                      AND ZALE_VON = vVR.STA_GUELTIG_AB

                                      AND ZALE_BIS = vVR.STA_GUELTIG_BIS )

              ORDER BY k.ZALE_BIS DESC;

--XML VARIABLES

sTABLE VARCHAR2(50) := 'ZALE_KOPF';

sXML VARCHAR2(32000) := '';

sVALUE VARCHAR2(4000) := NULL;

nVALUE NUMBER := NULL;

dVALUE DATE := NULL;

sSqlCommand VARCHAR2(32000) := NULL;

sCR_LF VARCHAR2(10) := CHR(13) || CHR(10);

vDTC DBA_TAB_COLUMNS%ROWTYPE;

CURSOR curP IS SELECT * FROM DBA_TAB_COLUMNS WHERE OWNER = 'XADMIN' AND TABLE_NAME = sTABLE ORDER BY COLUMN_ID;

BEGIN

    -- VER_REL Eintrag laden

    OPEN curVR;

    FETCH curVR INTO vVR;

    IF curVR%FOUND THEN

        -- Vorhandene Zale-Typen (nach VER_LGRVER_ID getrennt) dieser Versorgung durchlaufen

        OPEN curZT;

        LOOP

            FETCH curZT INTO nVER_LGRVER_ID, nZALE_TYP;

            EXIT WHEN curZT%NOTFOUND;

            -- Für jede Runde wird nERRORLOG_ID zurückgesetzt, um alle aufgetretenen Fehler zu protokollieren.

            nERRORLOG_ID := 0;

           

            -- Es wird versucht, ein ZALE_KOPF-Eintrag zu laden, um ihn als Vorlage für den 0-Betrag Eintrag zu nutzen.

            -- Zuerst wo ZALE_VON größer STA_GUELTIG_AB ist

            OPEN curKP;

            FETCH curKP INTO vZK;

            bResult := curKP%FOUND;

            CLOSE curKP;

           

            IF bResult = FALSE THEN

                -- Wenn nicht gefunden, dann wo ZALE_BIS kleiner STA_GUELTIG_BIS ist

                OPEN curKN;

                FETCH curKN INTO vZK;

                bResult := curKN%FOUND;

                CLOSE curKN;

            END IF;

           

            IF bResult = FALSE THEN

                -- Wenn auch nicht gefunden, dann wo ZALE_VON kleiner STA_GUELTIG_AB und ZALE_BIS größer STA_GUELTIG_BIS sind

                OPEN curKU;

                FETCH curKU INTO vZK;

                bResult := curKU%FOUND;

                CLOSE curKU;

            END IF;

           

            -- Wurde eine Vorlage gefunden?

            IF bResult = TRUE THEN

                -- Dann die neuen Werte setzen

                vZK.ZALE_KOPF_ID := -1;

                IF WEB_VER_REL_STA_NULL_BETRAG(vVR.STA_ID) > 0 THEN

                    vZK.ZALE_BETRAG := 0;

                END IF;

               

                vZK.ZALE_VON := vVR.STA_GUELTIG_AB;

                vZK.ZALE_AR_AB := vVR.STA_GUELTIG_AB;

                vZK.ZALE_BIS := vVR.STA_GUELTIG_BIS;

               

                vZK.TS := SYSDATE;

                vZK.MKZ := sMKZ;

               

                vZK.ZALE_AUSGESETZT := 0;

                vZK.ZALE_KOPF_ID_PREV := NULL;

                vZK.ZALE_KOPF_ID_NEXT := NULL;

               

                sXML := '<DataSet>';

                -- Row to XML

                sXML := sXML || sCR_LF || '<' || sTABLE;

               

                -- Tabellenobjekt um XML umwandeln. Hier werden alle Spalten von der DBA_TAB_COLUMNS Tabelle geholt und damit wird das XML gebaut.

                OPEN curP;

                LOOP

                    FETCH curP INTO vDTC;

                    EXIT WHEN curP%NOTFOUND;

                   

                    sSqlCommand := '

                        DECLARE

                            rType ' || sTABLE || '%ROWTYPE;

                        BEGIN

                                    

                            rType := :iIN;

                                       

                            :oOUT := rType.' || vDTC.COLUMN_NAME || ';

                        END;

                    ';

                   

                    -- Abhängig vom Typ wird der Wert ermittelt und gesetzt

                    IF vDTC.DATA_TYPE = 'NUMBER' THEN

                        EXECUTE IMMEDIATE sSqlCommand USING IN vZK, OUT nVALUE;

                       

                        sXML := sXML || ' ' || vDTC.COLUMN_NAME || '="' || NVL(TO_CHAR(nVALUE), '') || '"';

                    ELSIF vDTC.DATA_TYPE = 'DATE' THEN

                        EXECUTE IMMEDIATE sSqlCommand USING IN vZK, OUT dVALUE;

                       

                        sXML := sXML || ' ' || vDTC.COLUMN_NAME || '="' || NVL(TO_CHAR(dVALUE, 'DD.MM.YYYY hh:mm:ss'), '') || '"';

                    ELSE

                        EXECUTE IMMEDIATE sSqlCommand USING IN vZK, OUT sVALUE;

                       

                        sXML := sXML || ' ' || vDTC.COLUMN_NAME || '="' || USR_FORMAT_STRING_FOR_XML(NVL(sVALUE, '')) || '"';

                    END IF;

                END LOOP;

                CLOSE curP;

                sXML := sXML || ' />' || sCR_LF || '</DataSet>';

                DBMS_OUTPUT.PUT_LINE(sXML);

                -- Erst mit dem XML schon fertig kann die echte Prozedur ausgeführt werden.

                MANAGE_ZALE_KOPF( vZK.ZALE_KOPF_ID, sXML, sMKZ, nERRORLOG_ID );

            END IF;

        END LOOP;

        CLOSE curZT;

    END IF;

    CLOSE curVR;

EXCEPTION WHEN OTHERS THEN

    ROLLBACK;

    LOG_ERROR(1, 'ZALE_KOPF_AUS_VER_REL', 'ZALE_KOPF_AUS_VER_REL', SUBSTR(SQLERRM, 1, 2000), nERRORLOG_ID);

END;

Thanks in advance,

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 2 2017
Added on May 4 2017
21 comments
1,403 views