7

一些背景:数据库是甲骨文。我正在尝试为表格的每一行创建一个分隔字符串。分隔字符串的某些值必须来自 CLOB(包含 XML)。CLOB 在某些行上可能为空,这就是问题所在。

例如,我有一个表:“Item”,其中包含以下行:“Item_ID”、“Item_CD”、“Item_TXT”(CLOB)。该表有两行。一行在“Item_TXT”中存储了以下 XML,另一行的“Item_TXT”为空。

<OuterTag>      
    <InnerTag>test</InnerTag>   
</OuterTag>     

我创建了以下 SQL 来返回分隔字符串的前 3 个元素:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD 
FROM Item; 

这成功了:

项目%#12345%#A

项目%#123456%#A

然后我尝试添加第四个元素(来自 CLOB 的值)。

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item; 

这失败并出现以下错误:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1

我已将此问题缩小到有时 Item_TXT 为 null 并且 XMLTYPE() 无法处理此问题。为了证明这一点,我运行了以下命令:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item
WHERE Item_TXT IS NOT NULL; 

这成功了:

项目%#12345%#A%#test

有没有办法处理整个表,如果可用的话从 clob 中提取值,否则将 null/nothing 添加到分隔字符串?

4

2 回答 2

9

顺便说一句,您的错误的原因是xmltype构造函数存在空 lob 缺陷。就我个人而言,我总是使用xmltype.createxml(item_txt)。您会发现它也可以正常工作,而不必担心nvl等。

于 2013-03-01T10:57:19.953 回答
3

尝试使用nvl

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD ||'%#'|| 
EXTRACT(XMLTYPE(nvl(Item_TXT, '<OuterTag><InnerTag/></OuterTag>')), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item;

这是一个 sqlfiddle 演示

或者您可以使用CASE语句:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_CD||'%#'||
case when Item_TXT is not null then
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal() end
FROM Item;
于 2013-02-28T15:32:32.360 回答