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.

 

 

Pages: 1 2 3 4 5 6 7


Bookmark and Share

 

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.

 

Find Related articles