Использование 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 и т. Д. В зависимости от вашего варианта использования). Было бы намного лучше архитектурно использовать эти встроенные функции.

Другие вопросы по тегам