Semua error yang terjadi di MySQL sebenarnya memiliki nomor yang unik. Nomor itu dinamakan error code ( sifatnya unik,berbeda-beda ), memiliki penjelasan error berupa text, dan kode lain yaitu SQLSTATE yang sifatnya tidak unik karena tiap error kode memiliki SQLSTATE yang sama.
Pada contoh gambar diatas,
1136,1062,1048 : sebagai error code,
(21S01), (23000) : sebagai SQLSTATE,
“Column count doesn’t match value count at row 1” : sebagai penjelasan error.
Lihat, error code pasti berbeda-beda, sesuai dengan penjelasan errornya. Tapi kalauSQLSTATE kadang sama, kadang berbeda. Lihat bahwa code SQLSTATE 23000 bisa juga pada error code 1062 dan 1048.
Nah kalau kita membuat beberapa baris kode prosedur atau fungsi, lalu bila ada baris kode yang mengalami error maka baris selanjutnya tidak akan dieksekusi bila tidak diatur penanganan errornya. Misalkan :
1
2
3
4
5
6
7
| Create procedure insert_anggota_error ( in no integer , nm varchar (255), kota varchar (50), email varchar (255), out angka integer ) Begin Set angka = 1; Insert into anggota values ( no ,nm,kota,email); Set angka = 2; End |
Pada kode diatas, saya buat prosedur insert ke table anggota, namun sebelum melakukan proses insert, saya inisialisasi terlebih dahulu variable angka dengan nilai 1, lalu setelah proses insert saya insialisasi lagi variable angka dengan nilai 2.
Describe table anggota bisa lihat di artikel sebelumnya, anggap sudah ada sebaris anggota yang memiliki id no 1 bernama adiputra, kota bekasi, email ad1.putr4@yahoo.co.id. Yang primary key adalah no, jadi kalau kita masukan no 1 lagi pada table anggota, sudah pasti si error akan muncul.
Misalkan saya memanggil prosedur insert_anggota_error :
Call insert_anggota_error(1,’indah mardiah’,’bekasi’,null,@angka);
Maka pasti si error muncul, dan kalau kita select nilai dari angka dengan perintah :
Select @angka;
Maka variable angka bernilai null, karena terjadi error yang membatalkan semua setingan dari prosedur yang kita buat. Kecuali kita seting penanganan errornya, caranya ?
Di MySQL sudah ada penanganannya yaitu dengan menginisialisasi perintah berikut pada badan prosedur atau fungsi :
DECLARE HANDLER FOR
Ada 3 tipe handler, yaitu :
• Continue, maksudnya kalau terjadi error, maka proses berikutnya dari sebaris perintah yang mengalami error tetap dieksekusi.
• Exit, maksudnya kalau terjadi error, maka proses berikutnya dari sebaris perintah yang mengalami error dihentikan ( tidak dieksekusi ).
• Undo, (kurang tau), tapi setahu saya sekarang ini sedang dibuat cara kerjanya tentang tipe handler undo.
• Continue, maksudnya kalau terjadi error, maka proses berikutnya dari sebaris perintah yang mengalami error tetap dieksekusi.
• Exit, maksudnya kalau terjadi error, maka proses berikutnya dari sebaris perintah yang mengalami error dihentikan ( tidak dieksekusi ).
• Undo, (kurang tau), tapi setahu saya sekarang ini sedang dibuat cara kerjanya tentang tipe handler undo.
Sekarang kita coba untuk menyelipkan perintah handler error di prosedur kita tadi :
1
2
3
4
5
6
7
8
| create procedure insert_anggota_error_ok ( in no integer , in nm varchar (255), in kota varchar (50), in email varchar (255), out angka integer ) begin declare continue handler for sqlstate '23000' set angka = 1; insert into anggota values ( no ,nm,kota,email); set angka = 2; end |
kalau kita panggil dengan perintah :
Call insert_anggota_error_ok(1,’indah mardiah’,’bekasi’,null,@angka);
Maka si error gak muncul, dan kalau kita select @angka, maka bernilai 2. Ini dikarenakan tipe dari handler yang kita buat bertipe continue.
Sekarang coba kita ganti tipe handler dengan exit;
Sekarang coba kita ganti tipe handler dengan exit;
1
2
3
4
5
6
7
8
| create procedure insert_anggota_error_ok2 ( in no integer , in nm varchar (255), in kota varchar (50), in email varchar (255), out angka integer ) begin declare exit handler for sqlstate '23000' set angka = 1; insert into anggota values ( no ,nm,kota,email); set angka = 2; end |
Bila kita panggil prosedur insert_anggota_error_ok2, maka error tidak muncul. Namun nilai variable angka akan bernilai 1 karena saat terjadi error, nilai angka sudah di inisialisasi dengan nilai 1, tapi karena terjadi error, maka perintah-perintah setelah error tidak akan dieksekusi.
Dari 2 prosedur yang telah kita buat tadi, ada yang mengganjal??? gunanya potongan perintah sqlstate ‘23000’ apa? Perintah tersebut sebagai penangkap bila ada error dengan kode SQLSTATE 23000 sehingga error tidak akan memunculkan. lalu bagaimana kalau kita ganti kode SQLSTATE tersebut dengan 21S01 yang artinya salah satu errornya berarti jumlah kolom pada table tidak sesuai dengan jumlah field yang dimasukan.
1
2
3
4
5
6
7
8
| create procedure insert_anggota_error_ok3 ( in no integer , in nm varchar (255), in kota varchar (50), in email varchar (255), out angka integer ) begin declare continue handler for sqlstate '221S01' set angka = 1; insert into anggota values ( no ,nm,kota,email); set angka = 2; end |
Jadi saat kita panggil prosedur dengan perintah :
Call insert_anggota_error_ok3(1,’indah mardiah’,’bekasi’,null,@angka);
Maka pasti si error muncul dengan keterangan :
Error 1062 : Duplicate entry ‘1’ for key ‘PRIMARY’
Hal ini terjadi karena error tidak sesuai dengan setingan penanganan error yang diterapkan.
Berarti kita harus hapal macam-macam kode error dunk???
Iya boleh aja,,tapi klo males masih ada solusinya biar error gak muncul caranya buat setingan penanganan error seperti ini :
Berarti kita harus hapal macam-macam kode error dunk???
Iya boleh aja,,tapi klo males masih ada solusinya biar error gak muncul caranya buat setingan penanganan error seperti ini :
1
2
3
4
5
6
7
8
| create procedure insert_anggota_error_ok3 ( in no integer , in nm varchar (255), in kota varchar (50), in email varchar (255), out angka integer ) begin declare continue handler for SQLWARNING, NOT FOUND, SQLEXCEPTION set angka = 1; insert into anggota values ( no ,nm,kota,email); set angka = 2; end |
insyAllah si error gak muncul, lalu apa maksud SQLWARNING, NOT FOUND, SQLEXCEPTION ?
Silakan cari di Om Google yah,,,udah panjang banget ne artikelnya…
Saya rasa pengenalan error handler pada pembuatan prosedur atau fungsi di mysql sudah cukup. Kritik dan saran bisa anda komentarkan.
Moga bermanfaat buat yang sedang belajar mysql.
Saya rasa pengenalan error handler pada pembuatan prosedur atau fungsi di mysql sudah cukup. Kritik dan saran bisa anda komentarkan.
Moga bermanfaat buat yang sedang belajar mysql.
0 Komentar untuk "Error Di MySQL dan Kaitannya dgn Store Procedure"
Silahkan berkomentar dengan bijak dan positif. Komentar anda menunjukkan sikap anda. Terima kasih :-)