Как изменить набор символов переменной XMLTYPE? - PullRequest
3 голосов
/ 28 марта 2012

В настоящее время у меня есть база данных не-utf-8, но мне нужно создать переменную XMLType с кодировкой utf-8.У меня есть обходной путь, но, похоже, ошибка в Oracle, см. Следующую ссылку: https://forums.oracle.com/forums/thread.jspa?messageID=10238641

... и ошибка поддержки Oracle: 7698684

Ошибка вызывает случайное

ORA-1482: unsupported character set
ORA-6512: at "SYS.XMLTYPE", line 107

Прежде всего, я получаю XMLType с пакетом dbms_xmlgen.Этот XMLType кодируется набором символов БД.

Чтобы преобразовать его в набор символов utf-8, я делаю это так:

  • Я преобразую переменную XMLType в переменную BLOB с помощью метода getBlobVal, используя NLS_CHARSET_ID ('UTF8') в качестве параметра
  • Я преобразую переменную BLOB обратно в XMLType с помощью метода конструктора XMLType, используя переменную BLOB в качестве первого параметра и NLS_CHARSET_ID ('UTF8') в качестве второго параметра. Это вызывает случайную ошибку: (

Кто-нибудь знает альтернативное решение для этого?

  l_xml   := dbms_xmlgen.getXMLType(l_ctx);
  l_xml_b := l_xml.getBlobVal(C_UTF8_CHARSET_ID);
  l_xml   := XMLType(l_xml_b, C_UTF8_CHARSET_ID);

1 Ответ

0 голосов
/ 04 апреля 2012

Мне удалось сделать это с помощью функции convert.Было невозможно преобразовать весь XML-документ (даже его значение Clob), но только значения элементов.

Это не сработало (конструктор XMLType не работает):

l_xml := XMLType(convert(l_xml.getClobVal, 'UTF8'));

Так что япришлось поместить команду convert в строку запроса (это всего лишь пример):

select dbms_xmlgen.getXMLType(
  q'{select convert('ä', 'UTF8') myValue from dual}')
from dual

Наконец я создал функцию, которая читает словарь и просматривает все столбцы данной таблицы / представления и генерирует строку оператора select, гдевсе столбцы конвертируются отдельно в UTF8.Затем эту строку можно передать в качестве параметра в функцию dbms_xmlgen.newContext.

...