Ich habe ein wenig gesucht und kann nicht ein ähnliches Szenario zu dem, was ich versuche, zu finden.Parsing nur gültige XML in Oracle Stored Procedure
Ich habe den folgenden Code, der zuerst einen Cursor erstellt, der mit 1) gefüllt wird xml 2) ID.
Dies funktioniert gut, bis eine fehlerhafte xml Zeile getroffen wird (in der zweiten SELECT Anweisung), dann bricht es die Prozedur ab und wird nicht fortgesetzt. Ich muss einen Weg finden, schlechtes XML in der zweiten Auswahlanweisung zu überspringen und den Cursor weiter zu bauen. Hier
ist der Code:
DECLARE
COUNTER NUMBER;
CURSOR CXD_ID_UPDATE IS
WITH
XMLDATA
AS
(
SELECT XMLTYPE(X.XMLDOC) XMLD, X.CXD_ID
FROM
C_XML_DOC X RIGHT OUTER JOIN CPS_POT P ON X.CXD_ID = P.CXD_ID
WHERE P.CXD_ID IS NOT NULL
)
SELECT XT.SCAN_DOC_ID AS SCAN_DOC_ID
,X.CXD_ID AS CXD_ID
FROM XMLDATA X, CPS_DOCUMENT DOC,
XMLTABLE('/HXML/BATCH/FOLDER/DOCUMENTS/DOCUMENT'
PASSING X.XMLD
COLUMNS SCAN_DOC_ID VARCHAR2(50) PATH '@ScanDocID') XT
WHERE REGEXP_LIKE(XT.SCAN_DOC_ID,'^\d+(\.\d+)?$', '')
AND XT.SCAN_DOC_ID = DOC.DOC_ID;
BEGIN
COUNTER := 0;
FOR REC IN CXD_ID_UPDATE
LOOP
BEGIN
UPDATE DOCUMENT SET CXD_ID = REC.CXD_ID WHERE DOC_ID = REC.SCAN_DOC_ID ;
COUNTER := COUNTER + 1;
EXCEPTION WHEN OTHERS THEN
CONTINUE;
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('UPDATED: ' || COUNTER || ' DOCUMENTS');
END;
ist es möglich, die Daten für uns in Ihrem Code zu füllen, damit wir Ihr Problem reproduzieren können? Ersetzen Sie Ihre 'SELECT FROM (meine Tabellen)' durch 'SELECT 'code1', 'value1' FROM DUAL union alle SELECT 'code2', 'value2' FROM DUAL ...' –
Bitte definieren Sie, was Sie mit _bad xml_ bedeuten. Speichern Sie XML als Text in einer Datenbanktabellenspalte (z. B. varchar2 oder clob-Spalte)? Können Sie erzwingen, dass nur "gültiges" XML in die Tabelle eingefügt wird? – user272735
XML ist in einer Clob-Spalte und nein, wir haben nicht die Kontrolle über einige der XML, die in die Tabelle kommen, so dass wir nur "gültiges" XML erzwingen können. Wenn ich schlechtes XML sage, kann ich nicht korrekt geparst werden. –