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

时间:2012-02-28 13:40:20

标签: xml oracle plsql

我对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;

我调用该过程并在stdout上手动生成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>

2 个答案:

答案 0 :(得分:2)

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

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(几乎只是“select * from level_b_v”。

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

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

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

答案 1 :(得分:0)

我知道,没什么帮助,但看看 Oracle XML DB文档。 Oracle提供了许多用于创建/操作XML文档的功能。