Я использую Oracle 11.2.0.4.0
и несколько раз сталкивался с проблемами, когда принимали участие XMLTABLE
. Моя последняя проблема может быть продемонстрирована на следующем примере (который я разработан, чтобы быть как можно более простым):Странная ошибка с XMLTABLE на Oracle 11g
with data as
(
select '<A><B>B21</B></A>' x from dual
),
extractedxml as (
SELECT b
FROM data d,
xmltable('/A/B' PASSING xmltype(d.x) COLUMNS b varchar2(20) PATH '.')
)
select b from extractedxml union
select b from extractedxml;
производит следующее сообщение об ошибке:
ORA-19032: Expected XML tag , got no content
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
19032. 00000 - "Expected XML tag %s got %s"
*Cause: When converting XML to object, a wrong tag name was present
*Action: Pass a valid canonical XML that can map to the given object type
, а следующий запрос работает, как ожидалось (с п неизменна):
with data as
(
select '<A><B>B21</B></A>' x from dual
),
extractedxml as (
SELECT b
FROM data d,
xmltable('/A/B' PASSING xmltype(d.x) COLUMNS b varchar2(20) PATH '.')
)
select b from extractedxml;
B
--------------------
B21
Далее запрос работает, если использование XMLTABLE
избежать:
with data as
(
select '<A><B>B21</B></A>' x from dual
),
extractedxml as (
SELECT cast (extractvalue(column_value,'B') as varchar2(20)) b
FROM data, table(xmlsequence(extract(xmltype(data.x),'/A/B')))
)
select b from extractedxml union
select b from extractedxml;
B
--------------------
B21
Так что у меня есть обходное решение, и я избегу использовать XMLTABLE
, пока я не понимаю поведение, описанное выше. Является ли XMLTABLE
считаться ошибкой или мне что-то не хватает?
Возпроизводимо в 11.2.0.3; на 10.2.0.5 это ядро-дампы (хотя с добавлением подсказки NO_XML_QUERY_REWRITE, чтобы избежать ошибки 5963973, это также показывает это поведение). Так выглядит как ошибка, и вы, вероятно, должны подать запрос на обслуживание, чтобы сообщить об этом. –
думаю есть ошибка. Когда я добавляю 'NVL' к выражению -' xmltype (NVL (d.x, ' ')) ', тогда запрос выполняется, но не возвращает строку. 'с данными, как ( выберите ' В21' х от двойного ), extractedxml как ( SELECT, б из данных д, XMLTABLE ('/ А/B' ПРОХОЖДЕНИЕ XMLType (NVL (дх , ' ')) КОЛОННЫ б varchar2 (20) PATH) ) выберите Ъ от extractedxml UNION выбрать б от extractedxml' –
@Asieh'.': при редактировании, пожалуйста, обратите внимание, что встроенный код пролеты ('как this') [не следует использовать для выделения] (http://meta.stackoverflow.com/q/254990), только для кода в предложениях. Кроме того, при редактировании, пожалуйста, постарайтесь улучшить сообщение, чтобы сохранить время рецензентов. Благодаря! –