2016-05-31 19 views
0

Wir möchten ein XML erstellen. Der aktuelle Code bewirkt, dass jeweils ein XML-Tag an eine VARCHAR2 Variable angehängt wird.Verwenden von CLOB anstelle von VARCHAR2

xmlString     VARCHAR2(32767); 
.... 
.... 
xmlString := xmlString || '<' || elementName || '>' || elementValue || '</' || elementName || '>'; 

jedoch aufgrund von Größenbegrenzung von 32767 Zeichen auf VARCHAR2, erhalten wir die folgenden Fehler für eine sehr lange XML.

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

Die Lösung, die wir haben, ist eine CLOB zu erklären und ein Verfahren zu schreiben, die VARCHAR2 Variable auf den CLOB zu halten Spülung.

v_result     clob; 
..... 
..... 
IF xmlString IS NOT NULL THEN 
     dbms_lob.writeappend(v_result, LENGTH(xmlString), xmlString); 
     xmlString := NULL; 
END IF; 

Dies würde jedoch erfordern ersetzen viele ausgehende Codezeilen mit Aufrufen der neuen Funktion. Gibt es einen besseren Weg, dies zu tun?

Alles ähnlich dem Überladen von Operatoren in PLSQL? Kann ich den Datentyp xmlString Variable zu CLOB ändern und den Operator || die Arbeit von dbms_lob.writeappend ausführen lassen?

Antwort

4

Ja, wenn Sie den Datentyp xmlString in clob ändern, wird der Operator für die Kettenverkettung weiter funktionieren.

Der Aufbau von XML auf diese Weise wäre jedoch eine sehr schlechte Architektur. Das ist die Art von Architektur, die eine hohe Wahrscheinlichkeit hat, ungültiges XML zu erzeugen, wenn zum Beispiel eine der Zeichenfolgen ein Zeichen hat, das maskiert werden muss (oder aus verschiedenen Gründen). Oracle bietet eine ganze Reihe von Funktionen zum Generieren von XML (XMLElement, XMLForest, SYS_XMLGen, DBMS_XMLQuery usw., abhängig von Ihrem Anwendungsfall). Es wäre architektonisch viel besser, diese eingebauten Funktionen zu verwenden.

Verwandte Themen