检索clob中的值列表

时间:2016-04-28 10:36:02

标签: oracle

如何在clob中第n次出现数据时检索列表?

clob示例:

<bank>
    <bankDetails>
        <bankDetailsList>
            <pk>1</pk>
            <accountName>
                <asCurrent>EDGARS LESOTHO</asCurrent>
            </accountName>          
            <bankAccountType>
                <asCurrent>CURR</asCurrent>
            </bankAccountType>
        </bankDetailsList>
        <bankDetailsList>
            <pk>2</pk>
            <accountName>
                <asCurrent>EDGARS LESOTHO 2</asCurrent>
            </accountName>
            <bankAccountType>
                <asCurrent>CURR</asCurrent>
            </bankAccountType>
        </bankDetailsList>
    </bankDetails>
</bank>

所以我想在sql中检索帐户名的所有值,假设在clob中可能存在最多n个此帐户名列表。

我使用的是oracle 11g和SqlDeveloper 4.1.3 非常感谢您的回复。

2 个答案:

答案 0 :(得分:1)

SELECT EXTRACTVALUE( v.COLUMN_VALUE, '/asCurrent' )
FROM   table_name t,
       TABLE(
         XMLSequence(
           EXTRACT(
             XMLType( t.clob_column ),
             '/bank/bankDetails/bankDetailsList/accountName/asCurrent'
           )
         )
       ) v

答案 1 :(得分:0)

SELECT level as rnk, regexp_substr(t.clob_column, 
          '<accountName>[^<]*?<asCurrent>([^<]*?)<', 1, level, null, 1) as acct_name
FROM t
CONNECT BY level <= (select regexp_count(clob_column, '<accountName>') FROM t);

t是表名,clob_column是具有clob值的列(在我的测试用例中,表有一行和一列,值是原始帖子中的值)。

如果你有一列clob值并且需要同时为多个值执行此操作,则需要稍微修改一下;请澄清要求,我们可以从那里接受。

已添加:要使其适用于多行,您需要修改CONNECT BY LEVEL子句。您希望每行仅引用自身;并且为了避免循环问题,您需要再添加一个条件。像这样:

...
CONNECT BY level <= (select regexp_count(clob_column, '<accountName>') FROM t)
       and clob_column= prior clob_column
       and prior sys_guid() is not null;