我正在使用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
被认为是错误还是我错过了什么?
答案 0 :(得分: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;
通过省略通用列引起的另一个致命问题:
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