PL/SQL Cursors – SMK Wahidin Arjawinangun


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:

  1. 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.
  2. 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 −

AtributDeskripsi
%FOUNDBernilai TRUE jika pernyataan SQL terakhir menghasilkan setidaknya satu baris data.
%ISOPENBernilai TRUE jika kursor SQL sedang terbuka.
%NOTFOUNDBernilai TRUE jika pernyataan SQL terakhir tidak menghasilkan baris data.
%ROWCOUNTMengembalikan jumlah baris yang terpengaruh oleh pernyataan SQL terakhir.
%BULK_ROWCOUNTMengembalikan array berisi jumlah baris yang terpengaruh oleh operasi FORALL dalam kelompok.
%BULK_EXCEPTIONSMengembalikan 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:

  1. Mendeklarasikan kursor untuk menginisialisasi memori.
  2. Membuka kursor untuk mengalokasikan memori.
  3. Mengambil baris dari kursor untuk mengambil data.
  4. 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

Leave a Reply

Your email address will not be published. Required fields are marked *

v77slot