【问题标题】:Strange error with XMLTABLE on Oracle 11gOracle 11g 上的 XMLTABLE 出现奇怪错误
【发布时间】: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

所以我有一个解决方法,只要我不理解上述行为,我就会避免使用XMLTABLEXMLTABLE 被认为是错误的还是我错过了什么?

【问题讨论】:

  • 可在 11.2.0.3 中重现;在 10.2.0.5 上,它会进行核心转储(尽管添加了 NO_XML_QUERY_REWRITE 提示以避免错误 5963973,但它也显示了这种行为)。所以看起来像一个错误,您可能应该提出服务请求来报告它。
  • 我认为有错误。当我将 NVL 添加到表达式时 - xmltype(NVL(d.x,'&lt;null/&gt;')) 然后查询执行,但不返回任何行。 with data as ( select '&lt;A&gt;&lt;B&gt;B21&lt;/B&gt;&lt;/A&gt;' x from dual ), extractedxml as ( SELECT b FROM data d, xmltable('/A/B' PASSING xmltype(NVL(d.x,'&lt;null/&gt;')) COLUMNS b varchar2(20) PATH '.') ) select b from extractedxml UNION select b from extractedxml
  • @Asieh:编辑时,请注意内联代码跨度(like thisshouldn't be used for highlighting,仅适用于句子中的代码。另外,请在编辑时尽量改进帖子,以节省审稿人的时间。谢谢!

标签: sql oracle oracle11g xmltable


【解决方案1】:

根据我的经验,在 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

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 2012-03-08
    • 2016-10-13
    • 2011-04-16
    • 2016-03-22
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多