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 列并从重复元素中提取值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PL/SQL 循环遍历 json 响应?

循环遍历 Oracle PL/SQL 中的表

使用 PL/SQL 解析 XML 输出 html 中特定标签的内容

似乎找不到循环遍历 PL/SQL 数组的方法?

pl/sql 循环遍历表并将行的每个条目传递给存储过程

打印 Oracle Pl/sql 光标