Sebuah kursor adalah penunjuk ke area konteks ini. PL/SQL mengendalikan area konteks melalui kursor. Sebuah kursor menyimpan baris-baris (satu atau lebih) yang dikembalikan oleh pernyataan SQL. Kumpulan baris yang disimpan oleh kursor disebut sebagai himpunan aktif.
Anda dapat memberi nama pada sebuah kursor agar dapat diacu dalam program untuk mengambil dan memproses baris-baris yang dikembalikan oleh pernyataan SQL, satu per satu. Ada dua jenis kursor:
- Kursor Implisit: Kursor ini secara otomatis diberikan oleh PL/SQL ketika sebuah pernyataan SQL dijalankan. Kursor implisit digunakan untuk mengambil dan memproses baris-baris yang dikembalikan oleh pernyataan SQL tunggal.
- Kursor Eksplisit: Kursor ini didefinisikan secara eksplisit oleh pengembang program. Pengembang memberikan nama pada kursor ini dan mengontrol langkah-langkah pengambilan dan pemrosesan baris-baris yang dikembalikan oleh pernyataan SQL yang terkait.
Implicit Cursors
Kursor implisit secara otomatis dibuat oleh Oracle setiap kali sebuah pernyataan SQL dieksekusi, ketika tidak ada kursor eksplisit untuk pernyataan tersebut. Para programmer tidak dapat mengontrol kursor implisit dan informasi yang ada di dalamnya.
Setiap kali sebuah pernyataan DML (INSERT, UPDATE, dan DELETE) dikeluarkan, sebuah kursor implisit terkait dengan pernyataan tersebut. Untuk operasi INSERT, kursor tersebut menyimpan data yang perlu diinsert. Untuk operasi UPDATE dan DELETE, kursor tersebut mengidentifikasi baris-baris yang akan terpengaruh.
Dalam PL/SQL, Anda dapat merujuk ke kursor implisit terbaru sebagai kursor SQL, yang selalu memiliki atribut seperti %FOUND, %ISOPEN, %NOTFOUND, dan %ROWCOUNT. Kursor SQL memiliki atribut tambahan, yaitu %BULK_ROWCOUNT dan %BULK_EXCEPTIONS, yang dirancang untuk digunakan dengan pernyataan FORALL. Tabel berikut memberikan deskripsi dari atribut yang paling sering digunakan −
Atribut | Deskripsi |
---|---|
%FOUND | Bernilai TRUE jika pernyataan SQL terakhir menghasilkan setidaknya satu baris data. |
%ISOPEN | Bernilai TRUE jika kursor SQL sedang terbuka. |
%NOTFOUND | Bernilai TRUE jika pernyataan SQL terakhir tidak menghasilkan baris data. |
%ROWCOUNT | Mengembalikan jumlah baris yang terpengaruh oleh pernyataan SQL terakhir. |
%BULK_ROWCOUNT | Mengembalikan array berisi jumlah baris yang terpengaruh oleh operasi FORALL dalam kelompok. |
%BULK_EXCEPTIONS | Mengembalikan array yang berisi informasi pengecualian untuk operasi FORALL dalam kelompok. |
Dengan menggunakan atribut-atribut ini, Anda dapat memeriksa dan mengelola hasil dari pernyataan SQL terakhir yang dieksekusi secara implisit dalam program PL/SQL.
Contoh
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
Program berikut akan memperbarui tabel dan meningkatkan gaji setiap pelanggan sebesar 500 dan menggunakan atribut SQL%ROWCOUNT untuk menentukan jumlah baris yang terpengaruh
DECLARE total_rows number(2); BEGIN UPDATE customers SET salary = salary + 500; IF sql%notfound THEN dbms_output.put_line('no customers selected'); ELSIF sql%found THEN total_rows := sql%rowcount; dbms_output.put_line( total_rows || ' customers selected '); END IF; END; /
Jika Anda memeriksa catatan dalam tabel customers, Anda akan menemukan bahwa baris-baris telah diperbarui −
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2500.00 | | 2 | Khilan | 25 | Delhi | 2000.00 | | 3 | kaushik | 23 | Kota | 2500.00 | | 4 | Chaitali | 25 | Mumbai | 7000.00 | | 5 | Hardik | 27 | Bhopal | 9000.00 | | 6 | Komal | 22 | MP | 5000.00 | +----+----------+-----+-----------+----------+
Explicit Cursors
Kursor eksplisit adalah kursor yang didefinisikan oleh programmer untuk mendapatkan lebih banyak kontrol atas area konteks. Sebuah kursor eksplisit harus didefinisikan dalam bagian deklarasi dari blok PL/SQL. Kursor ini dibuat pada Pernyataan SELECT yang mengembalikan lebih dari satu baris.
Berikut adalah sintaks untuk membuat kursor eksplisit −
CURSOR cursor_name IS select_statement;
Menggunakan kursor eksplisit melibatkan langkah-langkah berikut:
- Mendeklarasikan kursor untuk menginisialisasi memori.
- Membuka kursor untuk mengalokasikan memori.
- Mengambil baris dari kursor untuk mengambil data.
- Menutup kursor untuk membebaskan memori yang dialokasikan.
Berikut adalah contoh penggunaan kursor eksplisit dalam blok PL/SQL:
DECLARE -- Deklarasi kursor eksplisit CURSOR cursor_name IS SELECT column1, column2, ... FROM table_name WHERE condition; -- Deklarasi variabel untuk menyimpan data yang diambil dari kursor variable1 table_name.column1%TYPE; variable2 table_name.column2%TYPE; ... BEGIN -- Membuka kursor OPEN cursor_name; -- Mengambil baris pertama dari kursor FETCH cursor_name INTO variable1, variable2, ...; -- Looping melalui baris-baris yang dikembalikan oleh kursor LOOP -- Melakukan operasi atau pemrosesan pada baris yang diambil -- menggunakan nilai-nilai yang disimpan dalam variabel -- Mengambil baris berikutnya dari kursor FETCH cursor_name INTO variable1, variable2, ...; -- Exit loop jika tidak ada baris lagi EXIT WHEN cursor_name%NOTFOUND; END LOOP; -- Menutup kursor CLOSE cursor_name; END; /
Sumber https://www.tutorialspoint.com/plsql/plsql_cursors.htm