Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Pelajari Cara Menangani Pengecualian Di PL/SQL

Jika Anda seorang programmer, Anda mungkin akrab dengan konsep penanganan eksepsi yang merupakan bagian integral dari bahasa pemrograman apa pun. Karena kesalahan tidak dapat dihindari dan bahkan yang paling pintar pun dari kita dapat membuat kesalahan saat menulis kode, kita harus mengetahui cara menanganinya. Dalam artikel ini, kita akan mempelajari secara khusus tentang penanganan eksepsi di PL/SQL.

Berikut adalah topik yang dibahas dalam artikel ini :

  • Apa itu Pengecualian?
  • Sintaks Penanganan Pengecualian
  • Jenis Pengecualian
    • Sistem ditentukan
      • Pengecualian sistem bernama
      • Pengecualian sistem tanpa nama
    • Ditentukan pengguna
      • Langkah-langkah untuk mendeklarasikan fungsi yang ditentukan Pengguna
      • Contoh fungsi yang ditentukan pengguna

Apa itu Pengecualian?

Setiap kondisi atau kejadian tidak normal yang mengganggu aliran normal instruksi program kami pada saat dijalankan atau dengan kata sederhana, pengecualian adalah kesalahan.

Sintaks Penanganan Pengecualian di PL/SQL

DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2&nbsp; THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........

WHEN others THEN
exception3-handling-statements
END;

Di sini, kita dapat membuat daftar pengecualian sebanyak yang ingin kita tangani. Pengecualian default akan ditangani menggunakan 'WHEN others THEN'

Contoh Penanganan Exception di PL/SQL

Program di bawah ini menampilkan nama dan alamat siswa yang identitasnya diberikan. Karena tidak ada siswa dengan nilai ID 8 di database kami, program memunculkan pengecualian run-time NO_DATA_FOUND, yang ditangkap di blok EXCEPTION.

DECLARE 
   s_id studentS.id%type := 8; 
   s_name studentS.Name%type; 
   s_loc studentS.loc%type; 
BEGIN 
   SELECT  name, loation INTO  s_name, s_loc 
   FROM students 
   WHERE id = s_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  s_name); 
   DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc);
EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such student!'); 
   WHEN others THEN 
      dbms_output.put_line('Oops, Error!'); 
END; 

Keluaran

No such student!
PL/SQL procedure successfully completed.  

Di sini, kita dapat membuat daftar pengecualian sebanyak yang ingin kita tangani. Pengecualian default akan ditangani menggunakan 'KETIKA orang lain MAKA '

Jenis Pengecualian di PL/SQL

  • Sistem ditentukan
  • Pengguna menentang

Berikutnya dalam artikel tentang penanganan eksepsi di PL/SQL, mari kita bahas kedua tipe ini secara mendetail.

Sistem ditentukan

Didefinisikan dan dipelihara secara implisit oleh server Oracle, pengecualian ini terutama ditentukan dalam Paket Standar Oracle. Setiap kali pengecualian terjadi di dalam program, server Oracle mencocokkan dan mengidentifikasi pengecualian yang sesuai dari kumpulan pengecualian yang tersedia dalam paket standar oracle. Pada dasarnya, pengecualian ini telah ditentukan sebelumnya dalam PL/SQL yang dimunculkan KETIKA aturan database tertentu dilanggar .

Pengecualian yang ditentukan sistem dibagi lagi menjadi dua kategori:

  • Pengecualian sistem bernama
  • Pengecualian sistem tanpa nama

Pengecualian sistem bernama

Pengecualian PL/SQL bernama dinamai dalam paket standar PL/SQL , maka pengembang tidak perlu mendefinisikan pengecualian PL/SQL dalam kode mereka. PL/SQL menyediakan banyak pengecualian bernama yang telah ditentukan sebelumnya, yang dieksekusi ketika ada aturan database yang dilanggar oleh suatu program. Tabel berikut mencantumkan beberapa pengecualian penting yang telah ditentukan sebelumnya

Pengecualian Kesalahan Oracle SQLCODE Deskripsi
ACCESS_INTO_NULL 06530 -6530 Ini dimunculkan ketika objek null secara otomatis diberi nilai.
CASE_NOT_FOUND 06592 -6592 Ini dimunculkan ketika tidak ada pilihan dalam klausa WHEN dari pernyataan CASE yang dipilih, dan tidak ada klausa ELSE.
COLLECTION_IS_NULL 06531 -6531 Ini dimunculkan ketika sebuah program mencoba untuk menerapkan metode pengumpulan selain EXISTS ke tabel atau varray bersarang yang tidak diinisialisasi, atau program mencoba untuk menetapkan nilai ke elemen dari tabel atau varray bersarang yang tidak diinisialisasi.
DUP_VAL_ON_INDEX 00001 -1 Ini dimunculkan ketika nilai duplikat dicoba untuk disimpan dalam kolom dengan indeks unik.
INVALID_CURSOR 01001 -1001 Dibesarkan ketika ada upaya untuk membuat operasi kursor yang tidak diizinkan, seperti menutup kursor yang belum dibuka.
INVALID_NUMBER 01722 -1722 Dibesarkan ketika konversi string karakter menjadi angka gagal karena string tidak mewakili angka yang valid.
LOGIN_DENIED 01017 -1017 Ini dimunculkan ketika sebuah program mencoba masuk ke database dengan nama pengguna atau kata sandi yang tidak valid.
NO_DATA_FOUND 01403 +100 Ini dimunculkan ketika pernyataan SELECT INTO tidak mengembalikan baris.
NOT_LOGGED_ON 01012 -1012 Dimunculkan saat panggilan database dilakukan tanpa terhubung ke database.
PROGRAM_ERROR 06501 -6501 Dimunculkan ketika PL/SQL memiliki masalah internal.
ROWTYPE_MISMATCH 06504 -6504 Ini dimunculkan ketika kursor mengambil nilai dalam variabel yang memiliki tipe data yang tidak kompatibel.
SELF_IS_NULL 30625 -30625 Ini dimunculkan ketika metode anggota dipanggil, tetapi instance dari tipe objek tidak diinisialisasi.
STORAGE_ERROR 06500 -6500 Dimunculkan ketika PL/SQL kehabisan memori atau memori rusak.
TOO_MANY_ROWS 01422 -1422 Ini dimunculkan ketika pernyataan SELECT INTO mengembalikan lebih dari satu baris.
VALUE_ERROR 06502 -6502 Ini dimunculkan ketika terjadi kesalahan aritmatika, konversi, pemotongan, atau batasan ukuran.
ZERO_DIVIDE 01476 1476 Dibesarkan ketika ada upaya untuk membagi angka dengan nol.

Contoh

CREATE OR REPLACE PROCEDURE add_new_student
      (student _id_in IN NUMBER, student _name_in IN VARCHAR2)
IS
BEGIN
       INSERT INTO student (student _id, student _name )
       VALUES ( student _id_in, student _name_in );
EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN
 raise_application_error (-20001,'Duplicate student _id');
       WHEN OTHERS THEN
raise_application_error (-20002,'An error occurred.');
END;

Melanjutkan artikel ini tentang penanganan pengecualian di PL/SQL, mari kita pahami apa itu pengecualian sistem tanpa nama.

Pengecualian Sistem Tanpa Nama

Pengecualian sistem yang tidak memiliki nama Oracle dikenal sebagai pengecualian sistem tanpa nama. Pengecualian ini tidak sering terjadi dan ditulis dengan kode dan pesan terkait.

Pada dasarnya ada dua cara untuk menangani pengecualian sistem yang tidak disebutkan namanya:

1. Menggunakan pengendali pengecualian WHEN OTHERS

2. Mengaitkan kode pengecualian ke sebuah nama dan menggunakannya sebagai pengecualian bernama.

Beberapa langkah yang diikuti untuk pengecualian sistem yang tidak disebutkan namanya adalah:

  • Tingkatkan secara implisit.
  • Jika tidak ditangani di 'WHEN Others', maka harus ditangani secara eksplisit.
  • Untuk menangani pengecualian secara eksplisit, mereka dapat dideklarasikan menggunakan Pragma EXCEPTION_INIT dan ditangani dengan merujuk nama pengecualian yang ditentukan pengguna di bagian pengecualian.

Contoh penanganan pengecualian yang tidak disebutkan namanya menggunakan Pragma EXCEPTION_INIT disediakan kemudian di artikel. Melanjutkan artikel tentang penanganan pengecualian di PL/SQL ini, mari kita pahami pengecualian yang ditentukan pengguna.

Ditentukan pengguna

Seperti semua bahasa pemrograman lainnya, Oracle juga memungkinkan Anda untuk mendeklarasikan iklan menerapkan pengecualian Anda sendiri. Tidak seperti pengecualian yang ditentukan Sistem, pengecualian ini dimunculkan secara eksplisit di blok PL/SQL.

Langkah-langkah untuk mendeklarasikan pengecualian yang ditentukan pengguna di database Oracle

Kita dapat mendefinisikan pengecualian yang ditentukan pengguna dalam database Oracle dengan 3 cara berikut:

  • Menggunakan Variabel bertipe EXCEPTION

Di sini, kita dapat mendeklarasikan pengecualian yang ditentukan Pengguna dengan mendeklarasikan variabel tipe data PENGECUALIAN dalam kode kita dan menaikkannya secara eksplisit dalam program kita menggunakan pernyataan RAISE.

  • Menggunakan fungsi PRAGMA EXCEPTION_INIT

Kita dapat mendefinisikan nomor kesalahan yang tidak ditentukan sebelumnya dengan variabel tipe data PENGECUALIAN

  • Menggunakan metode RAISE_APPLICATION_ERROR

Dengan menggunakan metode ini, kami dapat mendeklarasikan pengecualian yang ditentukan Pengguna dengan nomor dan pesan kesalahan kami sendiri yang disesuaikan.

Sampai sekarang Anda mungkin telah mendapatkan gambaran kasar tentang cara-cara di mana kami dapat meningkatkan pengecualian yang ditentukan Pengguna di PL/SQL. Kita akan mempelajari tentang masing-masing metode yang disebutkan di atas dengan contoh lebih lanjut dalam artikel ini tentang penanganan pengecualian di PL/SQL.

Berikutnya dalam artikel ini, mari kita lanjutkan dengan demonstrasi penanganan pengecualian yang ditentukan pengguna.

Peragaan Pengecualian Buatan Pengguna

Melanjutkan artikel tentang Penanganan Exception di PL/SQL, mari kita pahami cara menggunakan variabel tipe EXCEPTION.

Menggunakan Variabel bertipe EXCEPTION

Proses mendeklarasikan pengecualian yang ditentukan pengguna dibagi menjadi tiga bagian dan 3 bagian ini adalah:

  • Deklarasikan tipe data pengecualian variabel
  • Tingkatkan Pengecualian
  • Menangani Pengecualian

Mari kita menulis kode untuk mendemonstrasikan langkah-langkah di atas secara mendetail.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

Dalam blok deklarasi di atas, kami memiliki empat variabel, di antaranya tiga yang pertama adalah variabel tipe data angka normal dan yang keempat adalah ex_DivZero adalah variabel tipe data pengecualian khusus. Yang keempat adalah pengecualian yang ditentukan pengguna kami.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

Bagian eksekusi di atas dari blok anonim ini, akan beraksi hanya jika pembaginya 0. Jika pembaginya nol seperti dalam kasus kita, kesalahan akan dimunculkan dan kontrol program akan melewatkan semua langkah berikutnya dan akan mencari penangan pengecualian yang cocok. Dalam kasus di mana ia menemukan yang lain, ia akan melakukan tindakan yang sesuai, jika tidak ia akan menghentikan program atau meminta kami dengan kesalahan yang ditentukan sistem yang tidak tertangani.

EXCEPTION WHEN ex_DivZero THEN
DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);

Ini penangan pengecualian. Segera setelah pengguna memasukkan pembagi sebagai 0, string pesan di atas akan diminta.

Kode Akhir:

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
END;

Melanjutkan artikel tentang penanganan eksepsi di PL/SQL ini, mari kita pahami cara menggunakan metode PRAGMA_EXCEPTION_INIT.

Menggunakan fungsi PRAGMA EXCEPTION_INIT

Dalam fungsi PRAGMA EXCEPTION_INIT, nama pengecualian dikaitkan dengan nomor kesalahan Oracle. Nama ini dapat digunakan dalam mendesain penangan pengecualian untuk kesalahan. Untuk proyek besar dengan banyak kesalahan yang ditentukan pengguna, PRAGMA EXCEPTION_INIT adalah metode yang paling berguna dan cocok.

Sintaks:

PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);

Contoh

DECLARE
   deadlock_detected EXCEPTION;
   PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
 NULL; -- Some operation that causes an ORA-00060 error
EXCEPTION
   WHEN deadlock_detected THEN
      NULL; -- handle the error
END;

PRAGMA EXCEPTION_INIT memberi tahu kompiler untuk mengaitkan nama pengecualian dengan nomor kesalahan Oracle seperti yang disebutkan sebelumnya. Ini memungkinkan Anda merujuk ke pengecualian internal apa pun dengan nama dan menulis penangan khusus untuk itu. Saat Anda melihat tumpukan kesalahan, atau urutan pesan kesalahan, yang di atas adalah yang dapat dijebak dan ditangani.

Melanjutkan artikel tentang Penanganan Pengecualian di PL/SQL ini, mari kita pahami cara menggunakan metode RAISE_APPLICATION_ERROR.

Menggunakan metode RAISE_APPLICATION_ERROR

Ini adalah prosedur yang disertakan dengan perangkat lunak oracle. Dengan menggunakan prosedur ini, kami dapat mengaitkan nomor kesalahan dengan pesan kesalahan khusus. Menggabungkan nomor kesalahan dan pesan kesalahan khusus, string kesalahan dapat disusun yang terlihat mirip dengan string kesalahan default yang ditampilkan oleh Oracle ketika terjadi kesalahan. Prosedur RAISE_APPLICATION_ERROR ditemukan di dalam paket DBMS_STANDARD

Sintaks

raise_application_error (error_number, message [, {TRUE | FALSE}]);

Contoh

/* A trigger trg_emp_detail_chk is created.*/
CREATE OR REPLACE TRIGGER trg_emp_detail_chk

/* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/
Before UPDATE ON employees

DECLARE
permission_denied EXCEPTION;
BEGIN

/*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/
IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN
raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!');

/* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter
with a default text stating that the user is not authorized to do any modification in the weekends. */
END IF;
END;

Dengan ini kita mengakhiri artikel tentang “Penanganan pengecualian di PL/SQL” ini. Saya harap topik ini dipahami dengan baik dan membantu Anda. Cobalah untuk menulis kode Anda sendiri dan menggabungkan metode yang dijelaskan dalam artikel ini.

Jika Anda ingin mendapatkan pelatihan dari para profesional tentang teknologi ini, Anda dapat memilih pelatihan terstruktur dari edureka! Lihat Pelatihan Sertifikasi DBA MySQL ini oleh Edureka, perusahaan pembelajaran online tepercaya dengan jaringan lebih dari 250.000 pelajar yang puas yang tersebar di seluruh dunia. Kursus ini melatih Anda tentang konsep inti &alat dan teknik canggih untuk mengelola data dan mengelola Database MySQL. Ini mencakup pembelajaran langsung tentang konsep-konsep seperti MySQL Workbench, Server MySQL, Pemodelan Data, Konektor MySQL, Desain Basis Data, Baris Perintah MySQL, Fungsi MySQL, dll. Di akhir pelatihan, Anda akan dapat membuat dan mengelola Basis Data MySQL Anda sendiri dan mengelolanya data.

Ada pertanyaan untuk kami? Harap sebutkan di bagian komentar artikel “Penanganan Pengecualian dalam PL/SQL” ini dan kami akan menghubungi Anda sesegera mungkin.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RDBMS vs NoSQL

  2. Hasilkan satu set atau urutan tanpa loop – bagian 1

  3. Bagaimana DevOps Harus Menggunakan DBaaS (Database-as-a-Service) Untuk Mengoptimalkan Pengembangan Aplikasinya​

  4. Haruskah saya menggunakan NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?

  5. Apa Langkah-Langkah Dalam Desain Basis Data?