2015-04-21 5 views
7

Я использую 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 считаться ошибкой или мне что-то не хватает?

+1

Возпроизводимо в 11.2.0.3; на 10.2.0.5 это ядро-дампы (хотя с добавлением подсказки NO_XML_QUERY_REWRITE, чтобы избежать ошибки 5963973, это также показывает это поведение). Так выглядит как ошибка, и вы, вероятно, должны подать запрос на обслуживание, чтобы сообщить об этом. –

+1

думаю есть ошибка. Когда я добавляю 'NVL' к выражению -' xmltype (NVL (d.x, '')) ', тогда запрос выполняется, но не возвращает строку. 'с данными, как ( выберите ' В21' х от двойного ), extractedxml как ( SELECT, б из данных д, XMLTABLE ('/ А/B' ПРОХОЖДЕНИЕ XMLType (NVL (дх , ' ')) КОЛОННЫ б varchar2 (20) PATH) ) выберите Ъ от extractedxml UNION выбрать б от extractedxml' –

+1

@Asieh'.': при редактировании, пожалуйста, обратите внимание, что встроенный код пролеты ('как this') [не следует использовать для выделения] (http://meta.stackoverflow.com/q/254990), только для кода в предложениях. Кроме того, при редактировании, пожалуйста, постарайтесь улучшить сообщение, чтобы сохранить время рецензентов. Благодаря! –

ответ

2

Согласно моему опыту, полезно добавить дополнительный столбец для обыденности в xmltable.

Этот SQL оператор работает нормально:

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 i FOR ORDINALITY, b varchar2(20) PATH '.') 
) 
select b from extractedxml union 
select b from extractedxml; 

другой непоправимые проблемы, вызванные Omiting колонки для ordinality:

with data as 
(
    select xmltype('<A><B>B21</B></A>') x from dual 
), 
extractedxml as (
    SELECT b 
    FROM data d, 
     xmltable('/A/B' PASSING d.x COLUMNS b varchar2(20) PATH '.') 
) 
select b from extractedxml union 
select b from extractedxml; 

>> no result (!) 

Но

with data as 
(
    select xmltype('<A><B>B21</B></A>') x from dual 
), 
extractedxml as (
    SELECT b 
    FROM data d, 
     xmltable('/A/B' PASSING d.x COLUMNS i FOR ORDINALITY, b varchar2(20) PATH '.') 
) 
select b from extractedxml union 
select b from extractedxml; 

>> B21 
+0

Это работает (по крайней мере, для моего использования). Благодаря! – Branko

Смежные вопросы