Semua error yang terjadi pada MySQL sebenarnya memiliki nomor yang unik. Angka itu disebut kode kesalahan (sifatnya unik, berbeda-beda), memiliki penjelasan tentang kesalahan dalam bentuk teks, dan kode lain adalah SQLSTATE yang tidak unik karena setiap kode kesalahan memiliki SQLSTATE yang sama.
Pada contoh gambar di atas,
1136,1062,1048 : sebagai error code,
(21S01), (23000) : sebagai SQLSTATE,
“Column count doesn’t match value count at row 1” : sebagai penjelasan error.
Begini, kode errornya pasti berbeda, sesuai dengan penjelasan errornya. Tapi kalau SQLSTATE kadang sama, kadang beda. Lihat bahwa kode SQLSTATE 23000 juga bisa berupa kode kesalahan 1062 dan 1048
Nah, jika kita membuat beberapa baris kode prosedur atau fungsi, kemudian jika ada baris kode yang mengalami error, maka baris berikutnya tidak akan dijalankan jika penanganan error tidak diatur. Misalnya
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; EndPada kode di atas saya membuat prosedur insert ke tabel member, namun sebelum melakukan proses insert saya terlebih dahulu menginisialisasi variabel numerik dengan nilai 1, kemudian setelah proses insert saya menginisialisasi lagi variabel numerik dengan nilai 2
Penjelasan tabel member bisa dilihat di artikel sebelumnya, misalkan sudah ada deretan member yang memiliki id nomor 1 bernama adiputra, kota bekasi, email ad1. putr4@yahoo. bersama. pengenal. Kunci utama adalah angka, jadi jika kita memasukkan angka 1 lagi di tabel anggota, pasti akan muncul kesalahan
Misalkan saya memanggil prosedur insert_member_error
Call insert_member_error(1,'indah mardiah','bekasi',null,@angka);
Maka kesalahan harus muncul, dan jika kita memilih nilai dari angka dengan perintah
Pilih @nomor;
Kemudian variabel numeriknya null, karena terjadi kesalahan yang membatalkan semua pengaturan dari prosedur yang kita buat. Kecuali kita mengatur penanganan kesalahan, bagaimana?
Di MySQL sudah ada penanganannya, yaitu dengan menginisialisasi perintah berikut di badan prosedur atau fungsi
MENYATAKAN PENANGANAN UNTUK
Ada 3 jenis penangan, yaitu
• Continue, artinya jika terjadi error, maka proses selanjutnya dari command line yang mengalami error akan tetap dijalankan
• Exit, artinya jika terjadi error, maka proses selanjutnya dari baris perintah yang mengalami error dihentikan (tidak dijalankan)
• Membatalkan
Sekarang kita coba masukkan perintah error handler pada 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 _jika kita memanggil dengan perintah
Call insert_member_error_ok(1,'indah mardiah','bekasi',null,@angka);
Agar tidak muncul error, dan jika kita memilih @number, maka nilainya adalah 2. Ini karena tipe handler yang kita buat adalah tipe continue
Sekarang coba ganti tipe handler dengan exit;
Saat kita memanggil prosedur insert_member_error_ok2, error tidak muncul. Namun nilai variabel numerik akan menjadi 1 karena ketika terjadi kesalahan, nilai numerik sudah diinisialisasi dengan nilai 1, tetapi karena terjadi kesalahan, perintah setelah kesalahan tidak akan dijalankan
Dari 2 prosedur yang sudah kita lakukan tadi apakah ada kendala??? . lalu bagaimana jika kode SQLSTATE kita ganti dengan 21S01 yang artinya salah satu error artinya jumlah kolom pada tabel tidak sesuai dengan jumlah field yang dimasukkan
Program yang baik adalah jika terjadi error maka program tidak crash, crash terjadi karena ada kesalahan dalam memasukkan data, akibatnya error tersebut menyebabkan aplikasi menjadi crash. Database MySQL telah mendukung perintah untuk menghindari kesalahan dengan menempatkan handel kesalahan perint ke dalam Stored Procedure
Berikut ini adalah contoh stored procedure untuk menangani error
CREATE TABLE `mhs` ( `no_mhs` char(9) NOT NULL, `nama` char(30) DEFAULT NULL, `alamat` char(30) DEFAULT NULL, `seks` char(1) DEFAULT NULL, `tgl_lhr` date DEFAULT NULL, `agama` char(1) DEFAULT NULL , PRIMARY KEY (`no_mhs`) ) ;Buat prosedur Strored untuk menambahkan rekaman tabel MHS
DELIMITER $$ DROP PROCEDURE IF EXISTS `akademik`.`Tbh_cek`$$ CREATE PROCEDURE `Tbh_cek`( p_no_mhs varchar(9), p_nama varchar(30), p_alamat varchar(30), p_seks varchar(1), p_tgl_lhr char(10), p_agama varchar(1),OUT pesan Varchar(255)) BEGIN DECLARE DUPLICATE_KEY CONDITION FOR 1062; DECLARE FOREIGN_KEY_VIOLATED CONDITION FOR 1452; DECLARE EXIT HANDLER FOR DUPLICATE_KEY BEGIN SET pesan = 'Kunci nomor mhs kembar!'; END; INSERT INTO mhs(no_mhs,nama,alamat,seks,tgl_lhr,agama) VALUES(p_no_mhs,p_nama,p_alamat,p_seks,p_tgl_lhr,p_agama); END$$ DELIMITER ;_Cara memanggil prosedur toko
CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );Menampilkan isi tabel
SELECT * FROM mhs_Rekor bertambah 1,
Pesan kesalahan jika kami tidak menggunakan penanganan kesalahan
Pesan eror
Ulangi menjalankan SQL di atas
CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result ); SELECT @p_result;_Proses diatas field no_mhs merupakan primary key jadi tidak boleh ada yang sama, jika ada penambahan data no_mhs yang sama akan terjadi error, untuk menghindari error maka dibuat prosedur untuk menampilkan error tersebut
Cek Kondisi
Pada stored procedure, pengecekan kondisi merupakan event yang secara khusus memberikan pesan jika terjadi error
Bentuk dari perintah DECLARE HANDLER adalah
MENYATAKAN handler_type HANDLER
UNTUK nilai_kondisi [, nilai_kondisi] …
penyataan
Ada tiga deklarasi penangan;
• Jenis penangan (LANJUTKAN, KELUAR)
• Pengendali kondisi (SQLSTATE, kode kesalahan MySQL, nama kondisi)
• Penangan tindakan
Jenis penangan
MELANJUTKAN. lewati proses jika terjadi kesalahan
KELUAR. dalam blok proses terjadi kesalahan, kalikan keluar dari proses
Kemudian kode error berupa kode numerik misal 1062 adalah jika ada kunci duplikat
Kondisi penangan
Menentukan kondisi sesuai dengan kode kesalahan yang ditemukan dalam daftar kode MySQL atau standar kesalahan dalam SQLSTATE standar ANSI. Nama kondisi yang ditemukan dalam sistem MySQL adalah. SQLWARNING, TIDAK DITEMUKAN, SQLEXCEPTION
Contoh
DECLARE CONTINUE HANDLER UNTUK 1062 SET duplikat_key=1;
Kode kesalahan di SQLSTATE independen menggunakan standar ANSI, mendukung misalnya pada sistem. Oracle, SQL Server, DB2, dan MySQL,
Contoh berikut adalah kode kesalahan untuk SQLSTATE
MENYATAKAN LANJUTKAN HANDLER UNTUK SQLSTATE '23000'
SET duplikat_kunci=1;
Berikut adalah Tabel Kode Kesalahan
Kemudian kode error berupa kode numerik misal 1062 adalah jika ada kunci duplikat
Meja. Kode kesalahan MySQL dan SQLSTATEKode MySQL Pesan Kesalahan Kode SQLSTATE 1011HY000 Kesalahan saat menghapus '%s' (errno. %d)1021HY000Disk penuh (%s); . . . 102223000 Tidak dapat menulis; . %s132524000Cursor is already open132624000Cursor is not open1328HY000Incorrect number of FETCH variables13292000No data to FETCH133642000USE is not allowed in a stored program133742000Variable or condition declaration after cursor or handler declaration133842000Cursor declaration after handler declaration133920000Case not found for CASE statement1348HY000Column '%s' is not updatable1357HY000Can't drop a %s dari dalam rutinitas lain yang tersimpan1358HY000GOTO tidak diizinkan dalam penangan program tersimpan1362HY000Memperbarui baris %s tidak diizinkan di pemicu %s1363HY000Tidak ada baris %s di pemicu %sContoh. kesalahan penanganan
MENYATAKAN sqlcode INT DEFAULT 0;
DECLARE status_message VARCHAR(50);
DELIMITER $$ DROP PROCEDURE IF EXISTS `akademik`.`Tbh_cek`$$ CREATE PROCEDURE `Tbh_cek`( p_no_mhs varchar(9), p_nama varchar(30), p_alamat varchar(30), p_seks varchar(1), p_tgl_lhr char(10), p_agama varchar(1),OUT pesan Varchar(255)) BEGIN DECLARE DUPLICATE_KEY CONDITION FOR 1062; DECLARE FOREIGN_KEY_VIOLATED CONDITION FOR 1452; DECLARE EXIT HANDLER FOR DUPLICATE_KEY BEGIN SET pesan = 'Kunci nomor mhs kembar!'; END; INSERT INTO mhs(no_mhs,nama,alamat,seks,tgl_lhr,agama) VALUES(p_no_mhs,p_nama,p_alamat,p_seks,p_tgl_lhr,p_agama); END$$ DELIMITER ;_8
DECLARE CONTINUE HANDLER UNTUK kunci_duplikat
MULAI
SET sqlcode=1052;
SET status_message='Kesalahan kunci duplikat';
AKHIR;
DELIMITER $$ DROP PROCEDURE IF EXISTS `akademik`.`Tbh_cek`$$ CREATE PROCEDURE `Tbh_cek`( p_no_mhs varchar(9), p_nama varchar(30), p_alamat varchar(30), p_seks varchar(1), p_tgl_lhr char(10), p_agama varchar(1),OUT pesan Varchar(255)) BEGIN DECLARE DUPLICATE_KEY CONDITION FOR 1062; DECLARE FOREIGN_KEY_VIOLATED CONDITION FOR 1452; DECLARE EXIT HANDLER FOR DUPLICATE_KEY BEGIN SET pesan = 'Kunci nomor mhs kembar!'; END; INSERT INTO mhs(no_mhs,nama,alamat,seks,tgl_lhr,agama) VALUES(p_no_mhs,p_nama,p_alamat,p_seks,p_tgl_lhr,p_agama); END$$ DELIMITER ;_9
DECLARE CONTINUE HANDLER UNTUK foreign_key_violated
MULAI
SET sqlcode=1216;
SET status_message='Kunci asing dilanggar';
AKHIR;
CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );0
CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );1 CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );2 CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );3
CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );_4
CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );5 CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );6
CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );_7
MENYATAKAN LANJUTKAN HANDLER UNTUK TIDAK DITEMUKAN
MULAI
SET sqlcode=1329;
SET status_message='Tidak ada catatan ditemukan';
AKHIR;
Contoh
Buat Stored Procedure untuk menambahkan record tabel MHS, dengan nama Simpan_mhs(... ,………,…. Dst), seperti pada script berikut
DELIMITER $$ DROP PROCEDURE IF EXISTS `akademik`.`Simpan_mhs`$$ CREATE PROCEDURE Simpan_mhs(p_no_mhs varchar(9) ,p_nama varchar(30) ,p_alamat varchar(30) ,p_seks varchar(1) ,p_tgl_lhr char(10) ,p_agama varchar(1),OUT pesan Varchar(255)) BEGIN DECLARE DUPLICATE_KEY CONDITION FOR 1062; DECLARE FOREIGN_KEY_VIOLATED CONDITION FOR 1452; DECLARE EXIT HANDLER FOR DUPLICATE_KEY BEGIN SET pesan = 'Kunci utama terjadi duplikasi!'; END; DECLARE EXIT HANDLER FOR FOREIGN_KEY_VIOLATED BEGIN SET pesan = 'Referensi data salah !'; END; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET pesan = 'Kasalahan pada perintah query!'; END; INSERT INTO mhs(no_mhs,nama,alamat,seks,tgl_lhr,agama) VALUES(p_no_mhs,p_nama,p_alamat,p_seks,p_tgl_lhr,p_agama); END;$$ DELIMITER ;Jalankan skrip
Pengujian
mysql> CALL Simpan_mhs('075410002','Yuda','Medan','L','1984-10-10','4',@pesan ); Query OK, 0 rows affected (0.02 sec) mysql>SELECT @pesan; +-------------------------------+ | @pesan | +-------------------------------+ | Kunci utama terjadi duplikasi! | +-------------------------------+ 1 row in set (0.00 sec) mysq>;Latihan
Transaksi penjualan yang sederhana misalnya melibatkan 2 tabel, antara lain tabel barang yang menyimpan stok dan jenis barang, dan tabel penjualan yang mencatat transaksi penjualan. Untuk proses pencatatan transaksi penjualan menggunakan 2 stored procedure, yang pertama mencatat penjualan, dan yang kedua memotong stok pada tabel barang. Langkah-langkahnya adalah sebagai berikut
Buat struktur tabel ITEM berikut
CREATE TABLE barang (kd_brg CHAR(5), nm_brg CHAR(20), stok int, satuan CHAR(20), harga int, primary key (kd_brg)); Tambahkan isi rekaman sebagai berikut : INSERT INTO barang VALUES('K0001','Buku ',100,'Pcs',5000); INSERT INTO barang VALUES('K0002','Pesil 2B',200,'Pcs',3000); INSERT INTO barang VALUES('K0003','Pengahpus',100,'Pcs',1000); INSERT INTO barang VALUES('K0004','Kertas HVS',200,'Rem',30000); INSERT INTO barang VALUES('K0005','Gunting kecil',10,'Pcs',6000);Lihat isi tabel
Buat struktur tabel JUAL sesuai perintah berikut
DELIMITER $$ DROP PROCEDURE IF EXISTS `akademik`.`Tbh_cek`$$ CREATE PROCEDURE `Tbh_cek`( p_no_mhs varchar(9), p_nama varchar(30), p_alamat varchar(30), p_seks varchar(1), p_tgl_lhr char(10), p_agama varchar(1),OUT pesan Varchar(255)) BEGIN DECLARE DUPLICATE_KEY CONDITION FOR 1062; DECLARE FOREIGN_KEY_VIOLATED CONDITION FOR 1452; DECLARE EXIT HANDLER FOR DUPLICATE_KEY BEGIN SET pesan = 'Kunci nomor mhs kembar!'; END; INSERT INTO mhs(no_mhs,nama,alamat,seks,tgl_lhr,agama) VALUES(p_no_mhs,p_nama,p_alamat,p_seks,p_tgl_lhr,p_agama); END$$ DELIMITER ;_0Kemudian buat Stored Procedure Potong_stok(………), isikan parameternya seperti pada script berikut