Interaksi PL/SQL dengan Oracle

6.6.2. Pengenalan Impicit Cursor Attributes

Implicit cursor attributes menghasilkan informasi tentang eksekusi dari perintah INSERT, UPDATE, DELETE, atau SELECT INTO. Nilai-nilai dari cursor attributes selalu mengacu kepada perintah SQL yang paling akhir dieksekusi. Sebelum Oracle membuka cursor SQL, implicit cursor attributes menghasilkan NULL.

Catatan: SQL cursor memiliki attribute lain, %BULK_ROWCOUNT, didesain untuk menggunakan perintah FORALL.

6.6.2.1. %FOUND Attribute: Apakah Perintah DML Mengubah Baris Data?

Sampai perintah manipulasi data SQL dieksekusi, %FOUNG menghasilkan NULL. Kemudian, %FOUND menghasilkan TRUE jika perintah INSERT, UPDATE, atau DELETE berpengaruh terhadap satu atau lebih baris data, atau perintah SELECT INTO menghasilkan satu atau lebih baris data. Sebaliknya, %FOUND menghasilkan FALSE.

Dalam contoh berikut ini, kita menggunakan %FOUND untuk menambahkan baris data jika proses penghapusan berhasil:

DELETE FROM emp WHERE empno = my_empno;
IF SQL%FOUND THEN -- penghapusan berhasil
  INSERT INTO new_emp VALUES (my_empno, my_ename, ...);

6.6.2.2. %ISOPEN Attribute: Selalu FALSE untuk Implicit Cursors

Oracle menutup SQL cursor secara otomatis setelah mengeksekusi perintah SQL yang terkait dengannya. Sebagai hasilnya, %ISOPEN selalu menghasilkan FALSE.

6.6.2.3. %NOTFOUND Attribute: Apakah Perintah DML Gagal Mengubah Baris Data?

%NOTFOUND adalah lawan logikal dari %FOUND. %NOTFOUND menghasilkan TRUE jika perintah INSERT, UPDATE, atau DELETE tidak berpengaruh terhadap suatu baris data, atau perintah SELECT INTO tidak menghasilkan baris data. Sebaliknya, %NOTFOUND menghasilkan FALSE. Dalam contoh berikut ini, kita menggunakan %FOUND untuk menambahkan baris data jika proses penghapusan berhasil:

DELETE FROM emp WHERE empno = my_empno;
IF SQL%FOUND THEN -- penghapusan berhasil
  INSERT INTO new_emp VALUES (my_empno, my_ename, ...);

6.6.2.4. %ISOPEN Attribute: Selalu FALSE untuk Implicit Cursors

Oracle menutup SQL cursor secara otomatis setelah mengeksekusi perintah SQL terkait. Sebagai hasilnya, %ISOPEN selalu menghasilkan FALSE.

6.6.2.5. %NOTFOUND Attribute: Apakah Perintah DML Gagal Mengubah Baris Data?

%NOTFOUND merupakan lawan logikal dari %FOUND. %NOTFOUND menghasilkan TRUE jika perintah INSERT, UPDATE, atau DELETE tidak berpengaruh terhadap baris data, atau perintah SELECT INTO tidak menghasilkan baris data. Sebaliknya %NOTFOUND menghasilkan FALSE.

6.6.2.6. %ROWCOUNT Attribute: Berapa Banyak Baris Data yang Terpengaruh Sejauh Ini?

%ROWCOUNT menghasilkan jumlah baris data yang terpengaruh oleh perintah INSERT, UPDATE, atau DELETE, atau yang dihasilkan oleh perintah SELECT INTO. %ROWCOUNT menghasilkan 0 jika perintah INSERT, UPDATE, atau DELETE tidak berpengaruh terhadap baris data, atau perintah SELECT INTO tidak menghasilkan baris data. Dalam contoh berikut, kita menggunakan %ROWCOUNT untuk melakukan aksi jika lebih dari sepuluh baris data telah dihapus:

DELETE FROM emp WHERE ...
IF SQL%ROWCOUNT > 10 THEN -- lebih dari 10 baris data dihapus
  ...
END IF;

Jika perintah SELECT INTO menghasilkan lebih dari satu baris data, PL/SQL memunculkan predefined exception TOO_MANY_ROWS dan %ROWCOUNT menghasilkan 1, bukan jumlah baris aktual yang memenuhi query tersebut.

6.6.2.7. Pedoman Penggunaan Implicit Cursor Attributes

Nilai-nilai dari cursor attributes selalu mereferensi kepada perintah SQL yang paling akhir dieksekusi, dimanapun perintah itu. Mungkin saja berada pada jangkauan (scope) yang berbeda (sebagai contoh, di dalam sub-blok). Jadi, jika kita ingin menyimpan nilai attribute untuk penggunaan di lain waktu, maka segera berikanlah nilainya kepada variable bertipe Boolean. Dalam contoh berikut ini, mempercayakan kepada kondisi IF adalah berbahaya, karena procedure check_status mungkin telah mengubah nilai dari %NOTFOUND:

BEGIN
  ...
  UPDATE parts SET quantity = quantity - 1 WHERE partno = part_id;
  check_status(part_id); -- memanggil procedure
  IF SQL%NOTFOUND THEN -- berbahaya!
    ...
  END;
END;

 

Kita dapat mengubah kode di atas menjadi:

BEGIN
  ...
  UPDATE parts SET quantity = quantity - 1 WHERE partno = part_id;
  sql_notfound := SQL%NOTFOUND; -- memberikan nilai ke variable Boolean
  check_status(part_id);
  IF sql_notfound THEN ...
END;

Jika perintah SELECT INTO gagal menghasilkan baris data, PL/SQL memunculkan predefined exception NO_DATA_FOUND apakah kita mengecek %NOTFOUND pada baris terakhir ataupun tidak. Mari kita perhatikan contoh berikut ini:

BEGIN
  ...
  SELECT sal INTO my_sal FROM emp WHERE empno = my_empno;
  -- menyebabkan NO_DATA_FOUND
  IF SQL%NOTFOUND THEN – kondisi di test hanya jika false
    ... – aksi ini tidak pernah dilakukan
  END IF;

 

Pengecekan tersebut tidak berguna karena kondisi IF dites hanya ketika %NOTFOUND bernilai false. Ketika PL/SQL memunculkan NO_DATA_FOUND, eksekusi normal berhenti dan kontrol berpindah ke bagian exception-handling dari blok tersebut.

Namun, perintah SELECT INTO yang memanggil function agregat SQL tidak pernah memunculkan NO_DATA_FOUND karena function-function agregat selalu menghasilkan nilai atau null. Dalam kasus seperti ini, %NOTFOUND menghasilkan FALSE, seperti ditunjukkan oleh contoh berikut ini:

BEGIN
  ...
  SELECT MAX(sal) INTO my_sal FROM emp WHERE deptno = my_deptno;
  -- tidak pernah memunculkan NO_DATA_FOUND
  IF SQL%NOTFOUND THEN – selalu dites namun tidak pernah true
    ... – aksi ini tidak pernah dilakukan
  END IF;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN ... – tidak pernah terjadi

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

 

Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi.
Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma dsb. Harga Rp. 24.800,- (157 halaman)

 

Related Articles

 

Comments

[…] Interaksi PL/SQL dengan Oracle - 6,172 viewsFungsi Baris Tunggal - 4,245 viewsData Modelling dan Database Design - 3,954 viewsMengubah Table dan Constraint - 3,213 viewsTipe-tipe Data PL/SQL - 3,145 viewsPL/SQL Subprograms - 2,742 viewsMengontrol Akses User - 2,717 viewsCollections dan Records PL/SQL - 2,654 viewsMenampilkan Data - 2,572 viewsPendahuluan - 2,555 views […]

Leave a comment

(required)

(required)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word