Я использую Oracle 11.2.0.4.0
и несколько раз сталкивался с проблемами, когда был задействован XMLTABLE
. Моя последняя проблема может быть продемонстрирована на следующем примере (который я разработал максимально простым):
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 не изменилось):
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
считать глючным или я что-то упускаю?
NVL
к выражению -xmltype(NVL(d.x,'<null/>'))
, тогда запрос выполняется, но не возвращает никакой строки.with data as ( select '<A><B>B21</B></A>' x from dual ), extractedxml as ( SELECT b FROM data d, xmltable('/A/B' PASSING xmltype(NVL(d.x,'<null/>')) COLUMNS b varchar2(20) PATH '.') ) select b from extractedxml UNION select b from extractedxml
- person Janis Baiza   schedule 21.04.2015like this
) не должен использоваться для выделения, только для кода в предложениях. Кроме того, пожалуйста, постарайтесь максимально улучшить сообщение при редактировании, чтобы сэкономить время рецензентов. Спасибо! - person Qantas 94 Heavy   schedule 21.04.2015