Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
解析PL/SQL查询中的XML属性_Xml_Oracle - Fatal编程技术网

解析PL/SQL查询中的XML属性

解析PL/SQL查询中的XML属性,xml,oracle,Xml,Oracle,请在下面的PL/SQL中检查下面的XML,输出应如下所示: CITY_NAME POPULATION MUMBAI 6780000 DELHI 5100000 HYDERABAD 2480000 CHENNAI 6100000 我正在使用下面的查询,但是有没有更好的方法来处理而不是加入rownum。我承认XML格式可以更好地处理XML属性 WITH t as (select XMLTYPE(' <ROOT> <CITY_INFO>

请在下面的PL/SQL中检查下面的XML,输出应如下所示:

CITY_NAME   POPULATION
MUMBAI  6780000
DELHI   5100000
HYDERABAD   2480000
CHENNAI 6100000
我正在使用下面的查询,但是有没有更好的方法来处理而不是加入rownum。我承认XML格式可以更好地处理XML属性

WITH t as (select XMLTYPE('
<ROOT>
    <CITY_INFO>
        <CITY>
          <CITY_NAME Value="MUMBAI"/>
          <POPULATION Value="6780000" OldValue=""/>
        </CITY>
        <CITY>
          <CITY_NAME Value="DELHI"/>
          <POPULATION Value="5100000" OldValue=""/>
        </CITY>
    </CITY_INFO>
    <CITY_INFO>
        <CITY>
          <CITY_NAME Value="HYDERABAD"/>
          <POPULATION Value="2480000" OldValue=""/>
        </CITY>
        <CITY>
          <CITY_NAME Value="CHENNAI"/>
          <POPULATION Value="6100000" OldValue=""/>
        </CITY>
    </CITY_INFO>
</ROOT>
') as xml from dual)
select a.CITY_NAME, b.population from (select c.*, rownum as row_num
from t
           ,XMLTABLE('/ROOT/CITY_INFO/CITY/CITY_NAME'
              PASSING t.xml
              COLUMNS CITY_NAME VARCHAR2(100) PATH '/CITY_NAME/@Value'
             ) c) a,
             (select pop.*, rownum as row_num
             from t
           ,XMLTABLE('/ROOT/CITY_INFO/CITY/POPULATION'
              PASSING t.xml
              COLUMNS POPULATION NUMBER PATH '/POPULATION/@Value'
             ) pop) b where a.row_num = b.row_num

通过将xmltable中的根路径更改为CITY_NAME和POPULATION节点之前的级别,并通过//引用CITY_NAME和POPULATION节点,以下操作对我有效:

WITH t as (select XMLTYPE('
<ROOT>
    <CITY_INFO>
        <CITY>
          <CITY_NAME Value="MUMBAI"/>
          <POPULATION Value="6780000" OldValue=""/>
        </CITY>
        <CITY>
          <CITY_NAME Value="DELHI"/>
          <POPULATION Value="5100000" OldValue=""/>
        </CITY>
    </CITY_INFO>
    <CITY_INFO>
        <CITY>
          <CITY_NAME Value="HYDERABAD"/>
          <POPULATION Value="2480000" OldValue=""/>
        </CITY>
        <CITY>
          <CITY_NAME Value="CHENNAI"/>
          <POPULATION Value="6100000" OldValue=""/>
        </CITY>
    </CITY_INFO>
</ROOT>
') as xml from dual)
select a.CITY_NAME, a.population 
from   t,
       XMLTABLE('/ROOT/CITY_INFO/CITY'
              PASSING t.xml
              COLUMNS CITY_NAME VARCHAR2(100) PATH '//CITY_NAME/@Value',
              POPULATION NUMBER PATH '//POPULATION/@Value'
             ) a;

CITY_NAME            POPULATION
-------------------- ----------
MUMBAI                  6780000
DELHI                   5100000
HYDERABAD               2480000
CHENNAI                 6100000

您是否有任何错误,或者您当前的输出是否不符合要求?将这些细节添加到您的问题中。如果当前输出与添加当前输出不同。查询的输出与预期的相同,但rownum上的innerjoin看起来不干净。下面的答案实现了输出,无需两次解析和加入。谢谢你的工作。对不起,我不能投赞成票,因为我是newb@KrishY-尽管如此,您仍然可以接受此答案。