Penanganan Pengecualian di Oracle PL/SQL (Contoh)
⚡ Ringkasan Cerdas
Penanganan pengecualian di Oracle PL/SQL menangkap kesalahan saat runtime yang menghentikan eksekusi suatu blok kode, sehingga mesin dapat mengalihkan kendali ke bagian EXCEPTION di mana penangan yang telah ditentukan sebelumnya, yang ditentukan pengguna, dan penangan LAINNYA merespons, menimbulkan, atau menyebarkan kesalahan dengan aman.
Apa itu Penanganan Pengecualian di PL/SQL?
Pengecualian terjadi ketika mesin PL/SQL menemukan instruksi yang tidak dapat dieksekusi karena kesalahan yang muncul saat runtime. Kesalahan ini tidak terdeteksi pada waktu kompilasi dan oleh karena itu harus ditangani hanya pada waktu runtime.
Sebagai contoh, jika mesin PL/SQL menerima instruksi untuk membagi suatu angka dengan nol, ia akan menimbulkan kesalahan sebagai pengecualian. Pengecualian ini hanya muncul saat mesin PL/SQL dijalankan.
Suatu pengecualian menghentikan eksekusi program lebih lanjut, jadi untuk menghindari kondisi tersebut, kesalahan perlu ditangkap dan ditangani secara terpisah. Proses ini disebut penanganan pengecualian, di mana programmer menangani kesalahan yang dapat terjadi saat runtime.
Sintaks Penanganan Pengecualian
Pengecualian ditangani pada tingkat blok. Setelah pengecualian terjadi dalam suatu blok, kendali meninggalkan bagian eksekusi blok tersebut, dan pengecualian kemudian ditangani di bagian penanganan pengecualian blok tersebut. Setelah pengecualian ditangani, kendali tidak dapat kembali ke bagian eksekusi blok yang sama.
Ilustrasi di bawah ini menunjukkan bagaimana bagian eksekusi dan bagian penanganan pengecualian berada di dalam satu blok PL/SQL:
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 serangkaian kondisi WHEN untuk menangani pengecualian.
- Setiap kondisi WHEN diikuti oleh nama pengecualian yang diharapkan akan muncul saat runtime.
- Ketika terjadi pengecualian saat runtime, mesin PL/SQL akan mencari pengecualian tersebut di bagian penanganan pengecualian, dimulai dari klausa WHEN pertama dan bergerak secara berurutan.
- Jika menemukan penangan untuk pengecualian yang muncul, maka kode penangan tersebut akan dieksekusi.
- Jika tidak ada klausa WHEN yang cocok dengan pengecualian yang muncul, mesin PL/SQL akan mengeksekusi bagian WHEN OTHERS, jika ada. Penanganan ini berlaku umum untuk semua pengecualian.
- Setelah handler dijalankan, kendali berpindah dari blok saat ini.
- Hanya satu penangan pengecualian yang dapat dieksekusi untuk suatu blok pada saat runtime. Setelah dijalankan, mesin akan melewati penangan pengecualian yang tersisa dan meninggalkan blok saat ini.
Catatan: WHEN OTHERS harus selalu ditempatkan di urutan terakhir. Handler apa pun yang ditulis setelah WHEN OTHERS tidak akan pernah dijalankan, karena kontrol keluar dari blok setelah WHEN OTHERS dieksekusi.
Jenis Pengecualian
Ada dua jenis pengecualian dalam PL / SQL.
- Pengecualian yang telah ditentukan sebelumnya
- Pengecualian yang ditentukan pengguna
Pengecualian yang Telah Ditentukan Sebelumnya
Oracle telah menetapkan beberapa pengecualian umum. Setiap pengecualian yang telah ditetapkan memiliki nama dan nomor kesalahan yang unik, dan semuanya dideklarasikan dalam paket STANDARD di OracleDalam kode, Anda dapat menggunakan nama pengecualian yang telah ditentukan sebelumnya ini secara langsung untuk menangani kesalahan yang sesuai. Banyak di antaranya dipetakan langsung ke kesalahan umum. SQL kesalahan yang Anda temui setiap hari.
Berikut beberapa pengecualian yang telah ditentukan sebelumnya:
| Pengecualian | error Code | Alasan Pengecualian |
|---|---|---|
| ACCESS_INTO_NULL | ORA-06530 | Memberikan nilai pada atribut objek yang belum diinisialisasi. |
| KASUS_NOT_FOUND | ORA-06592 | Tidak satu pun dari klausa WHEN dalam pernyataan CASE terpenuhi dan tidak ada klausa ELSE yang ditentukan. |
| COLLECTION_IS_NULL | ORA-06531 | Menggunakan metode koleksi (kecuali EXISTS) atau mengakses atribut koleksi pada koleksi yang belum diinisialisasi. |
| CURSOR_ALREADY_OPEN | ORA-06511 | Mencoba membuka a kursor yang sudah buka |
| DUP_VAL_ON_INDEX | ORA-00001 | Menyimpan nilai duplikat dalam kolom basis data yang dibatasi oleh indeks unik. |
| INVALID_CURSOR | ORA-01001 | Operasi kursor ilegal, seperti menutup kursor yang belum dibuka. |
| INVALID_NUMBER | ORA-01722 | Konversi karakter ke angka gagal karena karakter numerik tidak valid. |
| NO_DATA_FOUND | ORA-01403 | Pernyataan SELECT yang berisi klausa INTO tidak mengambil baris apa pun. |
| ROW_MISMATCH | ORA-06504 | Tipe data variabel kursor tidak kompatibel dengan tipe nilai kembalian kursor yang sebenarnya. |
| SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Merujuk pada suatu koleksi dengan nomor indeks yang lebih besar daripada ukuran koleksi tersebut. |
| SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Merujuk pada koleksi dengan nomor indeks di luar rentang yang diizinkan secara hukum (misalnya, -1) |
| TOO_MANY_ROWS | ORA-01422 | Pernyataan SELECT dengan klausa INTO mengembalikan lebih dari satu baris. |
| VALUE_ERROR | ORA-06502 | Kesalahan aritmatika atau batasan ukuran (misalnya, menetapkan nilai yang lebih besar dari ukuran variabel) |
| ZERO_DIVIDE | ORA-01476 | Membagi suatu angka dengan nol |
Pengecualian Buatan Pengguna
Selain pengecualian yang telah ditentukan di atas, seorang programmer dapat membuat pengecualian khusus dan menanganinya. Pengecualian ini dibuat pada tingkat subprogram di bagian deklarasi dan hanya terlihat di dalam subprogram tersebut. Pengecualian yang didefinisikan dalam spesifikasi paket adalah pengecualian publik dan terlihat di mana pun paket tersebut 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.
- Kemudian, hal itu 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 dari .
- Ini dapat digunakan di seluruh basis data di mana pun paket 'package_name' dapat dipanggil.
PL/SQL Naikkan Pengecualian
Semua pengecualian yang telah ditentukan sebelumnya akan dimunculkan secara implisit setiap kali terjadi kesalahan yang sesuai. Namun, pengecualian yang ditentukan pengguna harus dimunculkan secara eksplisit menggunakan kata kunci RAISE. RAISE dapat digunakan dengan cara-cara yang ditunjukkan di bawah ini.
Jika RAISE digunakan sendiri di dalam handler, maka pengecualian yang sudah muncul akan diteruskan ke blok induk. RAISE hanya dapat digunakan di dalam blok pengecualian, seperti yang ditunjukkan di bawah ini.
Tangkapan layar di bawah ini menunjukkan penggunaan RAISE secara sendiri-sendiri untuk memunculkan kembali pengecualian pada blok yang mengapitnya:
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 dalam blok penanganan pengecualian.
- Setiap kali program menemukan pengecualian 'exception_name', pengecualian tersebut ditangani dan program selesai secara normal.
- Kata kunci RAISE dalam handler kemudian menyebarkan pengecualian yang sama ke program induk.
Catatan: Saat melempar pengecualian ke blok induk, pengecualian yang dilempar juga harus terlihat di blok induk; jika tidak, maka akan terjadi kesalahan. Oracle menimbulkan kesalahan.
Anda juga dapat menggunakan kata kunci RAISE diikuti dengan nama pengecualian untuk memunculkan pengecualian yang ditentukan pengguna atau yang telah ditentukan sebelumnya. Bentuk ini dapat digunakan baik pada bagian eksekusi maupun bagian penanganan pengecualian.
Tangkapan layar di bawah ini menunjukkan perintah RAISE diikuti dengan nama pengecualian untuk memunculkan pengecualian tertentu:
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 pada bagian eksekusi, diikuti oleh pengecualian 'exception_name'.
- Hal ini memunculkan pengecualian tertentu pada saat eksekusi program, dan kemudian perlu ditangani atau diangkat lebih lanjut.
Contoh 1: Pada contoh ini, kita akan melihat:
- Cara mendeklarasikan pengecualian
- Bagaimana cara memunculkan pengecualian yang telah dideklarasikan?
- Cara menyebarkannya ke blok utama
Tangkapan layar di bawah ini menunjukkan blok lengkap yang mendeklarasikan sample_exception, memunculkannya di dalam blok bersarang, dan menyebarkannya ke blok utama:
Tangkapan layar berikut menunjukkan contoh yang sama secara lanjutan, di mana blok utama akhirnya menangkap pengecualian yang disebarkan:
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; /
Code Penjelasan:
- Code baris 2: Mendeklarasikan variabel 'sample_exception' sebagai tipe EXCEPTION.
- Code baris 3: Mendeklarasikan prosedur nested_block.
- Code baris 6: Mencetak pernyataan “Di dalam blok bersarang”.
- Code baris 7: Mencetak pernyataan “Raising sample_exception from nested block”.
- Code baris 8: Menaikkan pengecualian menggunakan 'RAISE sample_Exception'.
- Code baris 10: Penanganan pengecualian untuk pengecualian sample_exception di dalam blok bersarang.
- Code baris 11: Mencetak pernyataan “Pengecualian terdeteksi di blok bersarang. Dialihkan ke blok utama”.
- Code baris 12: Mengangkat pengecualian ke blok utama (menyebarkannya).
- Code baris 15: Mencetak pernyataan “Di dalam blok utama”.
- Code baris 16: Mencetak pernyataan “Memanggil blok bersarang”.
- Code baris 17: Memanggil prosedur nested_block.
- Code baris 19: Penangan pengecualian untuk sample_Exception di blok utama.
- Code baris 20: Mencetak pernyataan “Pengecualian terdeteksi di blok utama”.
Poin penting yang perlu diperhatikan dalam Pengecualian
- Dalam sebuah fungsi, sebuah pengecualian harus selalu mengembalikan nilai atau menimbulkan pengecualian lebih lanjut; jika tidak, Oracle Menimbulkan kesalahan 'Fungsi dikembalikan tanpa nilai' saat dijalankan.
- Pernyataan kontrol transaksi dapat dikeluarkan di dalam blok penanganan pengecualian.
- SQLERRM dan SQLCODE adalah fungsi bawaan yang masing-masing mengembalikan pesan pengecualian dan kode pengecualian.
- Jika pengecualian tidak ditangani, maka secara default semua transaksi aktif dalam sesi tersebut akan dibatalkan (rollback).
- RAISE_APPLICATION_ERROR (- , ) dapat digunakan sebagai pengganti RAISE untuk memunculkan kesalahan dengan kode dan pesan khusus. Kode kesalahan harus berada di antara -20000 dan -20999.






