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

标签 sql xml oracle clob xmltype

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

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

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

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

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

这成功了:

项目%#12345%#A

项目%#123456%#A

然后我尝试添加第 4 个元素(来自 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 为空且 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 添加到分隔字符串?

最佳答案

顺便说一下,您的错误原因是 xmltype 构造函数存在空 lob 缺陷。我个人总是使用 xmltype.createxml(item_txt) 代替。您会发现它同样有效,而不必担心 nvl 等问题。

关于sql - 从 CLOB(包含 XML)中提取特定值,同时为表的每一行创建一个分隔字符串。某些行上的 CLOB 值可能为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139329/

相关文章:

sql - Oracle sql日期查询格式个位数

php - 如何在SQL中搜索子节点

sql - 对 ETL 的良好 SQL Server Integration Services (SSIS) 示例/样本的建议?

java - 在 Java 中使用 LIKE 查询时标识符无效

java - 在 Java 中使用多个 XSD 验证 XML

xml - 使用 XSLT 删除字符串的第一个和最后一个字符

sql - PL/SQL 验证/插入/更新状态 - retval 与异常

sql - 使用 Sequel,我可以创建带有 FROM 子句的 UPDATE 语句吗

sql - 使用 'ON CONFLICT DO NOTHING' 插入触发器

xml - 为什么 XSL 函数 `ends-with` 和 `matches` 都抛出错误?