Dalam posting ini, saya membagikan demonstrasi lengkap tentang cara mengelola penanganan error/exception di Stored Procedure MySQL
Setiap kali pengecualian terjadi dalam prosedur tersimpan, sangat penting untuk menanganinya dengan menunjukkan pesan kesalahan yang tepat
Jika Anda tidak menangani pengecualian, akan ada peluang untuk menggagalkan aplikasi dengan pengecualian tertentu dalam prosedur tersimpan
Jika Anda mendapatkan kesalahan dalam prosedur tersimpan, alih-alih keluar, Anda harus melanjutkan tanpa pesan kesalahan. Itu berarti Anda dapat menampilkan kode atau pesan kesalahan default atau kustom apa pun ke aplikasi/pengguna
MySQL menyediakan Handler untuk menangani pengecualian dalam prosedur tersimpan
Di bawah ini adalah demonstrasi lengkap dari handler dengan contoh
1
2
3
4
5
6
7
8
9
10
/*Buat database karyawan untuk demo */
BUAT DATABASE Karyawan;
/*Buat contoh tabel EmployeeDetails. */
BUAT TABEL Karyawan. tbl_Detail Karyawan
(
EmpID INTEGER
,EmpName VARCHAR(50)
,AlamatEmail VARCHAR(50)
,CONSTRAINT pk_tbl_EmployeeDetails_EmpID PRIMARY KEY (EmpID)
)ENGINE = InnoDB;
Cara mendeklarasikan handler di store procedure
Sintaks Handler.
1
DECLARE handler_action HANDLER UNTUK condition_value. penyataan
Tiga jenis Handler_Action
Jenis Nilai Kondisi
- mysql_error_code
- sqlstate_value
- Peringatan SQL
- SQLException
- Tidak ditemukan
Bagaimana cara menulis handler dalam prosedur tersimpan?
E. g
1
2
3
4
DECLARE CONTINUE HANDLER UNTUK SQLEXCEPTION SELECT 'Terjadi kesalahan';
DECLARE CONTINUE HANDLER UNTUK SET SQLEXCEPTION IsError=1;
DECLARE EXIT HANDLER UNTUK SET SQLEXCEPTION IsError=1;
DECLARE EXIT HANDLER UNTUK SET SQLSTATE '23000' IsError = 1;
Di atas adalah empat contoh penangan yang berbeda. Sekarang, saya akan memasukkan nilai duplikat ke dalam kolom EmpID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DELIMITER //
BUAT PROSEDUR Karyawan. usp_InsertEmployeeDetails
(
InputEmpID INTEGER
,InputEmpName VARCHAR(50)
,InputEmailAddress VARCHAR(50)
)
/***************************************************
Nama Penulis. Anvesh Patel
Tanggal Dibuat. 20-05-2015
Keterangan. Ini adalah prosedur tersimpan demo untuk
masukkan record ke dalam tabel dengan tepat
penanganan kesalahan. Pada dasarnya untuk www. dbrand. pembaca com
****************************************************
MULAI
DECLARE CONTINUE HANDLER UNTUK SQLEXCEPTION SELECT 'Terjadi kesalahan';
INSERT INTO Karyawan. tbl_Detail Karyawan
(
EmpID
,EmpName
,Alamat email
)
NILAI
(
InputEmpID
,InputEmpName
,MasukanAlamatEmail
);
PILIH *DARI Karyawan. tbl_Detail Karyawan;
AKHIR
// PEMBATAS ;
Di SP di atas, saya mendefinisikan penangan LANJUTKAN dengan pesan pengecualian khusus saya
Sekarang, panggil SP di atas dua kali dengan EmpID yang sama
Pertama kali, itu akan berhasil dieksekusi, tetapi yang kedua kali akan menampilkan pesan kesalahan khusus
Seperti yang kita definisikan CONTINUE handler, jadi itu hanya akan menampilkan pesan kesalahan dan LANJUTKAN ke bagian selanjutnya dari pernyataan SELECT
Mari kita lihat,
1
2
PANGGILAN Karyawan. usp_InsertEmployeeDetails (1,'Anvesh','anvesh@gmail. com');
PANGGILAN Karyawan. usp_InsertEmployeeDetails (1,'Roy','Roy@gmail. com');
Di atas adalah dua panggilan berbeda dengan nilai EmpID yang sama. Panggilan pertama dijalankan tanpa pesan kesalahan dan panggilan kedua dijalankan dengan pesan kesalahan
Hasil Panggilan Kedua
Seperti yang kami definisikan LANJUTKAN, sehingga Anda dapat menemukan dua hasil pada gambar di atas. Salah satunya adalah pesan kesalahan khusus kami dan yang kedua adalah hasil dari pernyataan SELECT yang ditentukan
Eksekusi tidak berhenti karena kesalahan, dan berlanjut ke bagian lain
Sekarang, periksa handler EXIT
Harap ubah penangan Anda dan ganti LANJUTKAN dengan KELUAR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DELIMITER //
BUAT PROSEDUR Karyawan. usp_InsertEmployeeDetails
(
InputEmpID INTEGER
,InputEmpName VARCHAR(50)
,InputEmailAddress VARCHAR(50)
)
/***************************************************
Nama Penulis. Anvesh Patel
Tanggal Dibuat. 20-05-2015
Keterangan. Ini adalah prosedur tersimpan demo untuk
masukkan record ke dalam tabel dengan tepat
penanganan kesalahan. Pada dasarnya untuk www. dbrand. pembaca com
****************************************************
MULAI
DECLARE EXIT HANDLER UNTUK SQLEXCEPTION SELECT 'Terjadi kesalahan';
INSERT INTO Karyawan. tbl_Detail Karyawan
(
EmpID
,EmpName
,Alamat email
)
NILAI
(
InputEmpID
,InputEmpName
,MasukanAlamatEmail
);
PILIH *DARI Karyawan. tbl_Detail Karyawan;
AKHIR
// PEMBATAS ;
Panggil dengan parameter yang sama
1
PANGGILAN Karyawan. usp_InsertEmployeeDetails (1,'Roy','Roy@gmail. com');
Hasilnya adalah satu-satunya pesan kesalahan, dan Anda tidak dapat menemukan dua hasil seperti yang kami definisikan KELUAR untuk keluar dari kode saat terjadi kesalahan
Praktik terbaik adalah membuat parameter keluaran dan menyimpan 1 jika terjadi kesalahan
Kode aplikasi harus memeriksa parameter keluaran ini adalah NULL atau 1
1 = Kesalahan
NULL = Tidak Ada Kesalahan
Di bawah ini adalah prosedur tersimpan untuk ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DELIMITER //
BUAT PROSEDUR Karyawan. usp_InsertEmployeeDetails
(
InputEmpID INTEGER
,InputEmpName VARCHAR(50)
,InputEmailAddress VARCHAR(50)
, keluar IsError INTEGER
)
/***************************************************
Nama Penulis. Anvesh Patel
Tanggal Dibuat. 20-05-2015
Keterangan. Ini adalah prosedur tersimpan demo untuk disisipkan
merekam ke dalam tabel dengan penanganan kesalahan yang tepat
Pada dasarnya untuk www. dbrand. pembaca com
****************************************************
MULAI
DECLARE CONTINUE HANDLER UNTUK SET SQLEXCEPTION IsError=1;
INSERT INTO Karyawan. tbl_Detail Karyawan
(
EmpID
,EmpName
,Alamat email
)
NILAI
(
InputEmpID
,InputEmpName
,MasukanAlamatEmail
);
PILIH *DARI Karyawan. tbl_Detail Karyawan;
AKHIR
// PEMBATAS ;
Sekarang panggil SP di atas dan pilih parameter keluaran
1
2
PANGGILAN Karyawan. usp_InsertEmployeeDetails (1,'Roy','Roy@gmail. com',@IsError);
PILIH @IsError;
Sekarang Hasilnya
Di atas adalah demonstrasi sederhana Penanganan Kesalahan di MySQL. Anda juga dapat menggunakan SQLSTATE yang menampilkan pesan kesalahan default MySQL
21 Mei 2015 Anvesh Patel
Silahkan kunjungi artikel terkait lainnya
- MySQL. Kode kesalahan 1005 Tidak dapat membuat tabel (errno 150)
- MySQL. Apa peran utama dari. dari berkas?
- MySQL. Solusi terbaik untuk menghitung Umur dari Tanggal Lahir
- Sisipkan-Perbarui, Gabungkan pernyataan di MySQL
- MySQL. Nilai UDF ke SELECT dari String Terpisah Koma di posisi mana pun
- Prosedur Tersimpan di MySQL
- MySQL. Pertanyaan dan Jawaban Wawancara yang Sering Diajukan Bagian 7
- MySQL. Skrip untuk menemukan nilai AUTO_INCREMENT Terakhir untuk Tabel
Cara membuat pekerjaan di PostgreSQL PostgreSQL XML Type
Komentar. 20
Sunil
4 Januari 2017 jam 9. 29 pagi
hai Avnesh saya berjuang dengan DEFINER dalam prosedur tersimpan, dapatkah Anda menyarankan beberapa ide yang lebih baik
seperti DEFINER adalah =root
@%
maka saya tidak dapat menjalankan prosedur tersimpan ini dari mysql db lokal saya
, sebelumnya terima kasih
Shubhada Mulay
30 Januari 2017 pukul 10. 43 pagi
Hai Anvesh,
Saya pemula untuk MYSQL. Bisakah Anda menjelaskan lebih detail tentang Bagian Penanganan pengecualian ini?
Terima kasih banyak sebelumnya
Salam
Shubhada
Anvesh Patel
30 Januari 2017 pukul 6. 10 malam
Tentu, saya akan memperbarui artikel ini dan akan membagikan beberapa tautan lainnya
Victor R. Udeshi
14 Juli 2017 pukul 7. 03 sore
HI Anvesh,
Saya menggunakan penanganan kesalahan dalam proc tersimpan saya dan berfungsi dengan baik. hasilnya menunjukkan saya hanya 1 bidang, kesalahan
Apa yang saya coba lakukan adalah memanggil proc ke dalam perangkat lunak pelaporan (pentaho). ketika saya memanggil proc di pentaho, itu hanya menunjukkan bidang kesalahan
apakah ada cara agar semua bidang yang saya inginkan terlihat kosong dan pesan kesalahan jika ada kesalahan?
Ravi Kumar Chandran
25 September 2017 pukul 11. 16 sore
Anvesh,
Ini adalah artikel yang ditulis dengan baik dan Anda telah berhasil menjelaskan fitur yang cukup kompleks dengan istilah yang sederhana. terima kasih. itu berguna bagi saya
kaliyappan
9 November 2017 pukul 5. 53 pagi
Hai, Permintaan di bawah ini menunjukkan kepada saya “Tidak ada data. 1329 Tidak ada data – nol baris diambil, dipilih, atau diproses”. Tidak dapat memperbaikinya, bisakah Anda membantu saya
MULAI
DECLARE from_date DATETIME;
MENYATAKAN sampai_tanggal DATETIME;
MENYATAKAN nama host VARCHAR(50);
MENYATAKAN nama layanan VARCHAR(50);
MENYATAKAN running_no INT;
MENYATAKAN loop_no INT;
MENYATAKAN nilai1 FLOAT;
MENYATAKAN nilai2 FLOAT;
MENYATAKAN nilai3 FLOAT;
MENYATAKAN negara INT;
DECLARE logdate DATETIME;
MENYATAKAN prev_status INT;
MENYATAKAN C1len INT;
MENYATAKAN c2len INT;
MENYATAKAN c2flag INT;
MENYATAKAN IsError INT;
DECLARE c1 CURSOR UNTUK SELECT host_name sebagai host, service_name sebagai layanan DARI cmp_warehouse. tbl_health_events_csv GROUP BY host_name,service_name ORDER BY host_name, service_name;
SET running_no = 1;
BUKA c1;
atur c1len = (PILIH DITEMUKAN_ROWS());
l_c1. LINGKARAN
FETCH c1 INTO hostname,servicename;
MASUKKAN KE cmp_warehouse. temp_event_data_4 (host, layanan, conelen) NILAI (nama host, nama layanan, c1len);
SET loop_no=1;
BLOK2. MULAI
DECLARE c2 CURSOR UNTUK SELECT val1,val2,val3,status_check sebagai status, event_time sebagai logtime DARI cmp_warehouse. tbl_health_events_csv WHERE host_name = hostname AND service_name = servicename ORDER BY event_time ASC;
BUKA c2;
atur c2len = (PILIH DITEMUKAN_ROWS());
SET c2flag = 1;
l_c2. LINGKARAN
FETCH c2 INTO value1,value2,value3,state,logdate;
MASUKKAN KE cmp_warehouse. temp_event_data_3 (val1, val2, val3, status, logtime,prev_sta,ctwolen,c2flg) NILAI (nilai1,nilai2,nilai3,status,logdate,prev_status,c2len,c2flag);
JIKA loop_no=1 MAKA
MASUKKAN KE cmp_warehouse. temp_event_data_2 (row_no, host, service, val1, val2, val3, status, start_time, end_time,dibuat) VALUES (running_no, hostname, servicename, value1, value2, value3, state, logdate, NULL,NOW());
SET loop_no = loop_no +1;
SET prev_status = status;
BERAKHIR JIKA;
JIKA nyatakan prev_status THEN
UPDATE cmp_warehouse. temp_event_data_2 SET end_time = logdate WHERE row_no = running_no;
SET running_no = running_no +1;
MASUKKAN KE cmp_warehouse. temp_event_data_2 (row_no, host, service, val1, val2, val3, status, start_time, end_time,dibuat) VALUES (running_no, hostname, servicename, value1, value2, value3, state, logdate, NULL,NOW());
BERAKHIR JIKA;
SET prev_status = status;
JIKA c2len = c2flag MAKA
UPDATE temp_event_data_2 SET end_time = logdate WHERE row_no = running_no;
SET running_no = running_no + 1;
TINGGALKAN l_c2;
BERAKHIR JIKA;
SET c2flag = c2flag + 1;
AKHIR LOOP l_c2;
TUTUP c2;
BLOK AKHIR2;
AKHIR LOOP l_c1;
TUTUP c1;
AKHIR
Anvesh Patel
9 November 2017 pukul 9. 57 pagi
Saya pikir ini adalah logika Anda dan tidak terkait dengan posting ini, jika Anda memerlukan bantuan lain, hubungi saya melalui halaman HUBUNGI SAYA. Saya akan mencoba membantu Anda
Sanket Kale
2 Januari 2018 pukul 7. 46 pagi
Bagaimana cara mengetahui kesalahan runtime dalam prosedur tersimpan mysql?
Apakah ada cara untuk mencetak kesalahan yang terjadi saat menjalankan SP?
Mohon jelaskan dengan sebuah contoh
Terima kasih sebelumnya
Arti
28 Juli 2018 pukul 10. 38 pagi
berbagi contoh bagus untuk penanganan kesalahan mysql
Ben Oakes
16 Agustus 2018 pukul 7. 01 pagi
Ketika datang untuk menangani masalah kueri SQL, ini seringkali lebih mudah diperbaiki daripada masalah PHP murni karena Anda dapat mempersempit posisi kesalahan 0xc0000185
Himanshu
17 Agustus 2018 pukul 6. 40 pagi
Hi Avinash,
bisakah Anda memberi tahu saya, bagaimana kami dapat mencetak pengecualian waktu berjalan
survai shivani
22 November 2018 pukul 10. 23 pagi
saat menelepon di atas SP dengan empID saya mendapatkan kesalahan. Pepatah,
Kesalahan 4052 (42S22). Kolom tidak dikenal 'InputEmpID' di 'daftar bidang'
Edward_abino
13 Desember 2018 pukul 8. 41 pagi
MySQL menyediakan cara mudah untuk mendefinisikan penangan yang menangani dari kondisi umum seperti peringatan atau pengecualian hingga kondisi tertentu e. g. , kode kesalahan tertentu
Puneet Papneja
15 Juni 2019 pukul 8. 00 pagi
Apakah ada cara untuk menggunakan penanganan kesalahan di dalam transaksi tetapi tidak menggunakan prosedur penyimpanan?
Labonya Das
26 November 2019 pukul 4. 22 pagi
Saya ingin menangkap kesalahan DB yang sebenarnya bukan pesan kesalahan yang ditentukan pengguna seperti yang tertulis di sini. Dengan cara yang kami miliki di Oracle dan SQL server, kesalahan DB yang tepat ditangkap ketika terjadi pengecualian. Ada ide tentang ini, silakan bagikan dan terima kasih atas saran Anda sebelumnya
Bagaimana cara menangani pengecualian dalam prosedur MySQL?
MySQL menyediakan penangan untuk menangani pengecualian dalam prosedur tersimpan. Anda dapat menangani pengecualian ini dengan mendeklarasikan penangan menggunakan MySQL DECLARE. Pernyataan PENANGAN .
Bagaimana Anda menangani pengecualian dalam prosedur tersimpan?
Untuk memunculkan pengecualian dalam prosedur tersimpan, gunakan sintaks berikut. Nama PENGECUALIAN; di mana .
Bagaimana cara mendeklarasikan pengecualian di MySQL?
Bentuknya bisa sebagai berikut. .
mysql_error_code. Literal bilangan bulat yang menunjukkan kode kesalahan MySQL, seperti 1051 untuk menentukan "tabel tidak dikenal". .
SQLSTATE [NILAI] sqlstate_value. Literal string 5 karakter yang menunjukkan nilai SQLSTATE, seperti '42S01' untuk menentukan "tabel tidak dikenal"
Bagaimana Anda menangani kondisi kesalahan saat menulis prosedur tersimpan atau mengakses prosedur tersimpan dari Java?
Ketika Anda memanggil stored procedure, itu akan dijalankan di server database jadi jika ada pengecualian terjadi yang dapat ditangani di blok EXCEPTION di stored procedure. Jika prosedur tersimpan itu sendiri gagal, ia melontarkan pengecualian SQL yang dapat ditangani oleh try/catch block dan membungkusnya dengan pengecualian khusus proyek Anda .