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

Prosedur Buffer overflow

Pertama, Anda biasanya tidak menggunakan DBMS_OUTPUT untuk penebangan. Secara umum akan jauh lebih masuk akal untuk menulis data ke tabel log terutama jika prosedur logging Anda didefinisikan sebagai transaksi otonom sehingga Anda dapat memantau data log saat prosedur sedang berjalan. DBMS_OUTPUT hanya akan ditampilkan setelah seluruh prosedur selesai dieksekusi pada titik yang umumnya tidak ada gunanya.

Terkait dengan poin pertama itu, mengandalkan DBMS_OUTPUT untuk menunjukkan kepada penelepon bahwa ada semacam pengecualian adalah praktik yang sangat buruk. Minimal, Anda ingin menaikkan kembali pengecualian yang dilemparkan sehingga Anda mendapatkan tumpukan kesalahan untuk men-debug masalah.

Kedua, ketika Anda mengaktifkan output, Anda harus menentukan ukuran buffer yang DBMS_OUTPUT dapat menulis ke. Tampaknya Anda telah mendeklarasikan buffer menjadi 20.000 byte yang merupakan default jika Anda hanya

SQL> set serveroutput on;

Anda dapat mengubahnya dengan menentukan ukuran tetapi ukuran maksimum dibatasi hingga 1.000.000 byte

SQL> set serveroutput on size 1000000;

Jika Anda berencana memperbarui 3 miliar baris dalam 1000 potongan baris, itu akan menjadi buffer yang terlalu kecil. Anda akan menghasilkan lebih dari 60 kali jumlah data dengan kode Anda saat ini. Jika Anda menggunakan 10.2 baik di klien maupun di server, Anda seharusnya dapat mengalokasikan buffer tak terbatas

SQL> set serveroutput on size unlimited;

tapi itu bukan pilihan di rilis sebelumnya.

Akhirnya, apakah Anda yakin bahwa Anda perlu menggunakan PL/SQL sejak awal? Tampaknya Anda dapat melakukan ini dengan lebih efisien hanya dengan menjalankan satu PEMBARUAN

UPDATE table_
   SET id = floor( seq/ 10000000000000 )
 WHERE id is null;

Itu jauh lebih sedikit kode, lebih mudah dibaca, dan akan lebih efisien daripada alternatif PL/SQL. Satu-satunya downside adalah bahwa tablespace UNDO Anda harus cukup besar untuk mengakomodasi UNDO yang dihasilkan tetapi memperbarui satu kolom dari NULL ke nilai numerik non-NULL seharusnya tidak menghasilkan UNDO sebanyak itu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbarui kolom dengan nilai Null

  2. Proses upgrade langkah demi langkah ke R12.2 Upgrade bagian -2 (Driver Upgrade Utama untuk R12.2.0)

  3. karakter arab tidak dimasukkan dengan benar (seperti ????) di database Oracle?

  4. Bagaimana cara membatasi jumlah baris yang dikembalikan dari Oracle di tingkat sumber data JDBC?

  5. Kapitalisasi Nama Hari dan Bulan Saat Memformat Tanggal di Oracle