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.
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.
- Pengecualian yang Telah Ditentukan Sebelumnya
- 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.
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.
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
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