我对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>
答案 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文档的功能。