从 Oracle PL/SQL 多级集合生成 XML

Posted

技术标签:

【中文标题】从 Oracle PL/SQL 多级集合生成 XML【英文标题】:Generate XML from Oracle PL/SQL multilevel collection 【发布时间】:2012-02-28 13:40:20 【问题描述】:

总的来说,我对 Oracle DB 和 PL/SQL 非常业余,但仍然需要与 Oracle DB 交互。

我有一个 PL/SQL 存储过程,它的输出参数是一个多级集合:

declare
TYPE level_a_type IS RECORD
(
    text varchar2(6),
    data number
);
TYPE level_a_table IS TABLE of level_a_type INDEX BY PLS_INTEGER;
TYPE level_b_type IS RECORD
(
    value number,
    included_table level_a_table
);
TYPE level_b_table IS TABLE of level_b_type INDEX BY PLS_INTEGER;

我调用该过程并像这样在标准输出上手动生成 XML

set serveroutput on
declare
    result level_b_type;
    n integer;
begin
    n := mypackage.mystoredprocedure(result);
FOR i IN 1 .. result.count LOOP
    dbms_output.putline('<levelb value="'||result(i).level_b_value||'" >');
    FOR k IN 1 .. result(i).included_table.count LOOP
        dbms_output.putline('<levela text="'||result(i).included_table(k).text||'" data="'||result(i).included_table(k).data||" '/>');
    END LOOP;
    dbms_output.putline('</levelb>');
END LOOP;
end;

但是,维护起来相当麻烦。那么,是否有一个 PL/SQL 快捷方式可以执行 XML_gen(result) 之类的操作,它会回溯到 level_b_table 并自动生成类似的内容?

<levelb value="1">
<levela text="Hello" data="1" />
<levela text="World" data="2" />
</levelb>

【问题讨论】:

【参考方案1】:

在这种情况下,我要做的是创建一个包含您需要的数据的对象关系视图。也就是说,

create view level_b_v of level_b_table with object identifier (value) as
select <level b stuff>,
    cast (multiset (select <level a stuff>) as level_a_table;

然后我使用 dbms_xmlgen 从视图中选择多级 XML(几乎只是“从 level_b_v 中选择 *”。

并且,如有必要,使用 dbms_xslprocessor 应用样式表。这是一个使用大量内存的 DOM 操作(并将资源作为行大小的 4 次方),但是如果您的转换非常本地化,您可以让 DBMS_XMLGEN 选择块中的数据并处理它们。

您需要为视图提供唯一的对象标识符。你需要创建类型,但你已经完成了。

当然,还有其他方法,但是对于中等大小的数据,这对我们非常有效,在层次结构中最多大约 10 个级别和 400 MB 的结果 XML。

【讨论】:

【参考方案2】:

我知道帮助不大,但请看一下 Oracle XML DB 文档。 Oracle 提供了许多创建/操作 XML 文档的功能。

【讨论】:

我认为没有一种简单易行的方法可以从上述多级集合生成 XML。您可以在表格中访问这些数据吗?如果是,可以使用一些 SQL 函数来生成 XML。 是的,我已经看到了直接从“SELECT ... FROM ...”语句生成 XML 的可能性。不幸的是,这不是我的选择。

以上是关于从 Oracle PL/SQL 多级集合生成 XML的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle PL/SQL 中的表生成 json 文件

ORACLE PL/SQL:使用集合的动态 SQL 选择

oracle 学习游标

如何在 Oracle 中调试 PL/SQL 集合的值?

Oracle 使用 PL/SQL Developer 生成 AWR 报告

Oracle 使用 PL/SQL Developer 生成 AWR 报告