MySQL 5.5+ รองรับ SIGNAL สำหรับโยน Error/Exception เองใน Stored Procedure, Trigger, Function
Syntax พื้นฐาน
SIGNAL SQLSTATE 'sqlstate_value'
SET MESSAGE_TEXT = 'ข้อความ Error',
MYSQL_ERRNO = error_number;
ตัวอย่างการใช้งาน
1. โยน Error แบบง่าย
SIGNAL SQLSTATE '42927'
SET MESSAGE_TEXT = 'Error Generated';
ผลลัพธ์
ERROR 1644 (42927): Error Generated
2. ใน Stored Procedure (Validation)
DELIMITER //
CREATE PROCEDURE InsertUser(IN p_age INT)
BEGIN
IF p_age < 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Age cannot be negative',
MYSQL_ERRNO = 1001;
END IF;
IF p_age > 150 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Age too high',
MYSQL_ERRNO = 1002;
END IF;
INSERT INTO users (age) VALUES (p_age);
END //
DELIMITER ;
3. ใน Trigger (BEFORE INSERT/UPDATE)
CREATE TRIGGER validate_age_before_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'User must be at least 18 years old';
END IF;
END;
SQLSTATE Codes ที่นิยมใช้
| SQLSTATE | ความหมาย | ใช้เมื่อไหร่ |
|---|---|---|
| 45000 | Unhandled User-Defined Exception | Custom Error ทั่วไป (แนะนำ) |
| 42927 | Function/Procedure Error | Error ใน Function/Procedure |
| 23000 | Integrity Constraint Violation | Foreign Key, Unique, Check Violation |
| 22003 | Numeric Value Out of Range | ค่าตัวเลขเกินช่วง |