Использование CLOB вместо VARCHAR2
Мы хотим создать XML. Текущий код делает это, добавляя один тег XML за раз к VARCHAR2
переменная.
xmlString VARCHAR2(32767);
....
....
xmlString := xmlString || '<' || elementName || '>' || elementValue || '</' || elementName || '>';
Однако из-за ограничения размера 32767 символов на VARCHAR2
мы получаем следующую ошибку для очень длинного XML.
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Решение, которое мы имеем, состоит в том, чтобы объявить CLOB
и написать процедуру, чтобы продолжать промывать VARCHAR2
переменная к CLOB
,
v_result clob;
.....
.....
IF xmlString IS NOT NULL THEN
dbms_lob.writeappend( v_result, LENGTH(xmlString), xmlString);
xmlString := NULL;
END IF;
Однако для этого потребуется заменить множество выходящих строк кода вызовами новой функции. Есть лучший способ сделать это?
Что-нибудь похожее на перегрузку операторов в PLSQL? Могу ли я изменить тип данных xmlString
переменная в CLOB и сделать ||
оператор, чтобы сделать работу dbms_lob.writeappend
?
1 ответ
Да, если вы измените тип данных xmlString
в clob
оператор конкатенации строк продолжит работать.
Однако построение XML таким способом было бы очень плохой архитектурой. Это такая архитектура, которая имеет высокую вероятность генерирования неверного XML, когда, например, одна из строк имеет символ, который необходимо экранировать (или по любой другой причине). Oracle предоставляет целый набор функций для генерации XML ( XMLElement, XMLForest, SYS_XMLGen, DBMS_XMLQuery и т. Д. В зависимости от вашего варианта использования). Было бы намного лучше архитектурно использовать эти встроенные функции.