Tidak ada gunanya mencoba menghasilkan XML yang sangat besar di PL/SQL. Masalahnya bukan PL/SQL seperti itu, tetapi PL/SQL itu hanya mendukung XML DOM, dan DOM sama sekali tidak menangani XML besar. Anda tidak mengatakan berapa ukuran dokumen XML yang Anda miliki, tetapi saya tidak akan terkejut menemukan memori yang digunakan oleh PL/SQL untuk membuat dokumen Anda berukuran sekitar 10 hingga 30 kali ukuran dokumen yang dihasilkan.
Apakah ada opsi untuk menghasilkan XML menggunakan sesuatu selain PL/SQL? Jika tidak, dan saya benar-benar harus membuat file XML besar dalam database Oracle, saya akan mempertimbangkan untuk menggunakan prosedur tersimpan Java. Pertanyaan ini memiliki beberapa jawaban tentang cara melakukan hal semacam ini di Jawa.
EDIT sebagai tanggapan atas komentar Anda:kode Anda pasti tidak menulis satu baris dalam satu waktu. Itu menulis banyak bersama, fakta yang saya verifikasi dengan menjalankannya menggunakan kueri SELECT * FROM all_objects
di database Oracle 11g XE saya. Loop berjalan satu kali dan menulis 7341 objek, membuat file XML berukuran lebih dari 3 MB.
Saya kemudian mencoba memodifikasi kode Anda untuk lebih mendukung pendekatan 'tambahan' yang Anda gambarkan. Ini melibatkan:
-
menambahkan baris
dbms_xmlgen.setmaxrows(ctx, max_rows);
untuk memberi tahu DBMS_XMLGEN agar hanya menghasilkan 5 baris sekaligus. Jika tidak, ia mencoba menghasilkan lot sekaligus. -
memodifikasi kode di bagian atas
WHILE
loop kexml_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
-
menambahkan yang pertama dari tiga baris ini tepat sebelum bagian bawah
WHILE
lingkaran.
Saya kemudian menjalankan kembali kode Anda, dan saya bisa melihatnya menulis setiap kumpulan lima baris ke file setiap kali. Namun, ada sedikit masalah dengan pendekatan ini, karena file selalu ditimpa setiap kali. Pada akhirnya saya hanya memiliki satu catatan dalam file XML keluaran. Saya tidak bisa membayangkan ini yang Anda inginkan.
WRITETOCLOB
, WRITETOBUFFER
dan WRITETOFILE
metode di DBMS_XMLDOM
jangan mengisyaratkan kemampuan untuk menambahkan ke file yang ada, dan sejujurnya saya tidak terkejut bahwa mereka tidak melakukannya. Jika bisa, Anda akan mendapatkan XML yang tidak valid, karena akan ada lebih dari satu <?xml ... ?>
deklarasi dalam file.
Saya mendukung saran saya sebelumnya. Kapan pun Anda perlu berurusan dengan XML besar, di database Oracle atau di tempat lain, gunakan SAX atau StAX. PL/SQL juga tidak mendukung, jadi lakukan apa pun yang perlu Anda lakukan dalam prosedur tersimpan Java atau lakukan di luar database.