Oracle PL / SQL BULK COLLECT: Contoh FORALL

Daftar Isi:

Anonim

Apa itu BULK COLLECT?

BULK COLLECT mengurangi pengalihan konteks antara mesin SQL dan PL / SQL dan memungkinkan mesin SQL untuk mengambil catatan sekaligus.

Oracle PL / SQL menyediakan fungsionalitas untuk mengambil record secara massal daripada mengambil satu per satu. BULK COLLECT ini dapat digunakan dalam pernyataan 'PILIH' untuk mengisi catatan secara massal atau mengambil kursor secara massal. Karena BULK COLLECT mengambil record dalam BULK, klausa INTO harus selalu berisi variabel tipe collection. Keuntungan utama menggunakan BULK COLLECT adalah meningkatkan kinerja dengan mengurangi interaksi antara database dan mesin PL / SQL.

Sintaksis:

SELECT  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

Dalam sintaks di atas, BULK COLLECT digunakan untuk mengumpulkan data dari pernyataan 'SELECT' dan 'FETCH'.

Dalam tutorial ini Anda akan belajar-

  • Klausul FORALL
  • Klausa BATAS
  • BULK COLLECT Atribut

Klausul FORALL

FORALL memungkinkan untuk melakukan operasi DML pada data secara massal. Ini mirip dengan pernyataan perulangan FOR kecuali dalam perulangan FOR hal-hal terjadi pada tingkat rekaman sedangkan di FORALL tidak ada konsep LOOP. Sebaliknya, seluruh data yang ada dalam rentang tertentu diproses pada waktu yang sama.

Sintaksis:

FORALL in;

Dalam sintaks di atas, operasi DML yang diberikan akan dijalankan untuk seluruh data yang ada di antara rentang yang lebih rendah dan yang lebih tinggi.

Klausa BATAS

Konsep pengumpulan massal memuat seluruh data ke dalam variabel kumpulan target sebagai massal, yaitu seluruh data akan diisi ke dalam variabel kumpulan dalam sekali jalan. Tetapi hal ini tidak dianjurkan bila catatan total yang perlu dimuat sangat besar, karena ketika PL / SQL mencoba memuat seluruh data, ia menghabiskan lebih banyak memori sesi. Oleh karena itu, selalu baik untuk membatasi ukuran operasi pengumpulan massal ini.

Namun, batas ukuran ini dapat dengan mudah dicapai dengan memasukkan kondisi ROWNUM dalam pernyataan 'SELECT', sedangkan dalam kasus kursor, hal ini tidak memungkinkan.

Untuk mengatasi hal tersebut Oracle telah menyediakan klausa 'LIMIT' yang mendefinisikan jumlah record yang perlu disertakan secara massal.

Sintaksis:

FETCH  BULK COLLECT INTO  LIMIT ;

Pada sintaks di atas, pernyataan cursor fetch menggunakan pernyataan BULK COLLECT bersama dengan klausa LIMIT.

BULK COLLECT Atribut

Mirip dengan atribut kursor BULK COLLECT memiliki% BULK_ROWCOUNT (n) yang mengembalikan jumlah baris yang terpengaruh dalam pernyataan DML ke n dari pernyataan FORALL, yaitu akan memberikan jumlah catatan yang terpengaruh dalam pernyataan FORALL untuk setiap nilai tunggal dari koleksi variabel. Istilah 'n' menunjukkan urutan nilai dalam koleksi, yang membutuhkan jumlah baris.

Contoh 1 : Dalam contoh ini, kami akan memproyeksikan semua nama karyawan dari tabel emp menggunakan BULK COLLECT dan kami juga akan meningkatkan gaji semua karyawan sebesar 5.000 menggunakan FORALL.

DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);lv_emp_name lv_emp_name_tbl;BEGINOPEN guru99_det;FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;FOR c_emp_name IN lv_emp_name.FIRST… lv_emp_name.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/

Keluaran

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Penjelasan Kode:

  • Baris kode 2 : Mendeklarasikan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
  • Baris kode 3 : Mendeklarasikan lv_emp_name_tbl sebagai tipe tabel VARCHAR2 (50)
  • Baris kode 4 : Mendeklarasikan lv_emp_name sebagai jenis lv_emp_name_tbl.
  • Baris kode 6: Membuka kursor.
  • Baris kode 7: Mengambil kursor menggunakan BULK COLLECT dengan ukuran LIMIT sebagai variabel lv_emp_name 5000 intl.
  • Baris kode 8-11: Menyiapkan FOR loop untuk mencetak semua record dalam koleksi lv_emp_name.
  • Baris kode 12: Menggunakan FORALL memperbarui gaji semua karyawan sebesar 5000.
  • Baris kode 14: Melakukan transaksi.