ตอนที่ 11 : การใช้ Error Handling หรือ Try Catch ดักจับข้อผิดลาด (MySQL : Stored Procedure) |
ตอนที่ 11 : การใช้ Error Handling หรือ Try Catch ดักจับข้อผิดลาด (MySQL : Stored Procedure) ใน MySQL Stored Procedure ผมพยายามหาว่ามีชุดคำสั่งเกี่ยวกับ Try Catch เพื่อดักจับ Error Exception เหมือนกับภาษาอื่น ๆ ว่ามีหรือไม่ แต่คำตอบที่ได้คือไม่มี จะมีแต่คำสั่งเกี่ยวกับ HANDLER FOR SQLEXCEPTION ไว้ Handling ในกรณีที่ Error เกิดขึ้นใน Statement ซึ่งเป็นชุดคำสั่งที่ง่าย ๆ ไม่มีอะไรซับซ้อน เช่น ใช้ HANDLER ตรวจสอบการ Insert ซ้ำของ Key (Duplicate Key) จะใช้เป็น 1062 ก็จะกำหนดค่าตัวแปรตามที่เรากำหนดไว้ แล้วนำค่าที่ได้นั้นไปใช้งาน
โครงสร้างของตาราง customer และ country
Table : customer
ERROR HANDLER Syntax
DROP PROCEDURE IF EXISTS Stored_Name;
DELIMITER //
CREATE PROCEDURE Stored_Name()
BEGIN
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
# Statement 1
# Statement 2
END;
// Statement for after exit handler error (1)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
# Statement 3
# Statement 4
END;
// Statement for after exit handler error (2)
END //
DELIMITER ;
ทั้งนี้ SQLEXCEPTION สามารถระบุเป็น Code ได้ เช่น 1062 เป็น Error กรณีที่ Insert แล้ว Key ซ้ำ
Example 1 : ตัวอย่างการใช้ ERROR HANDLER ในรูปแบบที่ง่าย ๆ บน MySQL Store Procedure
DROP PROCEDURE IF EXISTS insertCustomer;
DELIMITER //
CREATE PROCEDURE insertCustomer(IN pCustomerID VARCHAR(4),
IN pName VARCHAR(150),
IN pEmail VARCHAR(150),
IN pCountryCode VARCHAR(2),
IN pBudget DECIMAL(18,2),
IN pUsed DECIMAL(18,2))
BEGIN
# Declare Flag for Error
DECLARE duplicateKey BOOLEAN DEFAULT FALSE;
BEGIN
DECLARE EXIT HANDLER FOR 1062 /* Duplicate key*/ SET duplicateKey = TRUE;
#DECLARE CONTINUE HANDLER FOR NOT FOUND SET errorStatus = FALSE;
# Statement 1
INSERT INTO customer (CUSTOMER_ID, NAME, EMAIL, COUNTRY_CODE, BUDGET, USED)
VALUES (pCustomerID, pName, pEmail, pCountryCode, pBudget, pUsed);
# Statement 2
INSERT INTO customer (CUSTOMER_ID, NAME, EMAIL, COUNTRY_CODE, BUDGET, USED)
VALUES (pCustomerID, pName, pEmail, pCountryCode, pBudget, pUsed);
END;
# Case error in HANDLER
IF duplicateKey = TRUE THEN
#SELECT "Error Duplicate Key";
CALL writeLog('Error Insert duplicate Key');
END IF;
END //
DELIMITER ;
จากตัวอย่างนี้ตัวแปรตั้งต้น duplicateKey = FALSE ซึ่งทำการ Insert ข้อมูลลง 2 ครั้ง จะเกิด Error แน่นอน ในกรณีที่ Error เกี่ยวกับการ INSERT Key ซ้ำ และจะเปลี่ยนค่า duplicateKey = TRUE ซึ่งใน สุดท้ายของ Statement เราใช้การเก็บ Log ว่ามีการ Error เกี่ยวกับ Insert duplicate Key
อ้างถึงการจัดเก็บ Message Log : ตอนที่ 3 : การ Print และแสดงผลบน Stored Procedure (MySQL : Stored Procedure)
CALL insertCustomer('C005','Fun Wipa','[email protected]','TH','100000','0');
Result
ผลลัพธ์ที่ได้เมื่อทำการ Insert ลงใน Message Log
Example 2 : ตัวอย่างการใช้ ERROR HANDLER การ Insert ข้อมูลและส่ง OUT ที่เป็น Result กลับไป พร้อมกับการดักจับ EXCEPTION
DROP PROCEDURE IF EXISTS insertCustomer;
DELIMITER //
CREATE PROCEDURE insertCustomer(IN pCustomerID VARCHAR(4),
IN pName VARCHAR(150),
IN pEmail VARCHAR(150),
IN pCountryCode VARCHAR(2),
IN pBudget DECIMAL(18,2),
IN pUsed DECIMAL(18,2),
OUT pResult INT,
OUT pMessage VARCHAR(500))
BEGIN
# Declare Variable
DECLARE errCode CHAR(5) DEFAULT '00000';
DECLARE errMsg TEXT;
DECLARE effRows INT;
# Declare Handler Exception
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
errCode = RETURNED_SQLSTATE, errMsg = MESSAGE_TEXT;
END;
# Statement
INSERT INTO customer (CUSTOMER_ID, NAME, EMAIL, COUNTRY_CODE, BUDGET, USED)
VALUES (pCustomerID, pName, pEmail, pCountryCode, pBudget, pUsed);
# Set Result
IF errCode = '00000' THEN
GET DIAGNOSTICS effRows = ROW_COUNT;
SET pResult = effRows;
SET pMessage = 'Insert Data Successfully';
ELSE
SET pResult = 0;
SET pMessage = CONCAT('Error, Code = ',errCode,', Message = ',errMsg);
END IF;
END //
DELIMITER ;
กรณีทำสำเร็จจะแสดงผลและส่งกลับ OUT
pResult = 1
pMessage = Insert Data Successfully
กรณีทำไม่สำเร็จจะแสดงผลและส่งกลับ OUT
pResult = 0
pMessage = ERR FROM MYSQL
ตอนที่ 9 : การใช้พารามิเตอร์ชนิด OUT เพื่อส่งค่ากลับ (MySQL : Stored Procedure)
|