PL/SQL:循环遍历 XML 列并从重复元素中提取值
Posted
技术标签:
【中文标题】PL/SQL:循环遍历 XML 列并从重复元素中提取值【英文标题】:PL/SQL: Loop Through XML Column and Extract Value From Duplicate Elements 【发布时间】:2020-02-20 22:23:24 【问题描述】:我有一个包含 XMLType 列的 SQL 表。我需要遍历每一行并从列中提取值。
XML 包含多个相同的子级,如下所示:
<parent>
<child>Test</child>
<child>Test1</child>
<child>Test2</child>
</parent>
我的目标是获取每个孩子的值并附加到一个字符串。但是,我在提取值时遇到问题。
我目前的解决方案:
DECLARE
sample VARCHAR(2000);
BEGIN
FOR row IN (SELECT xml_column FROM table)
LOOP
FOR child in (SELECT EXTRACT('/parent/child') ...
LOOP
....
END LOOP;
END LOOP;
END;
我的第一个问题是我似乎无法获得个人价值观。我已经使用了 EXTRACT 和 EXTRACTVALUE,但我得到的最好的是'TEST1TEST2 ...'。
其次,如果我尝试使用row.XML_COLUMN
,它会抱怨它不存在。
【问题讨论】:
【参考方案1】:尝试使用XMLTable 像集合一样遍历值。
示例架构
--drop table table1;
create table table1 as
select xmltype('
<parent>
<child>Test</child>
<child>Test1</child>
<child>Test2</child>
</parent>') xml_column
from dual;
PL/SQL 循环
begin
for children in
(
select child
from table1
cross join xmltable
(
'/parent/child'
passing xml_column
columns child varchar2(100) path '/'
)
) loop
dbms_output.put_line(children.child);
end loop;
end;
/
DBMS_OUTPUT 结果
Test
Test1
Test2
【讨论】:
这行得通,但你能解释一下“交叉连接”部分吗?我不明白这是在做什么。 @ghost013 交叉连接很奇怪。它真的更像是一个 OUTER APPLY,这也是一个奇怪的概念。 TABLE1 中的每一行都传递到 XMLTABLE 中,结果相乘,这样一个 XML 值/行就可以扩展为多个关系行。以上是关于PL/SQL:循环遍历 XML 列并从重复元素中提取值的主要内容,如果未能解决你的问题,请参考以下文章