Seperti yang disarankan @kfinity, ini terkait dengan penanganan CLOB, tetapi juga dengan cara dbms_output
bekerja. Anda sedang membaca CLOB dalam potongan 32k, dan menulis setiap potongan tersebut dengan put_line()
, yang menambahkan karakter baris baru setelah setiap potongan 32k. Itu tidak selaras dengan jeda baris yang ada dalam dokumen XML Anda, sehingga Anda mendapatkan jeda asli, kemudian jeda tambahan - yang tampak agak acak dan teks tengah, tetapi sebenarnya berada di tempat yang dapat diprediksi.
Solusi yang jelas adalah beralih dari put_line()
ke put()
, tapi itu akan merusak ukuran buffer maksimum dan memunculkan sesuatu seperti "ORU-10028:line length overflow, limit of 32767 bytes per line".
Daripada membaca dalam potongan 32k tetap, Anda bisa membaca satu baris pada satu waktu; CLOB tidak benar-benar memahami baris seperti itu, tetapi Anda dapat mencari jeda baris, seperti:
WHILE pos < v_clob_length LOOP
-- read to next newline if there is one, rest of CLOB if not
if dbms_lob.instr(v_clob, chr(10), pos) > 0 then
amount := dbms_lob.instr(v_clob, chr(10), pos) - pos;
dbms_lob.read(v_clob, amount, pos, buffer);
pos := pos + amount + 1; -- skip newline character
else
amount := 32767;
dbms_lob.read(v_clob, amount, pos, buffer);
pos := pos + amount;
end if;
dbms_output.put_line(buffer);
END LOOP;
if
mencari karakter baris baru, setelah posisi saat ini. Jika menemukan satu maka jumlahnya dihitung sebagai jumlah karakter dari posisi saat ini ke baris baru itu (atau lebih tepatnya, minus satu - karena Anda tidak menginginkan baris baru itu sendiri), ia membaca banyak karakter, dan kemudian menyesuaikan posisi dengan jumlah yang dibaca plus satu (untuk melewati baris baru - yang tidak Anda inginkan/butuhkan sebagai put_line()
menambahkan satu lagi).
Jika tidak menemukannya maka terbaca hingga 32k - semoga hanya sekali; jika ada lebih dari itu karakter yang tersisa tanpa jeda baris maka itu akan melakukan pembacaan kedua tetapi masih menambahkan baris baru ekstra jahat itu dan memutus baris itu. Tidak banyak yang dapat Anda lakukan dengan menggunakan dbms_output
meskipun, Anda harus beralih ke utl_file
menulis ke server alih-alih menggulung ke klien.