从CLOB(包含XML)中提取特定值,同时为表的每一行创建一个分隔字符串.某些行上的CLOB值可能为null

Jam*_*her 7 xml sql oracle clob xmltype

一些上下文:数据库是Oracle.我试图在表的每一行创建一个分隔的字符串.分隔字符串的某些值必须来自CLOB(包含XML).某些行上的CLOB可能为null,这就是问题所在.

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

<OuterTag>      
    <InnerTag>test</InnerTag>   
</OuterTag>     
Run Code Online (Sandbox Code Playgroud)

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

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD 
FROM Item; 
Run Code Online (Sandbox Code Playgroud)

这成功地运作:

项%#12345%#A

项%#123456%#A

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

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

这失败并出现以下错误:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

我已将此问题缩小到有时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; 
Run Code Online (Sandbox Code Playgroud)

这成功地运作:

项%#12345%#A#%测试

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

Daz*_*zaL 7

你错误的原因是xmltype构造函数有空缺点.我个人总是使用xmltype.createxml(item_txt).你会发现它的工作原理,而不必担心nvl等.