PL/SQL 解析 clob 数据

Posted

技术标签:

【中文标题】PL/SQL 解析 clob 数据【英文标题】:PL/SQL parse clob data 【发布时间】:2015-05-25 12:50:08 【问题描述】:

我有一个这样的 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 (pay)。我该怎么做?

【问题讨论】:

您可以使用 INSTR 和 SUBSTR。 【参考方案1】:

假设您的有效负载实际上是 XML,而 &lt;AL&gt;0&lt;/GRUP_AL&gt; 只是一个错字,您可以使用这样的 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。请注意,对于没有 &lt;GAIN&gt;&lt;PAY&gt; 元素的 &lt;G&gt; 实例,我们会得到一个 NULL 值。

【讨论】:

这似乎是一个很好的解决方案,但我又有一个问题。如果我有两个 GAIN 和两个 PAY : 14660011000000 01当我有两个GAIN并支付它工作错误时,它显示146600

以上是关于PL/SQL 解析 clob 数据的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL。使用 regexp_like 正则表达式解析 clob UTF8 字符

使用 PL/SQL 解析 XML 输出 html 中特定标签的内容

使用 SQL 或 PL/SQL 解析 XML 文档以提取字段值

在 PL/SQL 中插入 clob 数据时出错

在 PL/SQL 中将数据从文本文件复制到 CLOB

插入 CLOB 列时出错:ORA-06502:PL/SQL:数字或值错误