Menangani PL/SQL Errors
7.7. Memunculkan Kembali PL/SQL Exception
Kadangkala, kita ingin memunculkan kembali sebuah exception, yaitu, menanganinya secara lokal, lalu melewatkannya kepada sebuah blok yang melingkupinya. Sebagai contoh, kita mungkin ingin melakukan rollback terhadap sebuah transaksi di dalam blok yang sedang aktif (current block), lalu mencatat kesalahan di dalam blok yang melingkupinya (enclosing block).
Untuk memunculkan kembali sebuah exception, secara sederhana dapat dilakukan dengan menempatkan perintah RAISE di dalam local handler, seperti ditunjukkan di dalam contoh berikut ini:
DECLARE
out_of_balance EXCEPTION;
BEGIN
...
BEGIN ---------- sub-blok mulai
...
IF ... THEN
RAISE out_of_balance; -- memunculkan exception
END IF;
EXCEPTION
WHEN out_of_balance THEN -- menangani error
RAISE; -- memunculkan exception terkini
END; ------------ sub-blok selesai
EXCEPTION
WHEN out_of_balance THEN -- menangani error secara berbeda
...
END;
Mengabaikan nama exception di dalam perintah RAISE — diperbolehkan hanya di dalam sebuah exception handler — memunculkan kembali exception terkini tersebut.
7.8. Menangani Kemunculan PL/SQL Exceptions
Ketika sebuah exception dimunculkan, eksekusi normal dari blok atau subprogram PL/SQL kita berhenti dan kontrol berpindah kepada bagian exception-handlingnya, yang mana berbentuk seperti berikut ini:
EXCEPTION
WHEN exception_name1 THEN -- handler
sequence_of_statements1
WHEN exception_name2 THEN –- handler yang lain
sequence_of_statements2
...
WHEN OTHERS THEN – handler opsional
sequence_of_statements3
END;
Untuk menangkap exceptions yang muncul, kita menulis exception handlers. Setiap handler terdiri dari klausa WHEN, yang menentukan sebuah exception, diikuti oleh rangkaian perintah-perintah untuk dieksekusi ketika exception tersebut muncul. Perintah-perintah ini menyelesaikan eksekusi dari blok atau subprogram tersebut; control tidak kembali ke tempat dimana exception muncul sebelumnya. Dengan kata lain, kita tidak dapat melanjutkan pemrosesan dimana kita meninggalkannya.
Exception handler opsional OTHERS, yang selalu merupakan handler terakhir di dalam sebuah blok atau subprogram, berperan sebagai handler untuk seluruh exceptions yang tidak memiliki nama khusus. Jadi, sebuah blok atau subprogram hanya dapat memiliki satu handler OTHERS.
Seperti ditunjukkan oleh contoh berikut ini, penggunaan handler OTHERS menjamin bahwa tidak akan ada exception yang tidak tertangani:
EXCEPTION WHEN ... THEN -- menangani error WHEN ... THEN -- menangani erro WHEN OTHERS THEN -- menangani seluru error yang lain END;
Jika kita menginginkan satu atau lebih exceptions mengeksekusi rangkaian perintah-perintah yang sama, tampilkan nama-nama exceptions di dalam klausa WHERE, pisahkan mereka dengan keyword OR, seperti berikut ini:
EXCEPTION WHEN over_limit OR under_limit OR VALUE_ERROR THEN -- menangani error
Jika satu dari exceptions di dalam daftar muncul, rangkaian perintah-perintah yang terkait dengannya dieksekusi. Keyword OTHERS tidak dapat muncul di dalam daftar nama-nama exception; ia harus muncul tersendiri. Kita dapat memiliki banyak exception handler, dan setiap handler dapat menghubungkan daftar exceptions dengan rangkaian perintah-perintah. Namun, nama exception dapat muncul hanya di dalam bagian exception-handling dari sebuah blok atau subprogram PL/SQL.
Aturan-aturan jangkauan yang biasa dari variable-variable PL/SQL berlaku, sehingga kita dapat mereferensi kepada variable-variable lokal dan global di dalam sebuah exception handler. Namun, ketika sebuah exception muncul di dalam sebuah cursor FOR loop, cursor tersebut ditutup secara implisit sebelum handler tersebut diminta.Sehingga, nilai-nilai dari explicit cursor attributes tidak tersedia di dalam handler tersebut.
7.8.1. Menangani Exceptions yang Muncul dalam Deklarasi
Exceptions dapat muncul di dalam deklarasi-deklarasi, dikarenakan kesalahan-kesalahan ekspresi-ekspresi inisialisasi. Sebagai contoh, deklarasi berikut ini memunculkan sebuah exception karena konstanta credit_limit tidak dapat menyimpan angka-angka bernilai lebih besar dari 999:
DECLARE
credit_limit CONSTANT NUMBER(3) := 5000; -- memunculkan sebuah exception
BEGIN
...
EXCEPTION
WHEN OTHERS THEN -- tidak dapat menangkap exception tersebut
...
END;
Handlers di dalam blok terkini tidak dapat menangkap exception yang timbul karena exception yang timbul di dalam deklarasi menyebar seketika ke blok yang melingkupinya.
7.8.2. Menangani Exceptions yang Muncul dalam Handlers
Hanya satu exception dalam satu waktu yang dapat menjadi aktif di dalam bagian exception-handling dari sebuah blok atau subprogram. Sehingga, sebuah exception yang muncul di dalam sebuah handler menyebar seketika ke blok yang melingkupinya, yang mana dicari untuk menemukan sebuah handler untuk exception terbaru yang muncul.
Dari sana, exception tersebut menyebar secara normal. Mari kita perhatikan contoh berikut ini:
EXCEPTION
WHEN INVALID_NUMBER THEN
INSERT INTO ... –- menyebabkan munculnya DUP_VAL_ON_INDEX
WHEN DUP_VAL_ON_INDEX THEN ... – tidak dapat menangkap exception tersebut
END;
7.8.3. Bercabang Dari atau Ke Sebuah Exception Handler
Perintah GOTO tidak dapat menyebar ke dalam sebuah exception handler. Perintah GOTO juta tidak dapat menyebar dari sebuah exception handler ke blok terkini. Sebagai contoh, perintah GOTO berikut ini ilegal:
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
DELETE FROM stats WHERE symbol = ’XYZ’;
SELECT price / NVL(earnings, 0) INTO pe_ratio FROM stocks
WHERE symbol = ’XYZ’;
<<my_label>>
INSERT INTO stats (symbol, ratio) VALUES (’XYZ’, pe_ratio);
EXCEPTION
WHEN ZERO_DIVIDE THEN
pe_ratio := 0;
GOTO my_label; -- pencabangan ilegal ke blok terkini
END;
Namun, perintah GOTO dapat mencabang dari sebuah exception handler ke dalam sebuah blok yang melingkupinya.
| 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. |


































