Oracle Kursor PL/SQL: Implisit, Eksplisit, For Loop dengan Contoh
Apa itu KURSOR di PL/SQL?
Kursor adalah penunjuk ke area konteks ini. Oracle menciptakan area konteks untuk memproses pernyataan SQL yang berisi semua informasi tentang pernyataan tersebut.
PL/SQL memungkinkan pemrogram untuk mengontrol area konteks melalui kursor. Kursor menahan baris yang dikembalikan oleh pernyataan SQL. Himpunan baris yang dipegang kursor disebut himpunan aktif. Kursor ini juga dapat diberi nama sehingga dapat dirujuk dari tempat lain dalam kode.
Kursor terdiri dari dua jenis.
- Kursor Tersirat
- Kursor Eksplisit
Kursor Tersirat
Setiap kali operasi DML terjadi di database, kursor implisit dibuat untuk menampung baris yang terpengaruh, dalam operasi tersebut. Kursor ini tidak dapat diberi nama dan karenanya tidak dapat dikontrol atau dirujuk dari tempat lain dalam kode. Kita hanya dapat merujuk ke kursor terbaru melalui atribut kursor.
Kursor Eksplisit
Pemrogram diperbolehkan membuat area konteks bernama untuk menjalankan operasi DML mereka guna mendapatkan kontrol lebih besar terhadapnya. Kursor eksplisit harus ditentukan di bagian deklarasi blok PL/SQL, dan itu dibuat untuk pernyataan 'SELECT' yang perlu digunakan dalam kode.
Di bawah ini adalah langkah-langkah yang terlibat dalam bekerja dengan kursor eksplisit.
- Mendeklarasikan kursor Mendeklarasikan kursor berarti membuat satu area konteks bernama untuk pernyataan 'SELECT' yang didefinisikan di bagian deklarasi. Nama area konteks ini sama dengan nama kursor.
- Kursor PembukaMembuka kursor akan menginstruksikan PL / SQL untuk mengalokasikan memori untuk kursor ini. Ini akan membuat kursor siap untuk mengambil catatan.
- Mengambil Data dari KursorDalam proses ini, pernyataan 'SELECT' dijalankan dan baris yang diambil disimpan dalam memori yang dialokasikan. Ini sekarang disebut sebagai set aktif. Mengambil data dari kursor adalah aktivitas tingkat rekaman yang berarti kita dapat mengakses data dengan cara rekaman demi rekaman. Setiap pernyataan pengambilan akan mengambil satu set aktif dan menyimpan informasi dari catatan tertentu. Pernyataan ini sama dengan pernyataan 'SELECT' yang mengambil record dan menugaskannya ke variabel dalam klausa 'INTO', namun tidak akan memunculkan pengecualian apa pun.
- Menutup KursorSetelah semua rekaman diambil sekarang, kita perlu menutup kursor sehingga memori yang dialokasikan ke area konteks ini akan dilepaskan.
Sintaksis
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- Dalam sintaks di atas, bagian deklarasi berisi deklarasi kursor dan variabel kursor di mana data yang diambil akan ditugaskan.
- Kursor dibuat untuk pernyataan 'PILIH' yang diberikan dalam deklarasi kursor.
- Pada bagian eksekusi, kursor yang dideklarasikan dibuka, diambil dan ditutup.
Atribut Kursor
Baik kursor implisit maupun kursor eksplisit memiliki atribut tertentu yang dapat diakses. Atribut ini memberikan informasi lebih lanjut tentang operasi kursor. Di bawah ini adalah berbagai atribut kursor dan penggunaannya.
Atribut Kursor | Description |
---|---|
%DITEMUKAN | Ia mengembalikan hasil Boolean 'TRUE' jika operasi pengambilan terbaru berhasil mengambil rekaman, jika tidak, ia akan mengembalikan FALSE. |
%TIDAK DITEMUKAN | Ini bekerja berlawanan dengan %FOUND, ia akan mengembalikan 'TRUE' jika operasi pengambilan terbaru tidak dapat mengambil catatan apa pun. |
%TERBUKA | Ini mengembalikan hasil Boolean 'TRUE' jika kursor yang diberikan sudah dibuka, jika tidak maka akan mengembalikan 'FALSE' |
% ROWCOUNT | Ini mengembalikan nilai numerik. Ini memberikan jumlah sebenarnya dari catatan yang terpengaruh oleh aktivitas DML. |
Contoh Kursor Eksplisit:
Dalam contoh ini, kita akan melihat cara mendeklarasikan, membuka, mengambil, dan menutup kursor eksplisit.
Kami akan memproyeksikan semua nama karyawan dari tabel emp menggunakan kursor. Kami juga akan menggunakan atribut kursor untuk mengatur loop untuk mengambil semua catatan dari kursor.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name); END LOOP; Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT); CLOSE guru99_det; END: /
Keluaran
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Penjelasan Kode
- Baris kode 2: Mendeklarasikan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
- Baris kode 3: Mendeklarasikan variabel lv_emp_name.
- Baris kode 5: Membuka kursor guru99_det.
- Baris kode 6: Menyetel pernyataan loop Dasar untuk mengambil semua catatan di tabel 'emp'.
- Baris kode 7: Mengambil data guru99_det dan menetapkan nilainya ke lv_emp_name.
- Baris kode 9: Menggunakan atribut kursor '%NOTFOUND' untuk mengetahui apakah semua rekaman di kursor telah diambil. Jika diambil maka ia akan mengembalikan 'TRUE' dan kontrol akan keluar dari loop, jika tidak, kontrol akan terus mengambil data dari kursor dan mencetak datanya.
- Baris kode 11: Kondisi EXIT untuk pernyataan loop.
- Baris kode 12: Cetak nama karyawan yang diambil.
- Baris kode 14: Menggunakan atribut kursor '%ROWCOUNT' untuk menemukan jumlah total rekaman yang terpengaruh/diambil di kursor.
- Baris kode 15: Setelah keluar dari loop, kursor ditutup dan memori yang dialokasikan dibebaskan.
Pernyataan FOR Loop Cursor
Pernyataan “FOR LOOP” dapat digunakan untuk bekerja dengan kursor. Kita dapat memberikan nama kursor alih-alih batas rentang dalam pernyataan perulangan FOR sehingga perulangan akan bekerja dari rekaman pertama kursor hingga rekaman terakhir kursor. Variabel kursor, pembukaan kursor, pengambilan dan penutupan kursor akan dilakukan secara implisit oleh loop FOR.
Sintaksis
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- Pada sintaks di atas, bagian deklarasi berisi deklarasi kursor.
- Kursor dibuat untuk pernyataan 'PILIH' yang diberikan dalam deklarasi kursor.
- Pada bagian eksekusi, kursor yang dideklarasikan diatur dalam perulangan FOR dan variabel perulangan 'I' akan berperilaku sebagai variabel kursor dalam kasus ini.
Oracle Kursor untuk Contoh Loop:
Dalam contoh ini, kita akan memproyeksikan semua nama karyawan dari tabel emp menggunakan loop kursor-FOR.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name); END LOOP; END; /
Keluaran
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Penjelasan Kode
- Baris kode 2: Mendeklarasikan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
- Baris kode 4: Membuat loop 'FOR' untuk kursor dengan variabel loop lv_emp_name.
- Baris kode 5: Mencetak nama karyawan di setiap iterasi loop.
- Baris kode 8: Keluar dari lingkaran
Catatan: Dalam loop Cursor-FOR, atribut kursor tidak dapat digunakan karena pembukaan, pengambilan, dan penutupan kursor dilakukan secara implisit oleh UNTUK lingkaran.