PL/SQL で非常に大きな XML を生成しようとしても意味がありません。問題は PL/SQL そのものではありませんが、PL/SQL は XML DOM しかサポートしておらず、DOM は大きな XML をまったくうまく処理できません。あなたが持っている XML ドキュメントのサイズはわかりませんが、PL/SQL がドキュメントを作成するために使用するメモリが、結果のドキュメントのサイズの約 10 倍から 30 倍であることは驚くことではありません。
PL/SQL 以外のものを使用して XML を生成するオプションはありますか?そうでない場合、そして実際に Oracle データベースで大きな XML ファイルを生成する必要がある場合は、Java ストアド プロシージャの使用を検討します。 この質問 Java でこの種のことを行う方法について、いくつかの回答があります。
編集 あなたのコメントに応えて:あなたのコードは、一度に1行ずつ書いていないことは間違いありません。それは一緒に多くを書いています。クエリ SELECT * FROM all_objects
を使用して実行して確認した事実です 私のOracle 11g XEデータベースで。ループは 1 回実行され、7341 個のオブジェクトが書き込まれ、サイズが 3MB をわずかに超える XML ファイルが作成されました。
次に、記述した「増分」アプローチをより適切にサポートするようにコードを変更してみました。これには以下が含まれます:
- <リ>
行を追加 dbms_xmlgen.setmaxrows(ctx, max_rows);
一度に5行のみ生成するようにDBMS_XMLGENに指示します。それ以外の場合は、一度にロットを生成しようとします。
WHILE
の先頭にあるコードを変更する ループして
xml_result := dbms_xmlgen.getXML(ctx);
num_rows_processed := DBMS_XMLGEN.GETNUMROWSPROCESSED(ctx);
dbms_output.put_line('Got ' || num_rows_processed || ' rows processed');
while num_rows_processed > 0
-- rest of loop omitted
<リ>
WHILE
の末尾の直前に、これらの 3 行の最初の行を追加します。 ループ。
次に、コードを再実行すると、5 行の各バッチが毎回ファイルに書き込まれていることがわかりました。ただし、このアプローチには、ファイルが毎回上書きされるというわずかな問題があります。最終的に、出力 XML ファイルには 1 つのレコードしかありませんでした。これがあなたの望むものだとは想像できません.
WRITETOCLOB
, WRITETOBUFFER
および WRITETOFILE
DBMS_XMLDOM
のメソッド 既存のファイルに追加する機能をほのめかしているわけではありません。正直なところ、そうでないことに驚かないでください。可能であれば、複数の <?xml ... ?>
が存在するため、無効な XML になります。 ファイル内の宣言。
私は以前のアドバイスを支持します。 Oracle データベースまたはその他の場所で大きな XML を処理する必要がある場合は常に、SAX または StAX を使用してください。 PL/SQL はどちらもサポートしていないので、必要なことはすべて Java ストアド プロシージャで行うか、データベースの外で行います。