Error Di MySQL dan Kaitannya dgn Store Procedure

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 kalau SQLSTATE 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 :

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.

Sekarang kita coba untuk menyelipkan perintah handler error di prosedur kita tadi :

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;

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.

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 :

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.

Iklan

5 thoughts on “Error Di MySQL dan Kaitannya dgn Store Procedure

  1. makasih banyak mas, pas dengan error di aplikasi y ane buat….hehehe… trigger nya error2 terus…

    semoga jadi amal jariah….

  2. mas.. saya mau tanya tentang error “Column count doesn’t match value count at row 1” ketika saya input dari localhost/phpmyadmin itu datanya masuk.. tapi ketika saya input dari aplikasinya langsung.. ada error seperti itu.. itu kira-kira cara memperbaiki errornya gmna ya mas? soalnya datanya tidak bisa saya input.
    Terima kasih sebelumnya mas 🙂

Silahkan Komentar...

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s