Menangani PL/SQL Errors
Run-time errors timbul dari kesalahan-kesalahan desain, kekeliruan-kekeliruan coding, kerusakan hardware, dan banyak lagi sumber-sumber lainnya. Meskipun kita tidak dapat mengantisipasi seluruh errors yang mungkin timbul, kita dapat merencanakan untuk menangani bentuk-bentuk tertentu dari errors tersebut yang ditujukan untuk program PL/SQL kita.
Dengan banyak bahasa-bahasa pemrograman, kecuali kita menonaktifkan pengecekan error, suatu run-time error seperti stack overflow atau division by zero menghentikan pemrosesan normal dan mengembalikan kontrol kepada sistem operasi. Dengan PL/SQL, mekanisme yang disebut dengan exception handling mengijinkan kita untuk “melindungi” program kita sehinga dapat terus beroperasi dalam kehadiran errors.
Pada pembahasan kali ini kita akan mendiskusikan topik-topik berikut ini:
- Pengenalan PL/SQL Error Handling
- Keuntungan PL/SQL Exceptions
- Predefined PL/SQL Exceptions
- Mendefinisikan PL/SQL Exceptions Kita Sendiri
- Bagaimana PL/SQL Exceptions Muncul
- Bagaimana PL/SQL Exceptions Menyebar
- Memunculkan Kembali PL/SQL Exception
- Menangani PL/SQL Exceptions yang Muncul
- Tip-tip Menangani PL/SQL Errors
7.1. Pengenalan PL/SQL Error HandlingDalam PL/SQL, kondisi peringatan atau error disebut dengan exception. Exceptions dapat secara internal didefinisikan (oleh run-time system) atau didefinisikan oleh pengguna. Contoh-contoh exceptions yang didefinisikan secara internal termasuk division by zero dan out of memory. Beberapa exceptions internal yang umum memiliki nama-nama yang telah didefinisikan sebelumnya (predefined names), seperti ZERO_DIVIDE dan STORAGE_ERROR. Exceptions internal lain dapat berupa nama-nama tersebut.
Kita dapat mendefinisikan exceptions kita sendiri di dalam bagian declarative dari suatu blok PL/SQL, subprogram, atau package. Sebagai contoh, kita dapat mendefinisikan sebuah exception bernama insufficient_funds untuk menandai penarikan dana yang melebihi saldo pada sebuah akun bank. Tidak seperti internal exceptions, user-defined exceptions harus memiliki nama.
Ketika sebuah error terjadi, sebuah exception dimunculkan (raised). Dengan demikian, eksekusi normal berhenti dan kontrol berpindah ke bagian exception-handling dari blok PL/SQL atau subprogram kita. Internal exceptions dimunculkan secara implisit (otomatis) oleh run-time system. User-defined exceptions harus dimunculkan secara eksplisit dengan perintah-perintah RAISE, yang mana juga memunculkan predefined exceptions.
Untuk menangani exceptions yang timbul, kita menuliskan routines terpisah yang disebut dengan exception handlers. Setelah sebuah exception handler berjalan, blok terkini berhenti mengeksekusi dan blok yang melingkupinya melanjutkan perintah selanjutnya. Jika tidak terdapat blok yang melingkupinya (lebih luar), kontrol kembali ke host environment.
Dalam contoh di bawah ini, kita menghitung dan menyimpan rasio harga-terhadap-pendapatan untuk perusahaan dengan simbol XYZ. Jika perusahaan tersebut memiliki pendapatan nol, predefined exception ZERO_DIVIDE dimunculkan. Hal ini menghentikan eksekusi normal dari blok tersebut dan mentransfer kontrol ke exception handlers. Handler opsional OTHERS menangkap seluruh exceptions yang tidak dinamai secara khusus oleh blok tersebut.
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT price / earnings
INTO pe_ratio
FROM stocks
WHERE symbol = 'XYZ'; -- mungkin menyebabkan division-by-zero error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
COMMIT;
EXCEPTION -- exception handlers dimulai
WHEN ZERO_DIVIDE THEN -- menangani 'division by zero' error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL);
COMMIT;
...
WHEN OTHERS THEN - menangani seluruh errors yang lain
ROLLBACK;
END; -- exception handlers dan blok berakhir disini
Contoh terakhir yang menggambarkan exception handling, bukan merupakan penggunaan efektif dari perintah-perintah INSERT. Sebagai contoh, sebuah cara yang lebih baik untuk melakukan penambahan data adalah sebagai berikut:
INSERT INTO stats (symbol, ratio) SELECT symbol, DECODE(earnings, 0, NULL, price / earnings) FROM stocks WHERE symbol = 'XYZ';
Dalam contoh ini, sebuah subquery menyediakan nilai-nilai ke perintah INSERT. Jika pendapatan adalah nol, function DECODE menghasilkan null. Selain daripada itu, DECODE menghasilkan rasio harga-terhadap-pendapatan (price-to-earnings).
| 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. |


































