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,
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; End Pada 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
Maka kesalahan harus muncul, dan jika kita memilih nilai dari angka dengan perintah
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
Ada 3 jenis penangan, yaitu 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
Agar tidak muncul error, dan jika kita memilih @number, maka nilainya adalah 2. Ini karena tipe handler yang kita buat adalah tipe continue 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 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 tokoCALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result ); Menampilkan isi tabel SELECT * FROM mhs_ Rekor bertambah 1, INSERT INTO MHS VALUES ('075410002','Yuda','Medan','L','1984-10-10','4'); Pesan eror Ulangi menjalankan SQL di atas CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result ); SELECT @p_result;_ DECLARE EXIT HANDLER FOR DUPLICATE_KEY BEGIN SET pesan = 'Kunci nomor mhs kembar!'; END;_ 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 KondisiPada stored procedure, pengecekan kondisi merupakan event yang secara khusus memberikan pesan jika terjadi error Bentuk dari perintah DECLARE HANDLER adalah Ada tiga deklarasi penangan; Jenis penanganMELANJUTKAN. lewati proses jika terjadi kesalahan Kemudian kode error berupa kode numerik misal 1062 adalah jika ada kunci duplikat Kondisi penanganMenentukan 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, 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; 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 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 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; ContohBuat 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 Pengujianmysql> 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>; LatihanTransaksi 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 ;_0 Kemudian buat Stored Procedure Potong_stok(………), isikan parameternya seperti pada script berikut |