一些背景:数据库是甲骨文。我正在尝试为表格的每一行创建一个分隔字符串。分隔字符串的某些值必须来自 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 添加到分隔字符串?