Apa itu Exception Handling di PL / SQL?
Pengecualian terjadi ketika mesin PL / SQL menemukan instruksi yang tidak dapat dijalankan karena kesalahan yang terjadi saat run-time. Kesalahan ini tidak akan ditangkap pada saat kompilasi dan oleh karena itu hanya perlu ditangani pada saat proses kompilasi.
Misalnya, jika mesin PL / SQL menerima instruksi untuk membagi bilangan apa pun dengan '0', maka mesin PL / SQL akan membuangnya sebagai pengecualian. Pengecualian hanya dimunculkan pada saat dijalankan oleh mesin PL / SQL.
Pengecualian akan menghentikan program untuk dijalankan lebih lanjut, jadi untuk menghindari kondisi seperti itu, mereka perlu ditangkap dan ditangani secara terpisah. Proses ini disebut sebagai Penanganan Pengecualian, di mana pemrogram menangani pengecualian yang dapat terjadi pada waktu proses.
Dalam tutorial ini, Anda akan mempelajari topik-topik berikut-
- Sintaks Penanganan Pengecualian
- Jenis Pengecualian
- Pengecualian yang Ditetapkan Sebelumnya
- Pengecualian yang Ditentukan Pengguna
- PL / SQL Angkat Pengecualian
- Poin penting yang perlu diperhatikan di Exception
Sintaks Penanganan Pengecualian
Pengecualian ditangani di blok, level, yaitu, sekali jika ada pengecualian terjadi di blok mana pun maka kontrol akan keluar dari bagian eksekusi dari blok itu. Pengecualian kemudian akan ditangani di bagian penanganan pengecualian dari blok itu. Setelah menangani pengecualian, tidak mungkin untuk mengirim ulang kontrol kembali ke bagian eksekusi blok itu.
Sintaks di bawah ini menjelaskan cara menangkap dan menangani pengecualian.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Penjelasan Sintaks:
- Dalam sintaks di atas, blok penanganan pengecualian berisi rangkaian kondisi WHEN untuk menangani pengecualian.
- Setiap kondisi WHEN diikuti dengan nama pengecualian yang diharapkan dimunculkan pada saat berjalan.
- Jika ada pengecualian yang dimunculkan saat runtime, maka mesin PL / SQL akan mencari di 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 telah dimunculkan, maka ia akan mengeksekusi bagian kode penanganan tersebut.
- Jika tidak ada klausa 'WHEN' untuk pengecualian yang dimunculkan, maka mesin PL / SQL akan mengeksekusi bagian 'WHEN OTHERS' (jika ada). Ini umum untuk semua pengecualian.
- Setelah menjalankan 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 melewatkan bagian penanganan pengecualian yang tersisa dan akan keluar dari blok saat ini.
Catatan: KETIKA ORANG LAIN harus selalu berada di posisi terakhir dalam urutan. Bagian penanganan pengecualian yang ada setelah WHEN OTHERS tidak akan pernah dijalankan karena kontrol akan keluar dari blok setelah mengeksekusi WHEN OTHERS.
Jenis Pengecualian
Ada dua jenis Pengecualian di Pl / SQL.
- Pengecualian yang Ditetapkan Sebelumnya
- Pengecualian yang Ditentukan Pengguna
Pengecualian yang Ditetapkan 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 ditetapkan ini untuk menanganinya.
Di bawah ini adalah beberapa pengecualian yang telah ditentukan sebelumnya
Pengecualian | Kode Kesalahan | Alasan Pengecualian |
ACCESS_INTO_NULL | ORA-06530 | Tetapkan nilai ke atribut objek yang tidak diinisialisasi |
CASE_NOT_FOUND | ORA-06592 | Tidak ada klausa 'WHEN' dalam pernyataan CASE yang 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 kursor yang sudah terbuka |
DUP_VAL_ON_INDEX | ORA-00001 | Menyimpan nilai duplikat di 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 |
TIDAK ADA DATA DITEMUKAN | ORA-01403 | Ketika pernyataan 'SELECT' yang berisi klausa INTO tidak mengambil baris. |
ROW_MISMATCH | ORA-06504 | Jika tipe data variabel kursor tidak kompatibel dengan tipe pengembalian kursor sebenarnya |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Mengacu koleksi dengan nomor indeks yang lebih besar dari ukuran koleksi |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Mengacu koleksi dengan nomor indeks yang berada di luar kisaran legal (misalnya: -1) |
TOO_MANY_ROWS | ORA-01422 | Ketika pernyataan 'SELECT' dengan klausa INTO menghasilkan lebih dari satu baris |
VALUE_ERROR | ORA-06502 | Kesalahan kendala aritmatika atau ukuran (misalnya: menetapkan nilai ke variabel yang lebih besar dari ukuran variabel) |
ZERO_DIVIDE | ORA-01476 | Membagi angka dengan '0' |
Pengecualian yang Ditentukan Pengguna
Di Oracle, selain pengecualian yang telah ditentukan di atas, pemrogram dapat membuat pengecualian mereka sendiri dan menanganinya. Mereka dapat dibuat di tingkat subprogram di bagian deklarasi. Pengecualian ini hanya terlihat di subprogram itu. Pengecualian yang didefinisikan dalam spesifikasi paket adalah pengecualian publik, dan terlihat di mana pun paket dapat diakses. <
Sintaks: Di tingkat subprogram
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Dalam sintaks di atas, variabel 'exception_name' didefinisikan sebagai jenis 'EXCEPTION'.
- Ini dapat digunakan dengan cara yang mirip dengan pengecualian yang telah ditentukan sebelumnya.
Sintaks: Pada tingkat Spesifikasi Paket
CREATE PACKAGEIS EXCEPTION;… END ;
- Dalam sintaks di atas, variabel 'exception_name' didefinisikan sebagai jenis 'EXCEPTION' dalam spesifikasi paket
. - Ini dapat digunakan dalam database di mana pun package 'package_name' dapat dipanggil.
PL / SQL Angkat Pengecualian
Semua pengecualian yang telah ditentukan dimunculkan secara implisit setiap kali terjadi kesalahan. Tapi pengecualian yang ditentukan pengguna perlu dimunculkan secara eksplisit. Ini dapat dicapai dengan menggunakan kata kunci 'RAISE'. Ini dapat digunakan dengan salah satu cara yang disebutkan di bawah ini.
Jika 'RAISE' digunakan secara terpisah dalam program, maka itu akan menyebarkan pengecualian yang telah dimunculkan ke blok induk. Hanya di blok pengecualian dapat digunakan seperti yang ditunjukkan di bawah ini.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Penjelasan Sintaks:
- Dalam sintaks di atas, kata kunci RAISE digunakan di blok penanganan pengecualian.
- Setiap kali program menemukan pengecualian "nama_kecuali", pengecualian akan ditangani dan akan diselesaikan secara normal
- Tetapi kata kunci 'RAISE' di bagian penanganan pengecualian akan menyebarkan pengecualian khusus ini ke program induk.
Catatan: Saat memunculkan pengecualian ke blok induk, pengecualian yang dimunculkan juga harus terlihat di blok induk, jika tidak oracle akan membuat kesalahan.
- Kita dapat menggunakan kata kunci 'RAISE' diikuti dengan nama pengecualian untuk memunculkan pengecualian yang ditentukan pengguna / yang ditentukan sebelumnya. Ini bisa digunakan di bagian eksekusi dan di bagian penanganan pengecualian untuk memunculkan pengecualian.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Penjelasan Sintaks:
- Dalam sintaks di atas, kata kunci RAISE digunakan di bagian eksekusi diikuti dengan pengecualian "nama_kecuali".
- Ini akan memunculkan pengecualian khusus ini pada saat eksekusi, dan ini perlu ditangani atau ditingkatkan lebih lanjut.
Contoh 1 : Dalam contoh ini, kita akan lihat
- Bagaimana cara mendeklarasikan pengecualian
- Bagaimana menaikkan pengecualian yang dinyatakan dan
- Bagaimana menyebarkannya ke blok utama
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN 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 "Menaikkan sample_exception dari blok bersarang."
- Baris kode 8: Meningkatkan 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. Mengangkat ke blok utama '.
- Baris kode 12: Meningkatkan 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 19: Penangan pengecualian untuk sample_exception di blok utama.
- Baris kode 20: Mencetak pernyataan "Pengecualian ditangkap di blok utama."
Poin penting yang perlu diperhatikan di Exception
- Dalam fungsi, pengecualian harus selalu mengembalikan nilai atau meningkatkan pengecualian lebih lanjut. lain Oracle akan melempar kesalahan 'Fungsi dikembalikan tanpa nilai' pada 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 dalam sesi itu akan dibatalkan.
- RAISE_APPLICATION_ERROR (-
, ) bisa digunakan sebagai pengganti RAISE untuk meningkatkan kesalahan dengan kode pengguna dan pesan. Kode kesalahan harus lebih besar dari 20000 dan diawali dengan '-'.
Ringkasan
Setelah bab ini. Anda harus dapat bekerja untuk aspek pengecualian Pl SQL berikut
- Menangani pengecualian
- Tentukan pengecualian
- Angkat pengecualian
- Propagasi pengecualian