Penanganan Pengecualian di Oracle PL/SQL (Contoh)

Apa itu Penanganan Pengecualian di PL/SQL?

Pengecualian terjadi ketika mesin PL/SQL menemukan instruksi yang tidak dapat dijalankan karena kesalahan yang terjadi pada saat run-time. Kesalahan ini tidak akan ditangkap pada saat kompilasi dan oleh karena itu kesalahan ini hanya perlu ditangani pada saat run-time.

Misalnya, jika mesin PL/SQL menerima instruksi untuk membagi angka apa pun dengan '0', maka mesin PL/SQL akan membuangnya sebagai pengecualian. Pengecualian hanya dimunculkan pada saat run-time oleh mesin PL/SQL.

Pengecualian akan menghentikan eksekusi program lebih lanjut, jadi untuk menghindari kondisi seperti itu, pengecualian tersebut perlu ditangkap dan ditangani secara terpisah. Proses ini disebut sebagai Penanganan Pengecualian, di mana pemrogram menangani pengecualian yang dapat terjadi pada saat dijalankan.

Sintaks Penanganan Pengecualian

Pengecualian ditangani pada level blok, yaitu, jika ada pengecualian yang terjadi di blok mana pun, maka kendali akan keluar dari bagian eksekusi blok tersebut. Pengecualian kemudian akan ditangani di bagian penanganan pengecualian dari blok itu. Setelah menangani pengecualian, tidak mungkin mengirim ulang kontrol kembali ke bagian eksekusi blok tersebut.

Sintaks di bawah ini menjelaskan cara menangkap dan menangani pengecualian.

Penanganan Pengecualian di PL/SQL

BEGIN
<execution block>
.
.
EXCEPTION
WHEN <exceptionl_name>
THEN
  <Exception handling code for the “exception 1 _name’' >
WHEN OTHERS
THEN
  <Default exception handling code for all exceptions >
END;

Penjelasan Sintaks:

  • Dalam sintaks di atas, blok penanganan pengecualian berisi rangkaian kondisi WHEN untuk menangani pengecualian.
  • Setiap kondisi WHEN diikuti oleh nama pengecualian yang diperkirakan akan dimunculkan pada saat run time.
  • Ketika pengecualian apa pun dimunculkan saat runtime, maka mesin PL/SQL akan mencari bagian penanganan pengecualian untuk pengecualian tersebut. Ini akan dimulai dari klausa 'WHEN' pertama dan secara berurutan akan mencari.
  • Jika ditemukan penanganan eksepsi untuk eksepsi yang dimunculkan, maka ia akan mengeksekusi bagian kode penanganan tersebut.
  • Jika tidak ada klausa 'WHEN' yang ada untuk pengecualian yang dimunculkan, maka mesin PL/SQL akan mengeksekusi bagian 'WHEN OTHERS' (jika ada). Hal ini biasa terjadi pada semua pengecualian.
  • Setelah mengeksekusi pengecualian, kontrol bagian akan keluar dari blok saat ini.
  • Hanya satu bagian pengecualian yang dapat dieksekusi untuk satu blok pada saat run-time. Setelah menjalankannya, pengontrol akan melewati bagian penanganan pengecualian yang tersisa dan akan keluar dari blok saat ini.

Catatan: KETIKA LAINNYA harus selalu berada di posisi terakhir urutan. Bagian penanganan pengecualian yang ada setelah WHEN OTHERS tidak akan pernah dieksekusi karena kontrol akan keluar dari blok setelah mengeksekusi WHEN OTHERS.

Jenis Pengecualian

Ada dua jenis Pengecualian di Tolong/SQL.

  1. Pengecualian yang Telah Ditentukan Sebelumnya
  2. Pengecualian Buatan Pengguna

Pengecualian yang Telah Ditentukan Sebelumnya

Oracle telah menetapkan beberapa pengecualian umum. Pengecualian ini memiliki nama pengecualian dan nomor kesalahan yang unik. Pengecualian ini sudah ditentukan dalam paket 'STANDAR' di Oracle. Dalam kode, kita bisa langsung menggunakan nama pengecualian yang telah ditentukan sebelumnya untuk menanganinya.

Di bawah ini adalah beberapa pengecualian yang telah ditentukan sebelumnya

Pengecualian Kode kesalahan Alasan Pengecualian
ACCESS_INTO_NULL ORA-06530 Tetapkan nilai pada atribut objek yang tidak diinisialisasi
KASUS_NOT_FOUND ORA-06592 Tak satu pun dari klausa 'WHEN' dalam pernyataan CASE terpenuhi dan tidak ada klausa 'ELSE' yang ditentukan
COLLECTION_IS_NULL ORA-06531 Menggunakan metode pengumpulan (kecuali EXISTS) atau mengakses atribut koleksi pada koleksi yang tidak diinisialisasi
CURSOR_ALREADY_OPEN ORA-06511 Mencoba membuka a kursor yang sudah dibuka
DUP_VAL_ON_INDEX ORA-00001 Menyimpan nilai duplikat dalam kolom database yang dibatasi oleh indeks unik
INVALID_CURSOR ORA-01001 Operasi kursor ilegal seperti menutup kursor yang belum dibuka
INVALID_NUMBER ORA-01722 Konversi karakter menjadi angka gagal karena karakter angka tidak valid
NO_DATA_FOUND ORA-01403 Ketika pernyataan 'SELECT' yang berisi klausa INTO tidak mengambil baris.
ROW_MISMATCH ORA-06504 Ketika tipe data variabel kursor tidak kompatibel dengan tipe pengembalian kursor sebenarnya
SUBSCRIPT_BEYOND_COUNT ORA-06533 Merujuk koleksi dengan nomor indeks yang lebih besar dari ukuran koleksi
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Merujuk koleksi berdasarkan nomor indeks yang berada di luar rentang hukum (misalnya: -1)
TOO_MANY_ROWS ORA-01422 Ketika pernyataan 'SELECT' dengan klausa INTO mengembalikan lebih dari satu baris
VALUE_ERROR ORA-06502 Kesalahan batasan aritmatika atau ukuran (misalnya: memberikan nilai ke variabel yang lebih besar dari ukuran variabel)
ZERO_DIVIDE ORA-01476 Membagi angka dengan '0'

Pengecualian Buatan Pengguna

In Oracle, selain pengecualian yang telah ditentukan sebelumnya, pemrogram dapat membuat pengecualiannya sendiri dan menanganinya. Mereka dapat dibuat pada tingkat subprogram di bagian deklarasi. Pengecualian ini hanya terlihat di subprogram tersebut. Pengecualian yang didefinisikan dalam spesifikasi paket adalah pengecualian publik, dan ini terlihat di mana pun paket dapat diakses.

sintaks: Pada tingkat subprogram

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • Dalam sintaks di atas, variabel 'Exception_name' didefinisikan sebagai tipe 'EXCEPTION'.
  • Ini dapat digunakan dengan cara yang sama seperti pengecualian yang telah ditentukan sebelumnya.

sintaks:Pada tingkat Spesifikasi Paket

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • Dalam sintaks di atas, variabel 'Exception_name' didefinisikan sebagai tipe 'EXCEPTION' dalam spesifikasi paket .
  • Ini dapat digunakan dalam database dimanapun paket 'nama_paket' dapat dipanggil.

PL/SQL Naikkan Pengecualian

Semua pengecualian yang telah ditentukan sebelumnya dimunculkan secara implisit setiap kali kesalahan terjadi. Namun pengecualian yang ditentukan pengguna perlu dimunculkan secara eksplisit. Hal ini dapat dicapai dengan menggunakan kata kunci 'RAISE'. Ini dapat digunakan dengan salah satu cara yang disebutkan di bawah.

Jika 'RAISE' digunakan secara terpisah dalam program, maka itu akan menyebarkan pengecualian yang sudah dimunculkan ke blok induk. Hanya di blok pengecualian yang dapat digunakan seperti yang ditunjukkan di bawah ini.

PL/SQL Naikkan Pengecualian

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Penjelasan Sintaks:

  • Dalam sintaks di atas, kata kunci RAISE digunakan di blok penanganan pengecualian.
  • Setiap kali program menemukan pengecualian “nama_pengecualian”, pengecualian tersebut ditangani dan akan diselesaikan secara normal
  • Tapi kata kunci 'RAISE' di bagian penanganan pengecualian akan menyebarkan pengecualian khusus ini ke program induk.

Catatan: Saat memunculkan pengecualian pada blok induk, pengecualian yang dimunculkan juga harus terlihat di blok induk, jika tidak, oracle akan memunculkan kesalahan.

  • Kita dapat menggunakan kata kunci 'RAISE' diikuti dengan nama pengecualian untuk memunculkan pengecualian yang ditentukan pengguna/yang telah ditentukan sebelumnya. Ini dapat digunakan di bagian eksekusi dan bagian penanganan pengecualian untuk memunculkan pengecualian.

PL/SQL Naikkan Pengecualian

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

Penjelasan Sintaks:

  • Dalam sintaks di atas, kata kunci RAISE digunakan di bagian eksekusi diikuti dengan pengecualian “nama_pengecualian”.
  • Hal ini akan memunculkan pengecualian khusus ini pada saat eksekusi, dan ini perlu ditangani atau dimunculkan lebih lanjut.

Contoh 1: Dalam contoh ini, kita akan melihatnya

  • Cara mendeklarasikan pengecualian
  • Cara memunculkan pengecualian yang dinyatakan dan
  • Cara menyebarkannya ke blok utama

PL/SQL Naikkan Pengecualian

PL/SQL Naikkan Pengecualian

DECLARE
Sample_exception EXCEPTION;
PROCEDURE nested_block
IS
BEGIN
Dbms_output.put_line(‘Inside nested block’);
Dbms_output.put_line(‘Raising sample_exception from nested block’);
RAISE sample_exception;
EXCEPTION
WHEN sample_exception THEN 
Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’);
RAISE,
END;
BEGIN
Dbms_output.put_line(‘Inside main block’);
Dbms_output.put_line(‘Calling nested block’);
Nested_block;
EXCEPTION
WHEN sample_exception THEN	
Dbms_output.put_line (‘Exception captured in main block');
END:
/

Penjelasan Kode:

  • Baris kode 2: Mendeklarasikan variabel 'sample_Exception' sebagai tipe EXCEPTION.
  • Baris kode 3: Mendeklarasikan prosedur nested_block.
  • Baris kode 6: Mencetak pernyataan “Di dalam blok bersarang”.
  • Baris kode 7: Mencetak pernyataan “Meningkatkan sample_Exception dari blok bersarang.”
  • Baris kode 8: Menaikkan pengecualian menggunakan 'RAISE sample_Exception'.
  • Baris kode 10: Penangan pengecualian untuk pengecualian sample_Exception di blok bersarang.
  • Baris kode 11: Mencetak pernyataan 'Pengecualian ditangkap di blok bersarang. Naik ke blok utama'.
  • Baris kode 12: Menaikkan pengecualian ke blok utama (menyebar ke blok utama).
  • Baris kode 15: Mencetak pernyataan “Di dalam blok utama”.
  • Baris kode 16: Mencetak pernyataan “Memanggil blok bersarang”.
  • Baris kode 17: Memanggil prosedur nested_block.
  • Baris kode 18: Pengecualian
  • Baris kode 19: Penangan pengecualian untuk sample_Exception di blok utama.
  • Baris kode 20: Mencetak pernyataan “Pengecualian ditangkap di blok utama.”

Poin penting yang perlu diperhatikan dalam Pengecualian

  • Dalam fungsinya, pengecualian harus selalu mengembalikan nilai atau meningkatkan pengecualian lebih lanjut. kalau tidak Oracle akan memunculkan kesalahan 'Fungsi dikembalikan tanpa nilai' saat run-time.
  • Pernyataan kontrol transaksi dapat diberikan di blok penanganan pengecualian.
  • SQLERRM dan SQLCODE adalah fungsi bawaan yang akan memberikan pesan dan kode pengecualian.
  • Jika pengecualian tidak ditangani maka secara default semua transaksi aktif di sesi tersebut akan dibatalkan.
  • RAISE_APPLICATION_ERROR (- , ) dapat digunakan sebagai pengganti RAISE untuk memunculkan kesalahan pada kode dan pesan pengguna. Kode kesalahan harus lebih besar dari 20000 dan diawali dengan '-'.

Kesimpulan

Setelah bab ini, Anda harus dapat bekerja untuk aspek-aspek berikut dari Pl SQL pengecualian

  • Menangani pengecualian
  • Tentukan pengecualian
  • Ajukan pengecualian
  • Propagasi pengecualian