Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Baris baru yang tidak diinginkan saat mengumpulkan hasil sqlplus ke file xml

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah ada alasan untuk menggunakan kunci utama dan kunci unik bersama-sama di bidang yang sama?

  2. RETENSI LOB

  3. Gunakan kembali parameter dalam Pernyataan yang Disiapkan?

  4. PHP:oci_bind_by_name dan bidang stempel waktu menghasilkan ORA-01461:dapat mengikat nilai PANJANG hanya untuk dimasukkan ke dalam kolom PANJANG

  5. Apa alternatif MySQL untuk fungsi NEXT_DAY Oracle?