Menangani PL/SQL Errors
7.4. Mendefinisikan PL/SQL Exceptions Kita Sendiri
PL/SQL mengijinkan kita untuk mendefinisikan exceptions kita sendiri. Tidak seperti predefined exceptions, user-defined exceptions harus dideklarasikan dan harus dimunculkan secara eksplisit oleh perintah-perintah RAISE.
7.4.1. Mendeklarasikan PL/SQL Exceptions
Exceptions dapat dideklarasikan hanya di dalam bagian declarative blok PL/SQL, subprogram, atau package. Kita mendeklarasikan sebuah exception dengan memperkenalkan namanya, diikuti dengan keyword EXCEPTION. Dalam contoh di bawah ini, kita mendeklarasikan exception bernama past_due:
DECLARE past_due EXCEPTION;
Deklarasi-deklarasi exception dan variable adalah mirip. Namun perlu kita ingat, sebuah exception merupakan sebuah kondisi error, bukan sebuah item data. Tidak seperti variables, exceptions tidak dapat muncul dalam perintah-perintah pemberian nilai atau perintah-perintah SQL. Namun, aturan-aturan jangkauan yang sama berlaku untuk variables dan exceptions.
7.4.2. Aturan Jangkauan untuk PL/SQL Exceptions
Kita tidak dapat mendeklarasikan sebuah exception dua kali di dalam blok yang sama. Kita dapat mendeklarasikan exception yang sama dalam dua blok berbeda.
Exceptions yang dideklarasikan di dalam sebuah blok dianggap lokal terhadap blok tersebut dan global terhadap seluruh sub-blok-nya. Karena sebuah blok dapat mereferensi hanya terhadap exceptions lokal dan global, blok-blok yang melingkupinya (enclosing blocks) tidak dapat mereferensi ke exception global kecuali ia telah dideklarasikan sebelumnya dalam blok berlabel, yang mana dalam kasus ini, sintaks berikut adalah valid:
block_label.exception_name
Contoh berikut menggambarkan aturan-aturan jangkauan:
DECLARE
past_due EXCEPTION;
acct_num NUMBER;
BEGIN
DECLARE ---------- sub-blok dimulai
past_due EXCEPTION; -- deklarasi ini berlaku
acct_num NUMBER;
BEGIN
...
IF ... THEN
RAISE past_due; -- ini tidak tertangani
END IF;
END; ------------- sub-blok diakhiri
EXCEPTION
WHEN past_due THEN -- tidak menangani exception yang muncul
...
END;
Blok yang melingkupinya tidak menangani exception yang muncul karena deklarasi dari past_due di dalam sub-block berlaku. Meskipun mereka berbagi nama yang sama, dua exceptions past_due tersebut adalah berbeda, seperti halnya dua variables acct_num yang berbagi nama yang sama namun merupakan variables yang berbeda. Dengan demikian, perintah RAISE dan klausa WHEN mereferensi terhadap exceptions yang berbeda. Untuk memiliki enclosing block yang menangani exception yang muncul, kita harus menghapus deklarasinya dari sub-blok atau mendefinisikan handler OTHERS.
7.4.3. Menghubungkan PL/SQL Exception dengan Sebuah Angka: Pragma EXCEPTION_UNITUntuk menangani kondisi-kondisi error (biasanya ORA - messages) yang tidak memiliki nama yang telah didefinisikan sebelumnya (predefined name), kita harus menggunakan handler OTHERS atau pragma EXCEPTION_INIT. Sebuah pragma adalah sebuah compiler directive yang diproses saat compile time, tidak saat run time.Dalam PL/SQL, pragma EXCEPTION_INIT memberitahukan kepada compiler untuk menghubungkan nama exception dengan nomor error Oracle. Hal itu mengijinkan kepada kita untuk merefer ke suatu internal exception berdasarkan nama dan untuk menulis sebuah handler tertentu untuknya. Ketika kita melihat sebuah error stack, atau rangkaian dari pesan-pesan error, satu yang berada di atas adalah satu yang dapat kita tangkap dan tangani.Kita mengkodekan pragma EXCEPTION_INIT di dalam bagian declarative blok PL/SQL, subprogram, atau package dengan menggunakan sintaks:
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
dimana exception_name adalah nama dari exception yang telah dideklarasikan sebelumnya dan nomor adalah nilai negative yang berhubungan dengan nomor error ORA-. Pragma harus muncul di suatu tempat setelah deklarasi exception tersebut di dalam bagian declarative yang sama, seperti ditunjukkan oleh contoh berikut ini:
DECLARE
deadlock_detected EXCEPTION;
PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
... -- Beberapa operasi yang menyebabkan ORA-00060 error
EXCEPTION
WHEN deadlock_detected THEN -- menangani error
END;
7.4.4. Mendefinisikan Error Message Kita Sendiri: Procedure RAISE_APPLICATION_ERROR
Procedure RAISE_APPLICATION_ERROR mengijinkan kita untuk menampilkan user-defined error messages ORA- dari stored subprograms. Dengan cara tersebut, kita dapat melaporkan errors kepada aplikasi kita dan mengabaikan kembalinya unhandled exceptions.
Untuk memanggil RAISE_APPLICATION_ERROR, gunakan sintaks
raise_application_error(error_number, message[, {TRUE | FALSE}]);
dimana error_number adalah integer negatif dalam jangkauan -2000 … -20999 dan message adalah string karakter dengan panjang hingga 2048 bytes. Jika parameter opsional ketiga adalah TRUE, error ditempatkan pada stack dari errors sebelumnya. Jika parameter adalah FALSE (nilai default), error menimpa seluruh errors sebelumnya. RAISE_APPLICATION_ERROR merupakan bagian dari package DBMS_STANDARD, dan seperti dengan package STANDARD, kita tidak perlu memenuhi syarat tertentu untuk mengacu kepadanya.
Sebuah aplikasi dapat memanggil RAISE_APPLICATION_ERROR hanya dari stored subprogram (atau method) yang sedang dieksekusi. Ketika dipanggil, RAISE_APPLICATION_ERROR mengakhiri subprogram tersebut dan mengembalikan nomor user_defined error dan messages kepada aplikasi. Nomor error dan message tersebut dapat ditangkap seperti halnya Oracle error yang lain.
Dalam contoh berikut ini, kita memanggil RAISE_APPLICATION_ERROR jika gaji karyawan tidak ditemukan:
CREATE PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) AS
curr_sal NUMBER;
BEGIN
SELECT sal INTO curr_sal FROM emp WHERE empno = emp_id;
IF curr_sal IS NULL THEN
/* Menampilkan user-defined error message. */
raise_application_error(-20101, 'Salary is missing');
ELSE
UPDATE emp SET sal = curr_sal + amount WHERE empno = emp_id;
END IF;
END raise_salary;
Application pemanggil mendapatkan PL/SQL exception, yang dapat diprosesnya dengan menggunakan error-reporting functions SQLCODE dan SQLERRM di dalam handler OTHERS. Juga, ia dapat menggunakan pragme EXCEPTION_INIT untuk memetakan nomor-nomor error tertentu yang dihasilkan oleh RAISE_APPLICATION_ERROR kepada exceptions miliknya sendiri, seperti ditunjukkan oleh Pro*C berikut ini:
EXEC SQL EXECUTE
/* Mengeksekusi embedded PL/SQL block menggunakan host
variables my_emp_id dan my_amount, yang mana
telah diberikan nilai-nilai dalam host environment. */
DECLARE
null_salary EXCEPTION;
/* Memetakan error number yang dihasilkan oleh raise_application_error
kepada user-defined exception. */
PRAGMA EXCEPTION_INIT(null_salary, -20101);
BEGIN
raise_salary(:my_emp_id, :my_amount);
EXCEPTION
WHEN null_salary THEN
INSERT INTO emp_audit VALUES (:my_emp_id, ...);
END;
END-EXEC;
Teknik ini memperbolehkan aplikasi pemanggil untuk menangani kondisi-kondisi error dalam exception handlers tertentu.
7.4.5. Mendeklarasikan Ulang Predefined Exceptions
Kita harus ingat, PL/SQL mendeklarasikan predefined exceptions secara global di dalam package STANDARD, sehingga kita tidak perlu mendeklarasikan mereka. Mendeklarasikan ulang predefined exception adalah kesalahan karena deklarasi kita menimpa deklarasi global. Sebagai contoh, jika kita mendeklarasikan exception bernama invalid_number dan kemudian PL/SQL memunculkan predefined exception INVALID_NUMBER secara internal, sebuah handler yang ditulis untuk INVALID_NUMBER tidak akan menangkap exception internal tersebut. Dalam kasus seperti ini, kita harus menggunakan notasi titik untuk menentukan predefined exception tersebut, seperti berikut ini:
EXCEPTION
WHEN invalid_number OR STANDARD.INVALID_NUMBER THEN
-- menangani error
END;
| 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 […]