2015-02-11 82 views
0

请检查下面列出XML在PL/SQL的下方,输出应该是这样的:解析XML在PL/SQL查询属性

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 
+0

你是否得到任何错误,或者你的当前输出不是“应该”?将这些细节添加到您的问题。如果您的当前输出不同于添加当前输出。 – Ram 2015-02-11 15:03:27

+0

查询的输出与预期相同,但rownum上的innerjoin看起来并不干净。下面发布的答案可以在不解析两次并加入的情况下实现输出。 – 2015-02-11 15:43:38

回答

2

CITY_NAMEPOPULATION节点之前在XMLTABLE改变“根路径”是的水平,并通过//引用CITY_NAMEPOPULATION节点,下面的工作对我来说:

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 
+0

谢谢你的作品。对不起,不能投票,因为我是一个新人 – 2015-02-11 15:34:32

+0

@KrishY - 你仍然可以接受这个答案,[通过点击投票按钮下的复选标记](http://stackoverflow.com/help/someone-answers)。 – 2015-02-11 16:27:04