Apa itu CURSOR dalam PL / SQL?
Kursor adalah penunjuk ke kawasan konteks ini. Oracle membuat kawasan konteks untuk memproses pernyataan SQL yang mengandungi semua maklumat mengenai pernyataan tersebut.
PL / SQL membolehkan pengaturcara mengawal kawasan konteks melalui kursor. Kursor menahan baris yang dikembalikan oleh pernyataan SQL. Kumpulan baris yang dipegang kursor disebut sebagai set aktif. Kursor ini juga boleh dinamakan sehingga dapat dirujuk dari tempat lain kod.
Dalam tutorial ini anda akan belajar-
- Kursor Tersirat
- Kursor Eksplisit
- Atribut Kursor
- UNTUK penyataan Loop Cursor
Kursor terdiri daripada dua jenis.
- Kursor Tersirat
- Kursor Eksplisit
Kursor Tersirat
Setiap kali operasi DML berlaku dalam pangkalan data, kursor tersirat dibuat yang menahan baris yang terjejas, dalam operasi tersebut. Kursor ini tidak dapat dinamakan dan, oleh itu ia tidak dapat dikendalikan atau dirujuk dari tempat lain kod. Kita hanya boleh merujuk kursor terbaru melalui atribut kursor.
Kursor Eksplisit
Pengaturcara dibenarkan untuk membuat kawasan konteks bernama untuk menjalankan operasi DML mereka untuk mendapatkan lebih banyak kawalan ke atasnya. Kursor eksplisit harus didefinisikan di bahagian deklarasi blok PL / SQL, dan dibuat untuk pernyataan 'SELECT' yang perlu digunakan dalam kod.
Berikut adalah langkah-langkah yang terlibat dalam bekerja dengan kursor eksplisit.
- Menyatakan kursor
Menyatakan kursor bermaksud membuat satu kawasan konteks yang dinamakan untuk pernyataan 'SELECT' yang ditentukan dalam bahagian deklarasi. Nama kawasan konteks ini sama dengan nama kursor.
- Kursor Pembukaan
Membuka kursor akan mengarahkan PL / SQL untuk memperuntukkan memori untuk kursor ini. Ini akan menjadikan kursor bersedia untuk mengambil rekod.
- Mengambil Data dari Kursor
Dalam proses ini, pernyataan 'SELECT' dijalankan dan baris yang diambil disimpan dalam memori yang diperuntukkan. Ini kini dipanggil sebagai set aktif. Mengambil data dari kursor adalah aktiviti peringkat rekod yang bermaksud kita dapat mengakses data dengan cara rakaman demi rekod.
Setiap penyataan pengambilan akan mengambil satu set aktif dan menyimpan maklumat rekod tersebut. Pernyataan ini sama dengan pernyataan 'SELECT' yang mengambil rekod dan memberikan kepada pemboleh ubah dalam klausa 'INTO', tetapi tidak akan memberikan pengecualian.
- Menutup Kursor
Setelah semua rekod diambil sekarang, kita perlu menutup kursor supaya memori yang diperuntukkan ke kawasan konteks ini akan dilepaskan.
Sintaks:
DECLARECURSORIS
- Dalam sintaks di atas, bahagian deklarasi mengandungi deklarasi kursor dan pemboleh ubah kursor di mana data yang diambil akan diberikan.
- Kursor dibuat untuk pernyataan 'SELECT' yang diberikan dalam deklarasi kursor.
- Pada bagian pelaksanaan, kursor yang dinyatakan dibuka, diambil dan ditutup.
Atribut Kursor
Kursor tersirat dan kursor eksplisit mempunyai atribut tertentu yang dapat diakses. Atribut ini memberi lebih banyak maklumat mengenai operasi kursor. Berikut adalah atribut kursor yang berbeza dan penggunaannya.
Atribut Kursor | Penerangan |
% DITEMUKAN | Ia mengembalikan hasil Boolean 'BENAR' jika operasi pengambilan terbaru berjaya mengambil rekod, jika tidak, ia akan mengembalikan SALAH. |
%TIDAK DITEMUI | Ini berfungsi berlawanan dengan% FOUND, ia akan mengembalikan 'BENAR' jika operasi pengambilan terbaru tidak dapat mengambil sebarang rekod. |
%IA TERBUKA | Ia mengembalikan hasil Boolean 'BENAR' jika kursor yang diberikan sudah dibuka, yang lain akan mengembalikan 'PALSU' |
% ROWCOUNT | Ia mengembalikan nilai berangka. Ini memberikan jumlah sebenar rekod yang terjejas oleh aktiviti DML. |
Contoh 1 : Dalam contoh ini, kita akan melihat cara menyatakan, membuka, mengambil dan menutup kursor eksplisit.
Kami akan memproyeksikan semua nama pekerja dari jadual emp menggunakan kursor. Kami juga akan menggunakan atribut kursor untuk mengatur gelung untuk mengambil semua rekod 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:/
Pengeluaran
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Penjelasan Kod:
- Baris kod 2 : Menyatakan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
- Baris kod 3 : Menyatakan pemboleh ubah lv_emp_name.
- Baris kod 5 : Membuka kursor guru99_det.
- Baris kod 6: Menetapkan pernyataan gelung Asas untuk mengambil semua rekod dalam jadual 'emp'.
- Baris kod 7: Mendapatkan data guru99_det dan memberikan nilai kepada lv_emp_name.
- Baris kod 9: Menggunakan atribut kursor '% NOTFOUND' untuk mengetahui sama ada semua rekod dalam kursor diambil. Sekiranya diambil maka ia akan mengembalikan 'BENAR' dan kawalan akan keluar dari gelung, yang lain kawalan akan terus mengambil data dari kursor dan mencetak data.
- Baris kod 11: Keadaan EXIT untuk pernyataan gelung.
- Baris kod 12: Cetak nama pekerja yang diambil.
- Baris kod 14: Menggunakan atribut kursor '% ROWCOUNT' untuk mencari jumlah rekod yang terjejas / diambil dalam kursor.
- Baris kod 15: Setelah keluar dari gelung kursor ditutup dan memori yang diperuntukkan dibebaskan.
UNTUK penyataan Loop Cursor
Pernyataan "FOR LOOP" boleh digunakan untuk bekerja dengan kursor. Kita boleh memberikan nama kursor dan bukannya had julat dalam pernyataan gelung FOR sehingga gelung akan berfungsi dari rakaman kursor pertama hingga rekod terakhir kursor. Pemboleh ubah kursor, pembukaan kursor, pengambilan dan penutupan kursor akan dilakukan secara implisit oleh gelung FOR.
Sintaks:
DECLARECURSORIS
- Dalam sintaks di atas, bahagian deklarasi mengandungi deklarasi kursor.
- Kursor dibuat untuk pernyataan 'SELECT' yang diberikan dalam deklarasi kursor.
- Pada bahagian pelaksanaan, kursor yang dinyatakan diatur dalam gelung FOR dan pemboleh ubah gelung 'I' akan berperilaku sebagai pemboleh ubah kursor dalam hal ini.
Contoh 1 : Dalam contoh ini, kami akan memproyeksikan semua nama pekerja dari jadual emp menggunakan gelung kursor-UNTUK.
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;/
Pengeluaran
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Penjelasan Kod:
- Baris kod 2 : Menyatakan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
- Baris kod 4 : Membina gelung 'FOR' untuk kursor dengan gelung pemboleh ubah lv_emp_name.
- Baris kod 5: Mencetak nama pekerja dalam setiap lelaran gelung.
- Baris kod 8: Keluar dari gelung
Catatan: Dalam gelung Kursor-FOR, atribut kursor tidak dapat digunakan sejak pembukaan, pengambilan dan penutupan kursor dilakukan secara tidak langsung oleh gelung FOR.