从 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的主要内容,如果未能解决你的问题,请参考以下文章