Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Oracle PL/SQL多级集合生成XML_Xml_Oracle_Plsql - Fatal编程技术网

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

从Oracle PL/SQL多级集合生成XML,xml,oracle,plsql,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 REC

一般来说,我对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;

我知道帮不上什么忙,但看看
文档Oracle提供了许多创建/操作XML文档的功能。

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

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操作,它使用大量内存,并将资源作为行大小的四次方,但如果转换非常本地化,则可以让DBMS_XMLGEN选择数据块并对其进行处理

您需要视图的唯一对象标识符。您需要创建类型,但您已经这样做了


当然,还有其他方法,但对于中等大小的数据来说,这种方法非常有效,最高可达继承权的10个级别和400 MB的结果XML

我不认为有一种简单易行的方法可以从上述多级集合生成XML。您可以访问表中的数据吗?如果是的话,一些SQL函数可以用来生成XML。是的,我已经看到了直接从SELECT生成XML的可能性。。。从…起声明。不幸的是,这不是我的选择。
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;