Экранирование управляющих символов в Oracle XDB - PullRequest
2 голосов
/ 01 сентября 2011

Я совершенно новичок в XDB от Oracle, в частности использую его для генерации вывода XML из таблицы базы данных и работаю над приложением, которое перемещается из 9i (Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production) в11g (Oracle Database 11g Enterprise Edition, выпуск 11.2.0.2.0 - 64-разрядная версия).Вот небольшой тестовый пример, который иллюстрирует мою проблему:

select xmlelement("test", test) from (select 'a' test from dual);

Это работает и дает мне:

<test>a</test>

Однако в 11g, если я поменяю 'a' нанедопустимый символ, такой как U + 0013 Я получаю следующую ошибку:

ORA-31061: XDB error: special char to escaped char conversion failed.

Под 9i то же самое работает успешно, без ошибок.

Очевидно, что идеальный ответ должен иметь некоторую проверкучтобы предотвратить попадание управляющих символов в простые символьные данные, которые я пытаюсь преобразовать в XML, но, к сожалению, это выходит за рамки того, что я делаю.

Это то, что испытал кто-то другой, иесли так, могу ли я внести простое изменение в свой сценарий создания XML или мне нужно выполнить какой-либо другой вид очистки?Или просто вручную исправьте проблему в тех редких случаях, когда это происходит (что было бы вполне разумным вариантом для моих нужд).

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 09 января 2013

Хотя лучшим решением всегда является фиксация данных в источнике, я также обнаружил, что это полезно в случае, когда я не могу контролировать данные в источнике:

select xmlelement("test", test) from (select regexp_replace(unistr('a\0013b'), '[[:cntrl:]]', '') test from dual);

Важной частью является regexp_replace (your_field, '[[: cntrl ::]]', '') для удаления управляющих символов из данных.

3 голосов
/ 29 сентября 2011

U + 0013 не является допустимым кодом Unicode для XML. Смотрите, например Допустимые символы в XML . Так что 11g правильно вызывает исключение.

SQL> select xmlelement("test", unistr('a\0013b')) from dual;
ERROR:
ORA-31061: XDB error: special char to escaped char conversion failed.

no rows selected

SQL> select xmlelement("test", unistr('a\00aeb')) from dual;

XMLELEMENT("TEST",UNISTR('A\00AEB'))
--------------------------------------------------------------------------------
<test>a®b</test>

SQL> 

Не знаю, почему это пройдет в 9i (у меня этого нет), но это, вероятно, просто потому, что реализация Oracle стала более соответствовать стандарту и / или стандарт развился.

Ваше исправление правильное.

0 голосов
/ 02 сентября 2011

Просто чтобы продолжить это для всех, кто заинтересован.Насколько я могу судить, 9i только что прошел через недопустимый символ, создавая неверный XML.11g выдает ошибку, что, вероятно, является более правильным поведением, даже если это раздражает в моем случае.

Единственное разумное решение, которое я нашел, было исправить содержимое в источнике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...