Pengendalian Pengecualian Oracle PL / SQL: Contoh untuk Meningkatkan Pengecualian yang ditentukan pengguna

Isi kandungan:

Anonim

Apakah Pengendalian Pengecualian dalam PL / SQL?

Pengecualian berlaku apabila mesin PL / SQL menemui arahan yang tidak dapat dilaksanakannya kerana ralat yang berlaku pada waktu berjalan. Kesalahan ini tidak akan dapat ditangkap pada masa penyusunan dan oleh itu kesalahan ini hanya perlu dikendalikan pada masa run-time.

Sebagai contoh, jika mesin PL / SQL menerima arahan untuk membagi sebarang nombor dengan '0', maka mesin PL / SQL akan membuangnya sebagai pengecualian. Pengecualian hanya ditimbulkan pada masa run-by oleh enjin PL / SQL.

Pengecualian akan menghentikan program daripada dijalankan lebih jauh, jadi untuk mengelakkan keadaan seperti itu, program tersebut perlu ditangkap dan ditangani secara berasingan. Proses ini dipanggil sebagai Pengecualian Pengecualian, di mana pengaturcara menangani pengecualian yang boleh berlaku pada masa berjalan.

Dalam tutorial ini, anda akan mempelajari topik berikut-

  • Sintaks Pengendalian Pengecualian
  • Jenis Pengecualian
  • Pengecualian yang telah ditetapkan
  • Pengecualian yang ditentukan pengguna
  • Pengecualian PL / SQL Naik
  • Perkara penting yang perlu diberi perhatian dalam Pengecualian

Sintaks Pengendalian Pengecualian

Pengecualian ditangani di blok, tingkat, iaitu, sekali jika ada pengecualian terjadi di blok mana pun maka kawalan akan keluar dari bahagian pelaksanaan blok tersebut. Pengecualian kemudian akan dikendalikan di bahagian pengecualian yang mengendalikan bahagian blok tersebut. Setelah menangani pengecualian, tidak mungkin mengirim semula kawalan ke bahagian pelaksanaan blok tersebut.

Sintaks di bawah menerangkan cara menangkap dan menangani pengecualian.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Penjelasan Sintaks:

  • Dalam sintaks di atas, blok pengecualian pengecualian mengandungi siri keadaan KETIKA untuk menangani pengecualian.
  • Setiap keadaan KETIKA diikuti oleh nama pengecualian yang diharapkan akan dinaikkan pada waktu berjalan.
  • Apabila ada pengecualian yang timbul pada waktu runtime, maka mesin PL / SQL akan melihat bahagian pengendalian pengecualian untuk pengecualian tersebut. Ia akan bermula dari klausa 'KETIKA' pertama dan, secara berurutan ia akan mencari.
  • Sekiranya ia mendapati pengendalian pengecualian untuk pengecualian yang telah dibangkitkan, maka ia akan melaksanakan bahagian kod pengendalian tersebut.
  • Sekiranya tidak ada klausa 'KETIKA' hadir untuk pengecualian yang telah dibangkitkan, maka mesin PL / SQL akan melaksanakan bahagian 'KETIKA LAIN' (jika ada). Ini adalah perkara biasa untuk semua pengecualian.
  • Setelah melaksanakan pengecualian, kawalan bahagian akan keluar dari blok semasa.
  • Hanya satu bahagian pengecualian yang dapat dijalankan untuk blok pada waktu berjalan. Setelah melaksanakannya, pengawal akan melangkau bahagian pengendalian pengecualian yang tersisa dan akan keluar dari blok semasa.

Catatan: KETIKA ORANG LAIN selalu berada di kedudukan terakhir urutan. Bahagian pengendalian pengecualian yang ada selepas KETIKA ORANG LAIN tidak akan dapat dilaksanakan kerana kawalan akan keluar dari blok setelah melaksanakan KETIKA YANG LAIN.

Jenis Pengecualian

Terdapat dua jenis Pengecualian dalam Pl / SQL.

  1. Pengecualian yang telah ditetapkan
  2. Pengecualian yang ditentukan pengguna

Pengecualian yang telah ditetapkan

Oracle telah menentukan beberapa pengecualian biasa. Pengecualian ini mempunyai nama dan nombor ralat pengecualian yang unik. Pengecualian ini sudah ditentukan dalam pakej 'STANDARD' di Oracle. Dalam kod, kita secara langsung boleh menggunakan nama pengecualian yang telah ditentukan ini untuk mengatasinya.

Berikut adalah beberapa pengecualian yang telah ditentukan

Pengecualian Kod salah Sebab Pengecualian
AKSES_INTO_NULL ORA-06530 Berikan nilai pada atribut objek yang tidak dimulakan
KES_NOT_FOUND ORA-06592 Tidak satu pun klausa 'KETIKA' dalam pernyataan KES dipenuhi dan tidak ada klausa 'LAIN' yang dinyatakan
KOLEKSI_IS_NULL ORA-06531 Menggunakan kaedah pengumpulan (kecuali EXISTS) atau mengakses atribut koleksi pada koleksi yang belum dimulakan
CURSOR_ALREADY_OPEN ORA-06511 Cuba membuka kursor yang sudah dibuka
DUP_VAL_ON_INDEX ORA-00001 Menyimpan nilai pendua dalam lajur pangkalan data yang dibatasi oleh indeks unik
INVALID_CURSOR ORA-01001 Operasi kursor haram seperti menutup kursor yang belum dibuka
NOMBOR TIDAK SAH ORA-01722 Penukaran watak ke nombor gagal kerana watak nombor tidak sah
TIADA DATA DIJUMPAI ORA-01403 Apabila pernyataan 'SELECT' yang mengandungi klausa INTO tidak menghasilkan baris.
ROW_MISMATCH ORA-06504 Apabila jenis data pemboleh ubah kursor tidak sesuai dengan jenis pengembalian kursor yang sebenarnya
SUBSCRIPT_BEYOND_COUNT ORA-06533 Merujuk koleksi dengan nombor indeks yang lebih besar daripada ukuran koleksi
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Merujuk koleksi dengan nombor indeks yang berada di luar julat undang-undang (misalnya: -1)
TERLALU_MANY_ROWS ORA-01422 Apabila pernyataan 'SELECT' dengan klausa INTO mengembalikan lebih dari satu baris
VALUE_ERROR ORA-06502 Kesalahan had aritmetik atau ukuran (contoh: menetapkan nilai pada pemboleh ubah yang lebih besar daripada ukuran pemboleh ubah)
ZERO_DIVIDE ORA-01476 Membahagi nombor dengan '0'

Pengecualian yang ditentukan pengguna

Di Oracle, selain daripada pengecualian yang telah ditentukan sebelumnya, pengaturcara dapat membuat pengecualian mereka sendiri dan mengatasinya. Mereka boleh dibuat pada tahap subprogram di bahagian deklarasi. Pengecualian ini hanya dapat dilihat dalam subprogram tersebut. Pengecualian yang ditentukan dalam spesifikasi paket adalah pengecualian umum, dan dapat dilihat di mana sahaja paket dapat diakses. <

Sintaks: Pada peringkat subprogram

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • Dalam sintaks di atas, pemboleh ubah 'exception_name' ditakrifkan sebagai jenis 'EXCEPTION'.
  • Ini boleh digunakan dengan cara yang serupa sebagai pengecualian yang telah ditentukan.

Sintaks: Pada peringkat Spesifikasi Pakej

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • Dalam sintaks di atas, pemboleh ubah 'exception_name' didefinisikan sebagai jenis 'EXCEPTION' dalam spesifikasi pakej .
  • Ini boleh digunakan dalam pangkalan data di mana sahaja pakej 'package_name' dapat dipanggil.

Pengecualian PL / SQL Naik

Semua pengecualian yang telah ditetapkan akan dibangkitkan secara tidak langsung setiap kali kesalahan berlaku. Tetapi pengecualian yang ditentukan pengguna perlu dikemukakan secara eksplisit. Ini dapat dicapai dengan menggunakan kata kunci 'RAISE'. Ini boleh digunakan dengan cara yang disebutkan di bawah.

Sekiranya 'RAISE' digunakan secara berasingan dalam program, maka ia akan menyebarkan pengecualian yang sudah dibangkitkan ke blok induk. Hanya blok pengecualian yang dapat digunakan seperti gambar di bawah.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Penjelasan Sintaks:

  • Dalam sintaks di atas, kata kunci RAISE digunakan dalam blok pengendalian pengecualian.
  • Setiap kali program menemui pengecualian "pengecualian_nama", pengecualian tersebut ditangani dan akan diselesaikan seperti biasa
  • Tetapi kata kunci 'RAISE' di bahagian pengendalian pengecualian akan menyebarkan pengecualian khusus ini kepada program induk.

Catatan: Semasa menaikkan pengecualian ke blok induk, pengecualian yang dinaikkan juga harus dilihat di blok induk, jika tidak, oracle akan menimbulkan kesalahan.

  • Kita boleh menggunakan kata kunci 'RAISE' diikuti dengan nama pengecualian untuk meningkatkan pengecualian yang ditentukan pengguna / ditentukan sebelumnya. Ini dapat digunakan di bahagian pelaksanaan dan juga bahagian pengendalian untuk meningkatkan pengecualian.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Penjelasan Sintaks:

  • Dalam sintaks di atas, kata kunci RAISE digunakan di bahagian pelaksanaan diikuti dengan pengecualian "exception_name".
  • Ini akan meningkatkan pengecualian ini pada saat pelaksanaan, dan ini perlu ditangani atau ditingkatkan lebih jauh.

Contoh 1 : Dalam contoh ini, kita akan melihat

  • Cara menyatakan pengecualian
  • Cara menaikkan pengecualian yang dinyatakan dan
  • Cara menyebarkannya ke blok utama
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Penjelasan Kod:

  • Baris kod 2 : Menyatakan pemboleh ubah 'sample_exception' sebagai jenis PENGECUALIAN.
  • Baris kod 3 : Menyatakan prosedur bersarang_block.
  • Baris kod 6 : Mencetak pernyataan "Di dalam blok bersarang".
  • Baris kod 7: Mencetak pernyataan "Meningkatkan pengecualian sample_ dari blok bersarang."
  • Baris kod 8: Meningkatkan pengecualian menggunakan 'RAISE sample_exception'.
  • Baris kod 10: Pengendali pengecualian untuk pengecualian sample_exception di blok bersarang.
  • Baris kod 11: Mencetak pernyataan 'Pengecualian ditangkap dalam blok bersarang. Menaikkan ke blok utama '.
  • Baris kod 12: Meningkatkan pengecualian ke blok utama (menyebarkan ke blok utama).
  • Baris kod 15: Mencetak pernyataan "Di dalam blok utama".
  • Baris kod 16: Mencetak pernyataan "Memanggil blok bersarang".
  • Baris kod 17: Memanggil prosedur nested_block.
  • Baris kod 19: Pengendali pengecualian untuk sample_exception di blok utama.
  • Baris kod 20: Mencetak pernyataan "Pengecualian ditangkap di blok utama."

Perkara penting yang perlu diberi perhatian dalam Pengecualian

  • Dalam fungsi, pengecualian harus selalu mengembalikan nilai atau meningkatkan pengecualian lebih jauh. jika tidak, Oracle akan membuang ralat 'Fungsi dikembalikan tanpa nilai' pada waktu jalan.
  • Penyataan kawalan transaksi boleh diberikan pada blok pengendalian pengecualian
  • SQLERRM dan SQLCODE adalah fungsi terbina dalam yang akan memberikan pengecualian mesej dan kod.
  • Sekiranya pengecualian tidak ditangani maka secara lalai semua transaksi aktif dalam sesi itu akan dikembalikan.
  • RAISE_APPLICATION_ERROR (- , ) dapat digunakan sebagai ganti RAISE untuk meningkatkan kesalahan dengan kod dan mesej pengguna. Kod ralat harus lebih besar daripada 20000 dan awalan dengan '-'.

Ringkasan

Selepas bab ini. anda seharusnya dapat bekerja untuk aspek berikut dari pengecualian Pl SQL

  • Mengendalikan pengecualian
  • Tentukan pengecualian
  • Naikkan pengecualian
  • Penyebaran pengecualian