Menangani PL/SQL Errors
7.8.4. Menampilkan Error Code dan Error Message: SQLCODE dan SQLERRM
Dalam sebuah exception handler, kita dapat menggunakan function-function bawaan (built-in) SQLCODE dan SQLERRM untuk mengetahui error yang terjadi dan untuk mendapatkan error message yang terkait dengannya. Untuk exceptions internal, SQLCODE menghasilkan angka dari Oracle error. Angka yang dihasilkan oleh SQLCODE adalah negatif kecuali Oracle error-nya adalah no data found, yang mana menyebabkan SQLCODE menghasilkan +100. SQLERRM menghasilkan error message yang sesuai. Message dimulai dengan Oracle error code tersebut.
Untuk user-defined exceptions, SQLCODE menghasilkan +1 dan SQLERRM menghasilkan message: User-Defined Exception.
Kecuali kita menggunakan pragma EXCEPTION_INIT untuk menghubungkan nama exception dengan Oracle error number, yang mana menyebabkan SQLCODE menghasilkan error number dan SQLERRM menghasilkan error message yang sesuai. Panjang maksimum dari sebuah Oracle error message adlaah 512 karakter termasuk error code-nya, nested messages, dan message yang ditambahkan seperti halnya nama-nama tabel dan kolom.
Jika tidak ada exception yang dimunculkan, SQLCODE menghasilkan nol dan SQLERRM menghasilkan message: ORA-000: normal, successful completion.
Kita dapat melewatkan sebuah error number ke SQLERRM, yang mana menyebabkan SQLERRM menghasilkan message yang terkait dengan error number itu. Pastikan kita melewatkan angka-angka error negatif ke SQLERRM. Dalam contoh berikut ini, kita melewatkan angka-angka positif dan sehingga kita mendapatkan hasil-hasil yang tidak kita inginkan:
DECLARE
err_msg VARCHAR2(100);
BEGIN
/* Mendapatkan seluruh Oracle error messages. */
FOR err_num IN 1..9999 LOOP
err_msg := SQLERRM(err_num); -- salah; seharusnya -err_num
INSERT INTO errors VALUES (err_msg);
END LOOP;
END;
Melewatkan sebuah angka positif ke SQLERRM selalu menghasilkan message user-defined exception kecuali kita melewatkan +100, yang mana menyebabkan SQLERRM menghasilkan message no data found. Melewatkan nol ke SQLERRM selalu menghasilkan message normal, successful completion.
Kita tidak dapat menggunakan SQLCODE atau SQLERRM secara langsung ke dalam sebuah perintah SQL. Daripada itu, kita harus memberikan nilai-nilai mereka kepada variable-variable lokal, kemudian menggunakan variable-variable tersebut di dalam perintah SQL, seperti ditunjukkan di dalam contoh berikut ini:
DECLARE
err_num NUMBER;
err_msg VARCHAR2(100);
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 100);
INSERT INTO errors VALUES (err_num, err_msg);
END;
Function string SUBSTR memastikan bahwa sebuah VALUE_ERROR exception (untuk pemotongan) tidak muncul ketika kita memberikan nilai dari SQLERRM ke err_msg. Function-function SQLCODE dan SQLERRM khususnya berguna di dalam OTHERS exception handler karena mereka mengatakan kepada kita internal exception mana yang ditampilkan.
Catatan: Ketika menggunakan pragma RESTRICT_REFERENCES untuk menegaskan kemurnian dari stored function, kita tidak dapat menentukan constraints WNPS dan RNPS jika function memanggil SQLCODE atau SQLERRM.
7.8.5. Menangkap Unhandled Exceptions
Perlu kita ingat, jika ia tidak dapat menemukan sebuah handler untuk sebuah exception yang timbul, PL/SQL menghasilkan sebuah unhandled exception error kepada host environment, yang akan menentuka hasilnya. Sebagai contoh, di dalam lingkungan Oracle Precompiler, setiap perubahan database yang disebabkan oleh perintah SQL atau blok PL/SQL yang gagal akan di-roll back.
Unhandled exceptions (exceptions tak tertangani) dapat juga mempengaruhi subprograms. Jika kita keluar dari subprogram secara sukses, PL/SQL memberikan nilai-nilai ke OUT parameters. Namun, jika kita keluar dengan sebuah unhandled exception, PL/SQL tidak memberikan nilai-nilai ke OUT parameters (kecuali mereka adalah NOCOPY parameters). Juga, jika sebuah subprogram gagal dengan sebuah unhandled exception, PL/SQL tidak me-roll back kerja database yang dilakukan oleh subprogram tersebut.
Kita dapat menghindari unhandled exceptions dengan mengkodekan sebuah OTHER handlers pada level paling atas dari setiap program PL/SQL.
| 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 dsb. Harga Rp. 24.800,- (157 halaman) |


[…] Menangani PL/SQL Errors […]