I am using Oracle 11.2.0.4.0
and have run several times into problems when XMLTABLE
was involved. My latest problem can be demonstrated with the following example (which I designed to be as simple as possible):
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;
produces the following error:
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
while the following query works as expected (the with clause is unchanged):
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
Further the query works if the use of XMLTABLE
is avoided:
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
So I have a workaround and I will avoid using XMLTABLE
as long as I don't understand the behavior described above. Is XMLTABLE
to be considered buggy or am I missing something?
According to my experience it is a good idea to add a further column for ordinality to the xmltable.
This SQL statement works fine:
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;
Another fatal problem caused by omiting the column for 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 (!)
But
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With