Cara menggunakan kesalahan 23000 mysql

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.

Cara menggunakan kesalahan 23000 mysql

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;
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

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;

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 toko

CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );

Menampilkan isi tabel

SELECT * FROM mhs
_

Cara menggunakan kesalahan 23000 mysql

Rekor bertambah 1,
Pesan kesalahan jika kami tidak menggunakan penanganan kesalahan

INSERT INTO MHS VALUES ('075410002','Yuda','Medan','L','1984-10-10','4');

Pesan eror

Cara menggunakan kesalahan 23000 mysql

Ulangi menjalankan SQL di atas

CALL tbh_cek('075410002','Yuda','Medan','L','1984-10-10','4',@p_result );
SELECT @p_result;
_

Cara menggunakan kesalahan 23000 mysql

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 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 SQLSTATE
Kode 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 %s

Contoh. 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

Cara menggunakan kesalahan 23000 mysql

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