PL / SQL解析clob数据

时间:2015-05-25 12:50:09

标签: xml oracle plsql

我有这样的clob数据:

我有两个GAIN AND PAY(可能更多三个,四个......)

<G_1>
    <G><GAIN>14660</GAIN><PAY>0</PAY><Gc>1</Gc><S>1</S><D>0</D><K>0</K></G>
    <G><‌​GAIN>0</GAIN><PAY>0</PAY><T>0</T><S>0</S><M>0</M><W>1</W></G>
</G_1>

我想单独达到14660和0(GAIN)和0 s(付费)。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

假设您的有效负载实际上是XML,并且<AL>0</GRUP_AL>只是一个拼写错误,您可以使用这样的XPath查询:

select
    xmlcast(
            xmlquery('/G_1/G/GAIN' passing XMLTYPE(col1) returning content)
            as NUMBER
           ) gain
    , xmlcast(
            xmlquery('/G_1/G/PAY' passing XMLTYPE(col1) returning content)
            as NUMBER
           ) pay
from t69
/

查看the SQL Fiddle here

因此,新的有效负载具有G/GAING/PAY的多个实例。之前的解决方案产生了错误的答案,因为它将不同的实例连接成一个列。

对于这种情况,我们需要使用XMLTable(),如下所示:

select  xr.*
from t69
     ,  xmltable ('/G_1'
          passing xmltype (t69.col1) 
          columns g_set XMLTYPE PATH 'G') xt
     , xmltable( 'G'   
           passing xt.g_set
          columns gain number path 'GAIN'
                  , pay number path 'PAY'
           ) xr
/

替代SQL Fiddle here。请注意,我们会为<G>的实例获取NULL值,而不包含<GAIN><PAY>的元素。