Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Sql XMLtable与oracle11g_Sql_Xml_Oracle_Xpath_Oracle11g - Fatal编程技术网

Sql XMLtable与oracle11g

Sql XMLtable与oracle11g,sql,xml,oracle,xpath,oracle11g,Sql,Xml,Oracle,Xpath,Oracle11g,下面是一个示例表: create table xmltemp (mydoc xmltype) 下面是一个小的xml文档: insert into xmltemp values ( xmltype ('<?xml version="1.0"?> <countries> <country> <name>Canada</name> </country> <country> <name

下面是一个示例表:

create table xmltemp (mydoc xmltype)
下面是一个小的xml文档:

insert into xmltemp values (
xmltype
('<?xml version="1.0"?>
<countries>
  <country>
    <name>Canada</name>
  </country>
  <country>
    <name>US</name>
    <states>
      <state>
        <name>Washington</name>
        <name>Oregon</name>        
      </state>
    </states>
  </country>
</countries>
')
)  
当我执行此操作时,我在结果中看到了加拿大和美国:

select
countryname
from xmltemp,
xmltable('/countries/country' passing mydoc
   columns countryname varchar2(10) path 'name') 
当我这样做时,我得到两个状态:

select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
   columns statename   varchar2(20) path '.') c
我尝试了这个方法来获取国家和州,但oracle似乎不喜欢“…”语法:

select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
   columns statename   varchar2(20) path '.',
           countryname varchar2(20) path '../../../name') c
错误如下:

ORA-19110: unsupported XQuery expression
当我尝试此操作时,由于以下两种状态,会出现“multi-item”错误:

select
countryname,
statename
from xmltemp,
xmltable('/countries/country' passing mydoc
   columns countryname varchar2(10) path 'name',
           statename   varchar2(20) path 'states/state/name') c
这是一个错误:

ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton 
sequence - got multi-item sequence
什么查询可以让我获得所需的输出:

Canada,
US,Washington
US,Oregon
谢谢

试试这个:

select      X.COUNTRYNAME, Y.STATENAME
from        XMLTEMP
           ,xmltable('/countries/country'
                     passing MYDOC
                     columns COUNTRYNAME varchar2(20) path './name', 
                             STATES xmltype path './states') X,
            xmltable('/states/state/name' passing X.STATES 
                    columns STATENAME varchar2(20) path '.') (+) Y

因为您有多个状态,所以应该连接到另一个xml表。由于一些国家没有国家,因此它需要是一个左外联合。我在10g上尝试时使用了
(+)
的旧方法,在10g中使用
左外连接似乎有问题,但显然在
11g中应该可以,谢谢。我昨天考虑过外部连接,但不太清楚。虽然这两个链接并不特定于Oracle,但我发现这两个链接也很有用:[Part 1]()[Part 2]()。这似乎是正确的答案,因为我在PATH子句中找不到11g支持任何形式的父寻址。基本上,这里要做的是将父记录加载到XMLTABLE中,子元素包含在结果的XMLTYPE列中。然后,使用父记录中的XMLTYPE子列,将子记录加载到另一个XMLTABLE中。Oracle然后隐式联接所有表。--然而,我发现11g不能正确地用一个(+)进行外部连接,我必须在x和y表上都加(+),这没有多大意义。我在11g中发现的另一个奇怪之处是,在使用默认xmlnamespace时,我无法按预期的特定属性寻址元素。解决方法是使用通配符命名空间(显式命名空间也不起作用)来处理属性。例如,路径“ID[@type=“user”]”无效。不起作用:路径“ID[@foo:type=“user”]”。工作:路径“ID[@*:type=“user”]”。
select      X.COUNTRYNAME, Y.STATENAME
from        XMLTEMP
           ,xmltable('/countries/country'
                     passing MYDOC
                     columns COUNTRYNAME varchar2(20) path './name', 
                             STATES xmltype path './states') X,
            xmltable('/states/state/name' passing X.STATES 
                    columns STATENAME varchar2(20) path '.') (+) Y