Oracle Kursor PL/SQL: Implisit, Eksplisit, For Loop dengan Contoh

โšก Ringkasan Cerdas

Kursor di Oracle PL/SQL adalah penunjuk ke area konteks yang menyimpan baris yang dikembalikan oleh pernyataan SQL. Ada dua jenis: kursor implisit, yang dibuat secara otomatis untuk DML, dan kursor eksplisit, yang dideklarasikan dan dikendalikan oleh programmer.

  • ๐Ÿ“ Area Konteks: Kursor menunjuk ke area konteks yang menyimpan pernyataan SQL dan himpunan aktif yang dikembalikannya.
  • โš™๏ธ Kursor Tersirat: Oracle Membuka kursor implisit secara otomatis untuk setiap pernyataan DML dan SELECT INTO satu baris.
  • โœ‹ Kursor Eksplisit: Seorang programmer mendeklarasikan, membuka, mengambil, dan menutup kursor eksplisit untuk kontrol penuh.
  • ๐Ÿ”Ž Atribut Kursor: %FOUND, %NOTFOUND, %ISOPEN, dan %ROWCOUNT melaporkan status operasi terbaru.
  • ๐Ÿ” Perulangan FOR Kursor: Sebuah loop FOR membuka, mengambil, dan menutup kursor secara implisit, tanpa memerlukan langkah manual.
  • ๐Ÿค– Bantuan AI: Asisten AI seperti GitHub Copilot membuat draf perulangan kursor dan menandai kursor yang belum ditutup.

Oracle Kursor PL/SQL Implisit Eksplisit dan Perulangan FOR

Apa itu KURSOR di PL/SQL?

Kursor adalah penunjuk ke area konteks. Oracle menciptakan area konteks untuk memproses sebuah SQL pernyataan, dan area ini berisi semua informasi tentang pernyataan tersebut.

PL / SQL Memungkinkan programmer untuk mengontrol area konteks melalui kursor. Kursor menyimpan baris yang dikembalikan oleh pernyataan SQL, dan kumpulan baris yang dipegang kursor disebut sebagai himpunan aktif. Kursor ini juga dapat diberi nama sehingga dapat dirujuk dari tempat lain dalam kode.

Kursor ada dua jenis:

  • Kursor Tersirat
  • Kursor Eksplisit

Kursor Tersirat

Kapan pun Operasi DML Ketika suatu operasi terjadi di dalam basis data, kursor implisit akan dibuat yang menyimpan baris-baris yang terpengaruh dalam operasi tertentu tersebut. Kursor ini tidak dapat diberi nama dan, oleh karena itu, 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 mengeksekusi operasi DML mereka dan mendapatkan kontrol lebih besar atasnya. Kursor eksplisit harus didefinisikan di bagian deklarasi. blok PL/SQL, dan ini dibuat untuk pernyataan SELECT yang perlu digunakan dalam kode.

Berikut 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.
  • Membuka kursor: Membuka kursor memberi tahu PL/SQL untuk mengalokasikan memori untuk kursor ini. Ini membuat kursor siap untuk mengambil data.
  • Mengambil data dari kursor: Dalam proses ini, pernyataan SELECT dieksekusi dan baris yang diambil disimpan dalam memori yang dialokasikan. Ini sekarang disebut set aktif. Mengambil data dari kursor adalah aktivitas tingkat record, yang berarti kita dapat mengakses data secara record demi record. Setiap pernyataan pengambilan mengambil satu set aktif dan menyimpan informasi dari record tertentu tersebut. Pernyataan ini sama dengan pernyataan SELECT yang mengambil record dan menetapkannya ke variabel dalam klausa INTO, tetapi tidak akan menimbulkan pengecualian. pengecualian.
  • Menutup kursor: Setelah semua data diambil, kita perlu menutup kursor agar memori yang dialokasikan untuk area konteks ini dibebaskan.

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 tempat data yang diambil akan ditetapkan. Kursor dibuat untuk pernyataan SELECT 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-atribut ini memberikan informasi lebih lanjut tentang operasi kursor. Berikut adalah berbagai atribut kursor dan penggunaannya.

Atribut Kursor Deskripsi
%DITEMUKAN Mengembalikan nilai Boolean TRUE jika operasi pengambilan data terakhir berhasil mengambil data; jika tidak, mengembalikan FALSE.
%TIDAK DITEMUKAN Berfungsi berlawanan dengan %FOUND. Fungsi ini mengembalikan TRUE jika operasi pengambilan data terakhir tidak dapat mengambil data apa pun.
%TERBUKA Mengembalikan nilai Boolean TRUE jika kursor yang diberikan sudah terbuka; jika tidak, mengembalikan FALSE.
% ROWCOUNT Mengembalikan nilai numerik yang menunjukkan jumlah sebenarnya dari catatan yang terpengaruh atau diambil oleh operasi tersebut.

Contoh Kursor Eksplisit: Dalam contoh ini, kita akan melihat cara mendeklarasikan, membuka, mengambil, dan menutup kursor eksplisit. Kita akan memproyeksikan semua nama karyawan dari tabel emp menggunakan kursor. Kita juga akan menggunakan atribut kursor untuk mengatur perulangan agar mengambil semua catatan dari kursor.

Tangkapan layar di bawah ini menunjukkan contoh kursor eksplisit ini dan outputnya. Oracle.

Contoh kursor eksplisit untuk mengambil nama karyawan dari tabel emp di Oracle PL / SQL

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%ROWCOUNT);
CLOSE guru99_det;
END;
/

Keluaran

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY
Total rows fetched is 3

Code Penjelasan

  • Code baris 2: Mendeklarasikan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
  • Code baris 3: Mendeklarasikan variabel lv_emp_name dengan %Tipe terikat pada emp.emp_name.
  • Code baris 5: Membuka kursor guru99_det.
  • Code baris 6: Mengatur pernyataan perulangan dasar untuk mengambil semua catatan dalam tabel emp.
  • Code baris 7: Mengambil data guru99_det dan menetapkan nilainya ke lv_emp_name.
  • Code baris 8: Menggunakan atribut kursor %NOTFOUND untuk memeriksa apakah semua data dalam kursor telah diambil. Jika sudah diambil, fungsi akan mengembalikan TRUE dan kontrol keluar dari perulangan; jika belum, kontrol akan terus mengambil data dari kursor dan mencetaknya.
  • Code baris 10: Kondisi EXIT untuk pernyataan loop.
  • Code baris 12: Cetak nama karyawan yang diambil.
  • Code baris 14: Gunakan atribut kursor %ROWCOUNT untuk menemukan jumlah total catatan yang diambil oleh kursor.
  • Code baris 15: Setelah keluar dari loop, kursor ditutup dan memori yang dialokasikan dibebaskan.

Pernyataan FOR Loop Cursor

Kursor UNTUK lingkaran Dapat digunakan untuk bekerja dengan kursor. Kita dapat memberikan nama kursor sebagai pengganti batas rentang dalam pernyataan perulangan FOR, sehingga perulangan bekerja dari catatan pertama kursor hingga catatan terakhir kursor. Variabel kursor, pembukaan kursor, pengambilan, dan penutupan kursor semuanya dilakukan secara implisit oleh perulangan FOR.

Sintaksis

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
FOR I IN <cursor_name>
LOOP
.
.
END LOOP;
END;

Dalam sintaks di atas, bagian deklarasi berisi deklarasi kursor. Kursor dibuat untuk pernyataan SELECT yang diberikan dalam deklarasi kursor. Pada bagian eksekusi, kursor yang dideklarasikan diatur dalam loop FOR, dan variabel loop 'I' berperilaku sebagai variabel kursor dalam hal ini.

Oracle Contoh Perulangan Kursor: Dalam contoh ini, kita akan memproyeksikan semua nama karyawan dari tabel emp menggunakan perulangan 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

Code Penjelasan

  • Code baris 2: Mendeklarasikan kursor guru99_det untuk pernyataan 'SELECT emp_name FROM emp'.
  • Code baris 4: Membangun perulangan FOR untuk kursor dengan variabel perulangan lv_emp_name.
  • Code baris 6: Mencetak nama karyawan di setiap iterasi loop.
  • Code baris 7: Keluar dari perulangan (END LOOP).

Catatan: Dalam perulangan FOR kursor, atribut kursor tidak dapat digunakan, karena pembukaan, pengambilan, dan penutupan kursor dilakukan secara implisit oleh perulangan FOR.

Pertanyaan Umum Demo Slot

REF CURSOR (variabel kursor) adalah penunjuk ke kumpulan hasil kueri. Tidak seperti kursor statis, ia dapat membuka kueri yang berbeda pada saat runtime dan meneruskan hasilnya antar blok PL/SQL atau ke program klien.

Kursor normal mengambil satu baris per perintah FETCH, yang menyebabkan banyak peralihan konteks. KUMPULKAN SECARA MASSAL Memuat banyak baris ke dalam koleksi dalam satu kali pengambilan, mengurangi overhead secara signifikan pada kumpulan hasil yang besar.

Ya. Deklarasikan kursor berparameter seperti CURSOR c(dept NUMBER) IS SELECT โ€ฆ, lalu berikan nilai pada OPEN c(10). Parameter memungkinkan Anda menggunakan kembali satu definisi kursor dengan nilai filter yang berbeda.

FOR UPDATE mengunci baris yang dipilih kursor sehingga tidak ada orang lain yang dapat mengubahnya. WHERE CURRENT OF kemudian memperbarui atau menghapus baris yang baru saja diambil, tanpa mengulangi kondisi WHERE.

Kursor yang terbuka akan tetap menyimpan memori yang dialokasikan dan dihitung terhadap batas OPEN_CURSORS. Membiarkan banyak kursor terbuka pada akhirnya akan menimbulkan kesalahan ORA-01000: jumlah maksimum kursor terbuka terlampaui, jadi selalu TUTUP kursor eksplisit setelah digunakan.

Setiap perintah FETCH beralih antara mesin PL/SQL dan SQL. Ribuan peralihan konteks seperti itu akan terakumulasi, sehingga satu pernyataan SQL berbasis set atau BULK COLLECT biasanya memproses baris yang sama jauh lebih cepat.

Ya. Kopilot GitHub Draf ini secara eksplisit menambahkan loop OPEN, FETCH, dan CLOSE atau loop FOR kursor dari komentar, menambahkan pemeriksaan keluar %NOTFOUND, dan menyarankan nama atribut, meskipun Anda harus meninjau logikanya terlebih dahulu.

Asisten AI menandai perulangan kursor baris demi baris yang berpotensi menjadi SQL berbasis set atau BULK COLLECT, mendeteksi kursor yang belum ditutup, dan menjelaskan perilaku %atribut. Tinjauan pembelajaran mesin ini meningkatkan kinerja sebelum kode mencapai tahap produksi.

Ringkaslah postingan ini dengan: