Menangani PL/SQL Errors
7.2. Keuntungan PL/SQL Exceptions
Menggunakan exceptions untuk error handling memiliki beberapa keuntungan. Tanpa exception handling, setiap kali kita memberikan perintah, kita harus melakukan pemeriksaan terhadap kesalahan-kesalahan eksekusi (execution errors):
BEGIN SELECT ... -- memeriksa 'no data found' error SELECT ... -- memeriksa 'no data found' error SELECT ... -- memeriksa 'no data found' error
Pemrosesan kesalahan tidak secara jelas terpisah dari pemrosesan normal; tidak juga kuat. Jika kita mengabaikan untuk mengkodekan sebuah pemeriksaan, error tersebut menjadi tidak terdeteksi dan kemungkinan besar menyebabkan error lainnya, dan nampaknya errors yang tidak berhubungan.
Dengan exceptions, kita dapat menangani errors dengan baik tanpa perlu mengkodekan banyak pemeriksaan (pengecekan), seperti berikut:
BEGIN
SELECT ...
SELECT ...
SELECT ...
...
EXCEPTION
WHEN NO_DATA_FOUND THEN - menangkap seluruh 'no data found' errors
Exceptions meningkatkan keterbacaan dengan mengijinkan kita mengisolasi error-handling routines. Algoritma utama tidak dikaburkan oleh algoritma recovery error. Exceptions juga meningkatkan realibilitas. Kita tidak perlu khawatir tentang pengecekan sebuah error pada setiap titik dimana ia mungkin muncul. Cukup kita tambahkan sebuah exception handler pada blok PL/SQL kita. Jika exception pernah muncul pada blok tersebut (atau suatu sub-blok), kita dapat meyakinkan bahwa ia akan tertangani.
Oracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world’s largest enterprise software company.
For more information about Oracle, please visit their Web site at http://www.oracle.com. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
7.3. Predefined PL/SQL Exceptions
Sebuah internal exception muncul secara implisit kapanpun program PL/SQL kita melanggar suatu aturan Oracle atau melampaui batasan system-dependent. Setiap Oracle error memiliki nomor, namun exceptions harus ditangani berdasarkan nama. Jadi, PL/SQL mendefinisikan Oracle errors umum sebagai exceptions. Sebagai contoh, PL/SQL memunculkan predefined exception NO_DATA_FOUND jika perinta SELECT INTO tidak menghasilkan baris data.
Untuk menangani Oracle errors yang lain, kita menggunakan penanganan OTHERS. Function SQLCODE dan SQLERRM berguna dalam penanganan OTHERS karena mereka menghasilkan Oracle error code dan message text. Alternatifnya, kita dapat menggunakan pragma EXCEPTION_INIT untuk menghubungkan nama-nama exceptions dengan Oracle error codes.
PL/SQL mendeklarasikan predefined exceptions secara global di dalam package STANDARD, yang mendefinisikan PL/SQL environment. Jadi, kita tidak perlu mendeklarasikan mereka secara tersendiri. Kita dapat menulis handlers untuk predefined exceptions dengan menggunakan nama-nama dalam daftar di bawah ini:

Deskripsi singkat dari predefined exceptions tersebut adalah sebagai berikut:
- ACCESS_INTO_NULL
Program kita berusaha memberikan nilai-nilai ke attributes dari sebuah object yang tidak terinisialisasi (secara atomic null).
- CASE_NOT_FOUND
Tidak ada pilihan-pilihan dalam klausa-klausa WHEN dari perintah CASE yang dipilih, dan tidak terdapat klausa ELSE.
- COLLECTION_IS_NULL
Program kita berusaha untuk mengaplikasikan collection methods selain EXISTS terhadap nested table atau varray yang tidak terinisialisasi (atomically null), atau program berusaha memeberikan nilai-nilai kepada elemen-elemen dari nested table atau varray yang tidak terinisialisasi.
- CURSOR_ALREADY_OPEN
Program kita berusaha membuka cursor yang telah terbuka. Sebuah cursor harus ditutup sebelum ia dapat dibuka kembali. Sebuah cursor FOR loop otomatis membuka cursor dimana ia mengacu. Jadi, program kita tidak dapat membuka cursor tersebut di dalam loop.
- DUP_VAL_ON_INDEX
Program kita berusaha menyimpan nilai-nilai duplikat ke dalam kolom pada database yang dibatasi oleh sebuah unique index.
- INVALID_CURSOR
Program kita berusaha melakukan operasi cursor yang ilegal seperti menutup sebuah cursor yang tidak terbuka.
- INVALID_NUMBER
Dalam sebuah perintah SQL, konversi dari string karakter ke sebuah angka bagal karena string tersebut tidak merepresentasikan sebuah angka yang valid. (Dalam perintah-perintah prosedural, VALUE_ERROR dimunculkan). Exception ini juga muncul ketika ekpresi klausa LIMIT di dalam perintah bulk FETCH tidak mengevaluasi angka positif.
- LOGIN_DENIED
Program kita berusaha masuk (log on) ke Oracle dengan username dan /atau password yang salah.
- NO_DATA_FOUND
Sebuah perintah SELECT INTO tidak menghasilkan baris data, atau program kita mereferensi kepada elemen yang telah terhapus di dalam sebuah nested table atau sebuah elemen tak terinisialisasi di dalam sebuah index-by table. Fungsi-fungsi agregat SQL seperti AVG dan SUM selalu menghasilkan sebuah nilai atau null. Jadi, sebuah perintah SELECT INTO yang memanggil sebuah fungsi agregat tidak pernah menimbulkan NO_DATA_FOUND. Perintah FETCH akhirnya diharapkan untuk tidak menghasilkan baris data, sehingga ketika hal itu terjadi, tidak ada exception yang timbul.
- NOT_LOGGED_ON
Program kita melakukan pemanggilan terhadap database tanpa terkoneksi ke Oracle.
- PROGRAM_ERROR
PL/SQL memiliki sebuah problem internal.
- ROWTYPE_MISMATCH
Host cursor variable dan PL/SQL cursor variable yang berpartisipasi dalam sebuah pemberian nilai memiliki tipe hasil yang tidak kompatibel. Sebagai contoh, ketika sebuah host cursor variable terbuka dilewatkan ke sebuah stored subprogram, tipe-tipe hasil dari parameter-parameter aktual dan formal harus kompatibel.
- SELF_IS_NULL
Program kita berusaha memanggil method MEMBER pada sebuah instance yang null. Sehingga, built-in parameter SELF (yang selalu merupakan parameter yang dilewatkan ke method MEMBER) adalah null.
- STORAGE_ERROR
PL/SQL berjalan out of memory atau memory telah terkorup (corrupted).
- SUBSCRIPT_BEYOND_COUNT
Program kita mereferensi sebuah nested table atau elemen varray menggunakan nomor index yang lebih besar dari nomor dari elemen-elemen di dalam collection.
- SUBSCRIPT_OUTSIDE_LIMIT
Program kita mereferensi ke nested table atau elemen varray menggunakan sebuah nomor index (-1 sebagai contoh) yang berada di luar jangkauan yang legal.
- SYS_INVALID_ROWID
Konversi sebuah sting karakter ke sebuah universal rowid gagal karena string karakter tersebut tidak merepresentasikan sebuah rowid yang valid.
- TIMEOUT_ON_RESOURCE
Sebuah time-out muncul ketika Oracle sedang menunggu sebuah sumberdaya (resource).
- TOO_MANY_ROWS
Perintah SELECT INTO menghasilkan lebih dari satu baris data.
- VALUE_ERROR
Error aritmatika, konversi, truncation, atau batasan-ukuran muncul. Sebagai contoh, ketika program kita melakukan select terhadap sebuah nilai kolom dan memberikannya kepada sebuah variable bertipe karakter, jika nilai tersebut lebih panjang dari yang telah dideklarasikan untuk variable tersebut, PL/SQL membatalkan proses pemberian nilai tersebut dan memunculkan VALUE_ERROR. Dalam perintah-perintah prosedural, VALUE_ERROR muncul jika konversi dari sebuah string karakter ke sebuah angka gagal dilakukan. (Dalam perintah-perintah SQL, yang muncul adalah INVALID_NUMBER).
- ZERO_DIVIDE
Program kita berusaha membagi sebuah angka dengan nol.
| 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, Uranus dsb. |


































