Oracle PL/SQL BULK COLLECT: Contoh FORALL
⚡ Ringkasan Cerdas
PENGUMPULAN DALAM JUMLAH BESAR di Oracle PL/SQL mengambil banyak baris sekaligus ke dalam sebuah koleksi, sementara FORALL mengirimkan DML massal kembali ke basis data. Keduanya mengurangi peralihan konteks antara mesin SQL dan PL/SQL, sehingga meningkatkan kinerja.
Apa itu KUMPULKAN MASSAL?
BULK COLLECT mengurangi peralihan konteks di antara SQL dan mesin PL/SQL serta memungkinkan mesin SQL untuk mengambil data sekaligus.
Oracle PL / SQL menyediakan fungsi pengambilan data secara massal, bukan satu per satu. BULK COLLECT ini dapat digunakan dalam pernyataan SELECT untuk mengisi data secara massal, atau untuk mengambil data dalam jumlah besar. kursor secara massal. Karena BULK COLLECT mengambil data secara massal, klausa INTO harus selalu berisi variabel tipe koleksi. Keuntungan utama menggunakan BULK COLLECT adalah meningkatkan kinerja dengan mengurangi interaksi antara basis data dan mesin PL/SQL.
sintaks:
SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;
Dalam sintaks di atas, BULK COLLECT digunakan untuk mengumpulkan data dari pernyataan SELECT dan FETCH.
Klausul FORALL
Pernyataan FORALL melakukan Operasi DML pada data secara massal. Ini menyerupai pernyataan perulangan FOR, kecuali bahwa dalam perulangan FOR tindakan terjadi pada tingkat record, sedangkan dalam FORALL tidak ada konsep LOOP. Sebaliknya, seluruh data yang ada dalam rentang yang diberikan diproses secara bersamaan.
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 di antara rentang bawah dan atas.
Klausul BATAS
Konsep bulk collect memuat seluruh data ke dalam variabel koleksi target secara massal, yaitu seluruh data akan dimasukkan ke dalam variabel koleksi sekaligus. Namun, hal ini tidak disarankan ketika jumlah total record yang perlu dimuat sangat besar, karena ketika PL/SQL mencoba memuat seluruh data, ia akan mengonsumsi lebih banyak memori sesi. Oleh karena itu, selalu lebih baik untuk membatasi ukuran operasi bulk collect ini.
Batasan ukuran ini dapat dengan mudah dicapai dengan memperkenalkan kondisi ROWNUM dalam pernyataan SELECT, sedangkan dalam kasus kursor hal ini tidak mungkin dilakukan.
Untuk mengatasinya, Oracle telah menyediakan klausa LIMIT yang mendefinisikan jumlah catatan yang perlu disertakan dalam pemrosesan massal.
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 atribut kursor, BULK COLLECT memiliki %BULK_ROWCOUNT(n) yang mengembalikan jumlah baris yang terpengaruh dalam pernyataan DML ke-n dari pernyataan FORALL, yaitu memberikan jumlah catatan yang terpengaruh dalam pernyataan FORALL untuk setiap nilai dari variabel koleksi. Istilah 'n' menunjukkan urutan nilai dalam koleksi yang jumlah barisnya dibutuhkan.
Contoh 1: Dalam contoh ini, kita akan memproyeksikan semua nama karyawan dari tabel emp menggunakan BULK COLLECT, dan kita juga akan menaikkan gaji semua karyawan sebesar 5000 menggunakan FORALL.
Tangkapan layar di bawah ini menunjukkan contoh BULK COLLECT dan FORALL beserta outputnya. Oracle.
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 salary=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
Code Penjelasan:
- Code baris 2: Mendeklarasikan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
- Code baris 3: Mendeklarasikan lv_emp_name_tbl sebagai tipe tabel VARCHAR2(50).
- Code baris 4: Mendeklarasikan lv_emp_name sebagai tipe lv_emp_name_tbl.
- Code baris 6: Membuka kursor.
- Code baris 7: Mengambil kursor menggunakan BULK COLLECT dengan ukuran LIMIT 5000 ke dalam variabel lv_emp_name.
- Code baris 8-11: Membuat perulangan FOR untuk mencetak semua catatan dalam koleksi lv_emp_name.
- Code baris 12: Menggunakan FORALL untuk memperbarui gaji semua karyawan sebesar 5000.
- Code baris 14: Melakukan ..


