Oracle PL/SQL BULK COLLECT: Contoh FORALL
Apa itu KUMPULKAN MASSAL?
BULK COLLECT mengurangi peralihan konteks antara SQL dan mesin PL/SQL dan memungkinkan mesin SQL mengambil catatan sekaligus.
Oracle PL/SQL menyediakan fungsionalitas untuk mengambil data secara massal daripada mengambil satu per satu. BULK COLLECT ini dapat digunakan dalam pernyataan 'SELECT' untuk mengisi catatan secara massal atau mengambil kursor secara massal. Karena BULK COLLECT mengambil record dalam BULK, klausa INTO harus selalu berisi variabel tipe koleksi. Keuntungan utama menggunakan BULK COLLECT adalah meningkatkan kinerja dengan mengurangi interaksi antara database dan mesin PL/SQL.
sintaks:
SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;
Dalam sintaks di atas, BULK COLLECT digunakan untuk mengumpulkan data dari pernyataan 'SELECT' dan 'FETCH'.
Klausul FORALL
FORALL memungkinkan untuk melakukan operasi DML pada data secara massal. Hal ini mirip dengan pernyataan perulangan FOR kecuali di UNTUK lingkaran banyak hal terjadi pada tingkat rekor sedangkan di FORALL tidak ada konsep LOOP. Sebaliknya seluruh data yang ada dalam rentang tertentu diproses pada waktu yang sama.
sintaks:
FORALL <loop_variable>in<lower range> .. <higher range> <DML operations>;
Dalam sintaks di atas, operasi DML yang diberikan akan dieksekusi untuk seluruh data yang ada antara rentang yang lebih rendah dan lebih tinggi.
Klausul BATAS
Konsep pengumpulan massal memuat seluruh data ke dalam variabel pengumpulan target secara massal, yaitu seluruh data akan diisi ke dalam variabel pengumpulan dalam sekali jalan. Namun hal ini tidak disarankan bila total record yang perlu dimuat sangat besar, karena bila PL / SQL mencoba memuat seluruh data sehingga menghabiskan lebih banyak memori sesi. Oleh karena itu, sebaiknya batasi 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 mungkin dilakukan.
Untuk mengatasi hal ini Oracle telah menyediakan klausa 'LIMIT' yang menentukan jumlah record yang perlu dimasukkan dalam jumlah besar.
sintaks:
FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;
Dalam sintaks di atas, pernyataan pengambilan kursor menggunakan pernyataan BULK COLLECT bersama dengan klausa LIMIT.
Atribut KUMPULKAN MASSAL
Mirip dengan kursor atribut BULK COLLECT memiliki %BULK_ROWCOUNT(n) yang mengembalikan jumlah baris yang terpengaruh dalam nth Pernyataan DML dari pernyataan FORALL, yaitu akan memberikan jumlah record yang terpengaruh dalam pernyataan FORALL untuk setiap nilai tunggal dari variabel koleksi. Istilah 'n' menunjukkan urutan nilai dalam koleksi, yang memerlukan jumlah baris.
Contoh 1: Dalam contoh ini, kita akan memproyeksikan semua nama karyawan dari tabel kosong menggunakan BULK COLLECT dan kita juga akan menaikkan gaji seluruh karyawan sebesar 5000 menggunakan FORALL.
DECLARE CURSOR 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; BEGIN OPEN 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.LAST LOOP Dbms_output.put_line(‘Employee Fetched:‘||c_emp_name); END LOOP: FORALL i IN lv_emp_name.FIRST .. lv emp_name.LAST UPDATE 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:BBB Employee Fetched:XXX Employee Fetched:YYY Salary 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 tipe lv_emp_name_tbl.
- Baris kode 6: Membuka kursor.
- Baris kode 7: Mengambil kursor menggunakan BULK COLLECT dengan ukuran LIMIT sebagai variabel 5000 intl lv_emp_name.
- Baris kode 8-11: Menyiapkan loop FOR untuk mencetak semua record dalam koleksi lv_emp_name.
- Baris kode 12: Menggunakan FORALL memperbarui gaji seluruh karyawan sebesar 5000.
- Baris kode 14: Melakukan transaksi.