Apa CURSOR di PL / SQL?
Kursor adalah penunjuk ke area konteks ini. Oracle membuat area konteks untuk memproses pernyataan SQL yang berisi semua informasi tentang pernyataan tersebut.
PL / SQL memungkinkan programmer untuk mengontrol area konteks melalui kursor. Kursor menahan baris yang dikembalikan oleh pernyataan SQL. Kumpulan baris yang dipegang kursor disebut sebagai set aktif. Kursor ini juga dapat diberi nama sehingga dapat dirujuk dari tempat kode lain.
Dalam tutorial ini Anda akan belajar-
- Kursor Tersirat
- Kursor Eksplisit
- Atribut Kursor
- UNTUK pernyataan Kursor Loop
Kursor terdiri dari dua jenis.
- Kursor Tersirat
- Kursor Eksplisit
Kursor Tersirat
Setiap kali operasi DML terjadi dalam database, kursor implisit dibuat yang menahan baris yang terpengaruh, dalam operasi tersebut. Kursor ini tidak dapat dinamai dan, karenanya, tidak dapat dikontrol atau dirujuk dari tempat kode lain. Kita hanya dapat merujuk ke kursor terbaru melalui atribut kursor.
Kursor Eksplisit
Pemrogram diizinkan untuk membuat area konteks bernama untuk menjalankan operasi DML mereka untuk mendapatkan kontrol lebih besar atasnya. Kursor eksplisit harus ditentukan di bagian deklarasi blok PL / SQL, dan dibuat untuk pernyataan 'PILIH' 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 'PILIH' yang didefinisikan di bagian deklarasi. Nama area konteks ini sama dengan nama kursor.
- Membuka Kursor
Membuka kursor akan memerintahkan PL / SQL untuk mengalokasikan memori untuk kursor ini. Ini akan membuat kursor siap untuk mengambil catatan.
- Mengambil Data dari Kursor
Dalam 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 level record yang artinya kita dapat mengakses data dengan cara record-by-record.
Setiap pernyataan pengambilan akan mengambil satu set aktif dan menyimpan informasi dari catatan tertentu itu. Pernyataan ini sama dengan pernyataan 'SELECT' yang mengambil record dan diberikan ke variabel dalam klausa 'INTO', tetapi tidak akan memberikan pengecualian apa pun.
- Menutup Kursor
Setelah semua record diambil sekarang, kita perlu menutup kursor sehingga memori yang dialokasikan ke area konteks ini akan dilepaskan.
Sintaksis:
DECLARECURSORIS
- Dalam sintaks di atas, bagian deklarasi berisi deklarasi kursor dan variabel kursor di mana data yang diambil akan ditempatkan.
- Kursor dibuat untuk pernyataan 'PILIH' yang diberikan dalam deklarasi kursor.
- Pada bagian eksekusi, kursor yang dideklarasikan dibuka, diambil dan ditutup.
Atribut Kursor
Kursor implisit dan kursor eksplisit memiliki atribut tertentu yang dapat diakses. Atribut ini memberikan lebih banyak informasi tentang operasi kursor. Di bawah ini adalah atribut kursor yang berbeda dan penggunaannya.
Atribut Kursor | Deskripsi |
%DITEMUKAN | Ini mengembalikan hasil Boolean 'TRUE' jika operasi pengambilan terbaru berhasil mengambil rekaman, jika tidak maka akan mengembalikan FALSE. |
%TIDAK DITEMUKAN | Ini bekerja berlawanan dengan% FOUND, ini akan mengembalikan 'TRUE' jika operasi pengambilan terbaru tidak dapat mengambil rekaman apa pun. |
%TERBUKA | Ini mengembalikan hasil Boolean 'TRUE' jika kursor yang diberikan sudah dibuka, jika tidak ia mengembalikan 'FALSE' |
% ROWCOUNT | Ini mengembalikan nilai numerik. Ini memberikan jumlah rekaman sebenarnya yang terpengaruh oleh aktivitas DML. |
Contoh 1 : 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 cursor untuk mengatur loop untuk mengambil semua record dari kursor.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal 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: Mengatur pernyataan loop dasar untuk mengambil semua record dalam tabel 'emp'.
- Baris kode 7: Mengambil data guru99_det dan menetapkan nilai ke lv_emp_name.
- Baris kode 9: Menggunakan atribut kursor '% NOTFOUND' untuk menemukan apakah semua catatan di kursor diambil. Jika diambil maka itu akan mengembalikan 'TRUE' dan kontrol akan keluar dari loop, jika tidak kontrol akan terus mengambil data dari kursor dan mencetak data.
- 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 record yang terpengaruh / diambil di kursor.
- Baris kode 15: Setelah keluar dari loop, kursor ditutup dan memori yang dialokasikan dibebaskan.
UNTUK pernyataan Kursor Loop
Pernyataan "FOR LOOP" dapat digunakan untuk bekerja dengan kursor. Kita bisa memberi nama kursor sebagai ganti batas jangkauan dalam pernyataan perulangan FOR sehingga pengulangan akan bekerja dari rekaman pertama kursor ke rekaman terakhir kursor. Variabel kursor, pembukaan kursor, pengambilan dan penutupan kursor akan dilakukan secara implisit oleh loop FOR.
Sintaksis:
DECLARECURSORIS
- Dalam 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 FOR loop dan variabel loop 'I' akan berperilaku sebagai variabel kursor dalam kasus ini.
Contoh 1 : Dalam contoh ini, kami akan memproyeksikan semua nama karyawan dari tabel emp menggunakan loop Cursor-FOR.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Keluaran
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Penjelasan Kode:
- Baris kode 2 : Mendeklarasikan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
- Baris kode 4 : Membangun 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 loop
Catatan: Dalam loop Cursor-FOR, atribut kursor tidak dapat digunakan karena pembukaan, pengambilan, dan penutupan kursor dilakukan secara implisit oleh loop FOR.