29 Desember 2008

Error Handling Pada Stored Procedure MySQL

Dalam stored procedure MySQL perintah RaiseError() tidak ada sehingga untuk menangani error yang terjadi dalam stored procedure MySQL menggunakan trik parameter output sehingga pesan error dapat 'ditangkap' oleh aplikasi yang menjalankan stored procedure tersebut, untuk lebih jelasnya silahkan lihat contoh berikut:

CREATE PROCEDURE SaveToDB($npm VARCHAR(10), $nama VARCHAR(50), OUT Message VARCHAR(255))
BEGIN
DECLARE DUPLICATE_KEY CONDITION FOR 1062;
DECLARE FOREIGN_KEY_VIOLATED CONDITION FOR 1452;

-- Error handler untuk duplikasi data pada primary key
DECLARE EXIT HANDLER FOR DUPLICATE_KEY
BEGIN
SET Message = 'Data sudah ada, silahkan cek isian anda!';
END;

-- Error handler untuk kesalahan pada FOREGN KEY tabel lain
DECLARE EXIT HANDLER FOR FOREIGN_KEY_VIOLATED
BEGIN
SET Message = 'Referensi data salah, silahkan cek isian anda!';
END;

-- Error handler untuk kesalahan-kesalahan lain selain kedua handler diatas
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET Message = 'Error pada query!';
END;

-- Jalankan query seperti biasa
-- Insert ke tabel mahasiswa
INSERT INTO mahasiswa(npm, nama) VALUES ($npm, $nama);



END;


Untuk menggunakannya:

CALL SaveToDB('0015031054', 'Nasrul Fatoni', @Message);
SELECT @Message;

Nested Stored Procedure Transaction

Bagi yang mau buat aplikasi dengan menggunakan stored procedure MySQL harus berhati-hati dengan nested stored procedure.

Untuk nested stored procedure dengan fitur transaction tidak bisa menggunakan lebih dari satu Blok transaksi START TRANSACTION ... COMMIT/ROLLBACK. untuk itu cukup gunakan satu blok perintah START TRANSACTION ... COMMIT/ROLLBACK pada stored procedure utama.

Contoh:

CREATE PROCEDURE ProsedurMain()
BEGIN
START TRANSACTION
-- statement lain
-- ...
call ProsedurChild();
-- ...
-- statement lain
COMMIT;
END;


CREATE PROCEDURE ProsedurChild()
BEGIN
START TRANSACTION -- ==> statemet ini tidak perlu di tambahkan
-- statement lain
-- BLAH-BLAH
COMMIT; -- ==> statemet ini tidak perlu di tambahkan
END;