Ich stehe hier vor einem Problem und frage mich, ob es eine einfache Lösung gibt. Ich verwende den folgenden PL/SQL-Code. Das Ziel besteht darin, einen XML-Knoten zu durchlaufen und eine Tabelle mit dem Inhalt von allem zu aktualisieren, was zwischen dem Öffnen und Schließen dieses Knotens liegt. Dafür ist die Funktion gut geeignet.
Das Problem ist, dass ich eine riesige XML-Zeichenfolge verarbeiten möchte, mehr als 150.000 Zeilen und 6 Millionen Zeichen. und ich erhalte den Fehler „String literal too long", selbst wenn ein CLOB große Inhalte verarbeiten soll. Ich frage mich also, ob es trotzdem eine einfache Möglichkeit gibt, dies zu verarbeiten, oder ob dies eine andere Art von Einschränkung ist, die an anderer Stelle geändert werden kann?
DECLARE
v_XML_INPUT CLOB:= '<xmlString>';
v_COUNT NUMBER;
v_TOTAL_COUNT NUMBER;
v_XML_SECTION CLOB;
v_TEMPLATE_FULL_NAME VARCHAR2(128);
BEGIN
SELECT REGEXP_COUNT(v_XML_INPUT, '<templates>', 1) INTO v_TOTAL_COUNT FROM DUAL;
DBMS_OUTPUT.PUT_LINE(v_TOTAL_COUNT);
v_COUNT:= 1;
WHILE v_COUNT <= v_TOTAL_COUNT
LOOP
SELECT REGEXP_SUBSTR(v_XML_INPUT, '(\<templates\W)(.+?)(\</templates\W)',1,v_COUNT,'n') INTO v_XML_SECTION FROM DUAL;
SELECT
xt.TEMPLATE_FULL_NAME
INTO v_TEMPLATE_FULL_NAME
FROM XMLTABLE(
'/templates'
PASSING XMLType(v_XML_SECTION)
COLUMNS TEMPLATE_FULL_NAME VARCHAR2(128) PATH 'templateFullName'
) xt;
DBMS_OUTPUT.PUT_LINE(v_TEMPLATE_FULL_NAME);
UPDATE
TEMPLATES
SET
LAST_UPDATE = SYSDATE,
XML_TEMPLATE_SOURCE = v_XML_SECTION
WHERE TEMPLATE_FULL_NAME = v_TEMPLATE_FULL_NAME;
v_COUNT:= v_COUNT +1;
END LOOP;
COMMIT;
END;
Vielen Dank im Voraus für Ihren Einblick:-)
Lösung des Problems
Das Problem besteht darin, dass das XML, das Sie einfügen, zu groß ist, um in einem VARCHAR2 gespeichert zu werden. Wenn Sie es in den PL/SQL-Code einfügen, wird es in einem VARCHAR2 gespeichert, bevor es in ein CLOB konvertiert wird.
Anstatt dies zu tun (beachten Sie, dass das XML alles in einem Block ist):
DECLARE
v_XML_INPUT CLOB:= '<xml>
<subelement>
<subelement2>123</subelement2>
</subelement>
</xml>';
BEGIN
NULL;
END;
/
Versuchen Sie, die Zeilen des XML mit einem Texteditor in separate VARCHAR2-Blöcke aufzuteilen (sehr einfach mit Visual Studio Code), und verketten Sie sie dann, wenn Sie sie dem CLOB zuweisen:
DECLARE
v_XML_INPUT CLOB
:= '<xml>'
|| ' <subelement>'
|| ' <subelement2>123</subelement2>'
|| ' </subelement>'
|| '</xml>';
BEGIN
NULL;
END;
/
Keine Kommentare:
Kommentar veröffentlichen