Oracle ORA-31011在XMLTYPE列上

Oracle ORA-31011在XMLTYPE列上,oracle,oracle11g,xmltype,ora-31011,Oracle,Oracle11g,Xmltype,Ora 31011,我使用的是Oracle版本-11.2.0.4 下面我以更简单的方式再现了我面临的问题。 我有两个带有XMLTYPE列的表。 表1(我下面的示例中的base_表)将XMLTYPE的存储模型设置为二进制XML。 表2(my_选项卡)将XMLTYPE的存储模型设置为CLOB 使用base_表中的XML,我将根据特定条件提取属性的值。这个属性是my_选项卡中包含的xml节点的名称,我想从my_选项卡中提取该节点的值。 请注意,我目前无权改变这种逻辑 在XMLTYPE列的存储模型在两个表中都是CLOB之前

我使用的是Oracle版本-11.2.0.4

下面我以更简单的方式再现了我面临的问题。 我有两个带有XMLTYPE列的表。 表1(我下面的示例中的base_表)将XMLTYPE的存储模型设置为二进制XML。 表2(my_选项卡)将XMLTYPE的存储模型设置为CLOB

使用base_表中的XML,我将根据特定条件提取属性的值。这个属性是my_选项卡中包含的xml节点的名称,我想从my_选项卡中提取该节点的值。 请注意,我目前无权改变这种逻辑

在XMLTYPE列的存储模型在两个表中都是CLOB之前,代码一直运行良好。最近重新创建了base_表(drop and create),所以它的存储模型被修改为二进制XML,据我所知,这是11.2.0.4版中的默认存储模型

下面是创建表stmt和示例数据-

create table base_table(xml xmltype);
create table my_tab(xml xmltype)
xmltype column "XML" store as clob;

insert into base_table(xml)
values (xmltype('<ROOT>
  <ELEMENT NAME="NODEA">
    <NODE1>A-Node1</NODE1>
    <NODE2>A-Node2</NODE2>
  </ELEMENT>
  <ELEMENT NAME="NODEB">
    <NODE1>B-Node1</NODE1>
    <NODE2>B-Node2</NODE2>
  </ELEMENT>
  <ELEMENT NAME="NODEC">
    <NODE1>C-Node1</NODE1>
    <NODE2>C-Node2</NODE2>
  </ELEMENT>
</ROOT>')
);

insert into my_tab(xml)
values (xmltype('<TEST_XML>
  <SOME_NODE>
    <XYZ>
      <NODEB>My area of concern</NODEB>
      <OTHER_NODE> Something irrelevant </OTHER_NODE>
    </XYZ>
  </SOME_NODE>
  <SOME_OTHER_NODE>
    <ABC> Some value for this node </ABC>
  </SOME_OTHER_NODE>
</TEST_XML>')
);
但是,该查询工作正常,能够提取我感兴趣的节点的值。可以看出,tag_name是根据需要获取的,但当它在“extract”中使用时,它的值不知何故丢失了

select sd.tag_name, extract(t.xml, '//NodeB/text()').getstringval()
from (select '//' || extract(value(d), '//@NAME').getstringval() || '/text()' as tag_name
        from base_table b,
             table(xmlsequence(extract(b.xml, '//ROOT/ELEMENT'))) d
       where extract(value(d), '//NODE2/text()').getstringval() = 'B-Node2') sd,
my_tab t;

如果我将base_表的XMLTYPE存储模型更改回CLOB,错误的查询将再次正常工作

我想了解作为二进制XML的存储模型出了什么问题

我修改了查询如下,运行良好。i、 e.转换为clob并返回到XMLTYPE:

select extract(t.xml, sd.tag_name).getstringval() 
from (select '//' || extract(value(d), '//@NAME').getstringval() || '/text()' as tag_name 
 from base_table b, 
 table(xmlsequence(extract(XMLTYPE(b.xml.getclobval()), '//ROOT/ELEMENT'))) d 
 where extract(value(d), '//NODE2/text()').getstringval() = 'B-Node2') sd, 
my_tab t; 
谢谢, 凯拉什

select extract(t.xml, sd.tag_name).getstringval() 
from (select '//' || extract(value(d), '//@NAME').getstringval() || '/text()' as tag_name 
 from base_table b, 
 table(xmlsequence(extract(XMLTYPE(b.xml.getclobval()), '//ROOT/ELEMENT'))) d 
 where extract(value(d), '//NODE2/text()').getstringval() = 'B-Node2') sd, 
my_tab t;