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,