【问题标题】:PL/SQL: Loop Through XML Column and Extract Value From Duplicate ElementsPL/SQL:循环遍历 XML 列并从重复元素中提取值
【发布时间】: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,它会抱怨它不存在。

【问题讨论】:

    标签: xml oracle plsql


    【解决方案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 值/行就可以扩展为多个关系行。
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2014-09-27
    • 1970-01-01
    • 2023-03-19
    • 2021-07-31
    • 2013-07-30
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多