2012-02-28 10 views
0

Oracle DBおよびPL/SQLは一般的にはかなり素人ですが、Oracle DBとのインタフェースが必要です。Oracle PL/SQLのマルチレベル・コレクションからXMLを生成する

私はマルチレベル・コレクションで出力パラメータを持つPL/SQLストアド・プロシージャがあります。しかし、私はプロシージャを呼び出すと、この

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; 

のような標準出力に手動でXMLを生成

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; 

をこれは維持するのが非常に面倒です。 PL/SQLのショートカットはXML_gen(result)のようになり、level_b_tableに戻って自動的に生成されますか?ヘルプのあまり

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

答えて

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; 

は私がビューからマルチレベルXML(ほとんど単に「level_b_vから選択*」を選択し、DBMS_XMLGENを使用し、である。

そして、必要に応じて、使用DBMS_XSLPROCESSORは、スタイルシートを適用する。それがあります多くのメモリを使用し、行サイズの4乗としてリソースを使用するDOM操作ですが、トランスフォームがかなりローカライズされている場合は、DBMS_XMLGENでデータを選択して処理できます。

一意のオブジェクト識別子あなたはタイプを作成する必要がありますが、すでにそれを行っています。

もちろん、他の方法もありますが、これは適度なサイズのデータ​​に対しては、階層レベルでは最大約10レベル、XMLでは400 MBまで非常にうまく機能しています。

0

、私は知っているが、 Oracle XML DBのドキュメントを見てください。 Oracleは、XML文書を作成/操作するための多くの機能を提供しています。

+0

私は上記のマルチレベルコレクションからXMLを生成する簡単で簡単な方法はないと思います。あなたはテーブルのこのデータにアクセスできますか?もしそうであれば、いくつかのSQL関数を使ってXMLを生成することができます。 –

+0

はい、私は "SELECT ... FROM ..."ステートメントから直接XMLを生成する可能性を見てきました。残念ながら、それは私の場合の選択肢ではありません。 – fawick

関連する問題