Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PLSQL中解析带有名称空间的嵌套XML_Sql_Xml_Oracle_Xmltable - Fatal编程技术网

在PLSQL中解析带有名称空间的嵌套XML

在PLSQL中解析带有名称空间的嵌套XML,sql,xml,oracle,xmltable,Sql,Xml,Oracle,Xmltable,我有一个如下所示的xml <ibm:dept bldg="123" xmlns:ibm="http://www.ibm.com/xmltable"> <ibm:employee id="144"> <ibm:name> <ibm:first>James</ibm:first> <ibm:last>Bond</ibm:last> </ibm:name>

我有一个如下所示的xml

<ibm:dept bldg="123" xmlns:ibm="http://www.ibm.com/xmltable">
  <ibm:employee id="144">
    <ibm:name>
      <ibm:first>James</ibm:first>
      <ibm:last>Bond</ibm:last>
    </ibm:name>
    <ibm:office>007</ibm:office>
    <ibm:phone>905-007-1007</ibm:phone>
    <ibm:salary currency="USD">77007</ibm:salary>
  </ibm:employee>
</ibm:dept>'
然而,它的错误与下面的错误

ORA-19228: XPST0008 - undeclared identifier: prefix 'ibm' local-name 'ibm:name'
希望有人能解释这个错误。干杯

数据设置

create table xml_tab
(
 id NUMBER,
 xml_data XMLType
 );



insert into xml_tab
values(3, XMLType.createXML('<ibm:dept bldg="123" xmlns:ibm="http://www.ibm.com/xmltable">
  <ibm:employee id="144">
    <ibm:name>
      <ibm:first>James</ibm:first>
      <ibm:last>Bond</ibm:last>
    </ibm:name>
    <ibm:office>007</ibm:office>
    <ibm:phone>905-007-1007</ibm:phone>
    <ibm:salary currency="USD">77007</ibm:salary>
  </ibm:employee>
</ibm:dept>'));
createtablexml\u选项卡
(
身份证号码
xml_数据XMLType
);
插入xml_选项卡
值(3,XMLType.createXML('
詹姆斯
纽带
007
905-007-1007
77007
'));

如果要在
子句的
路径
表达式中使用限定名,则需要指定
XMLNAMESPACES
子句()

因此,即使对于第二个
XMLTable

(别名可能会更改,例如第二个表的
ibm2
,方法是将所有
ibm:
替换为
ibm2:
):


如果要在
子句的
路径
表达式中使用限定名,则需要指定
xmlnamespace
子句()

因此,即使对于第二个
XMLTable

(别名可能会更改,例如第二个表的
ibm2
,方法是将所有
ibm:
替换为
ibm2:
):

create table xml_tab
(
 id NUMBER,
 xml_data XMLType
 );



insert into xml_tab
values(3, XMLType.createXML('<ibm:dept bldg="123" xmlns:ibm="http://www.ibm.com/xmltable">
  <ibm:employee id="144">
    <ibm:name>
      <ibm:first>James</ibm:first>
      <ibm:last>Bond</ibm:last>
    </ibm:name>
    <ibm:office>007</ibm:office>
    <ibm:phone>905-007-1007</ibm:phone>
    <ibm:salary currency="USD">77007</ibm:salary>
  </ibm:employee>
</ibm:dept>'));
select x.*, y.*
  from xml_tab t,
       XMLTable(XMLnamespaces('http://www.ibm.com/xmltable' as "ibm"),
                'ibm:dept/ibm:employee' passing t.xml_data columns empid
                NUMBER path '@id',
                office VARCHAR2(5) path 'ibm:office',
                name XMLTYPE path 'ibm:name') x,
       XMLTable(XMLnamespaces('http://www.ibm.com/xmltable' as "ibm"),
                'ibm:name' passing x.name columns firstname VARCHAR2(10) path
                'ibm:first',
                lastname VARCHAR2(10) path 'ibm:last') y                
 where t.id = 3;