【发布时间】:2015-04-21 11:57:42
【问题描述】:
我正在使用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 被认为是错误的还是我错过了什么?
【问题讨论】:
-
可在 11.2.0.3 中重现;在 10.2.0.5 上,它会进行核心转储(尽管添加了 NO_XML_QUERY_REWRITE 提示以避免错误 5963973,但它也显示了这种行为)。所以看起来像一个错误,您可能应该提出服务请求来报告它。
-
我认为有错误。当我将
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 -
@Asieh:编辑时,请注意内联代码跨度(
like this)shouldn't be used for highlighting,仅适用于句子中的代码。另外,请在编辑时尽量改进帖子,以节省审稿人的时间。谢谢!
标签: sql oracle oracle11g xmltable