สามารถสร้าง Stored Procedure ที่รับ Parameter เข้ามา แล้วใช้ในคำสั่ง DELETE เพื่อลบข้อมูลตามเงื่อนไขที่กำหนดได้อย่างยืดหยุ่นและปลอดภัย
ตัวอย่างการใช้งาน
สร้างตาราง:
mysql> CREATE TABLE DemoTable1464 (
-> Id INT,
-> FirstName VARCHAR(20)
-> );
เพิ่มข้อมูล:
mysql> INSERT INTO DemoTable1464 VALUES (101, 'Chris Brown'), (102, 'John Doe');
ดูข้อมูล:
mysql> SELECT * FROM DemoTable1464; +------+-------------+ | Id | FirstName | +------+-------------+ | 101 | Chris Brown | | 102 | John Doe | +------+-------------+
สร้าง Stored Procedure ลบข้อมูลด้วย Parameter:
mysql> DELIMITER //
mysql> CREATE PROCEDURE delete_demo(IN local_Id INT, IN local_Name VARCHAR(20))
-> BEGIN
-> DELETE FROM DemoTable1464
-> WHERE Id = local_Id AND FirstName = local_Name;
-> END //
Query OK, 0 rows affected (0.24 sec)
mysql> DELIMITER ;
เรียก Procedure พร้อมส่งค่า Parameter:
mysql> CALL delete_demo(102, 'John Doe');
ตรวจสอบข้อมูลหลังลบ (เหลือแค่ Chris Brown):
mysql> SELECT * FROM DemoTable1464; +------+-------------+ | Id | FirstName | +------+-------------+ | 101 | Chris Brown | +------+-------------+
โครงสร้าง Stored Procedure
CREATE PROCEDURE procedure_name (IN param1 TYPE, IN param2 TYPE, ...)
BEGIN
-- SQL Statements ใช้ param1, param2 ใน WHERE, SET, ฯลฯ
END
Parameter Modes
| Mode | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| IN | Input בלבד (Default) ค่าจาก Caller | IN id INT |
| OUT | Output เท่านั้น คืนค่าให้ Caller | OUT result VARCHAR(100) |
| INOUT | ทั้ง Input และ Output | INOUT counter INT |
แนวทางปฏิบัติที่ดี (Best Practices)
- ใช้ Transaction หากมีหลายคำสั่ง:
START TRANSACTION; ... COMMIT; - เพิ่ม Error Handling:
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ... - Validate Input: เช็ค Parameter ก่อน DELETE
- Log การลบ: INSERT INTO audit_log ... BEFORE DELETE
- ใช้
LIMIT 1ใน DELETE หากต้องการลบแค่ 1 แถว (ป้องกันลบผิดหลายแถว)
ตัวอย่าง Procedure แบบสมบูรณ์
DELIMITER //
CREATE PROCEDURE safe_delete_user(IN p_user_id INT, OUT p_result VARCHAR(50))
BEGIN
DECLARE v_count INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SET p_result = 'ERROR: Database error';
END;
START TRANSACTION;
SELECT COUNT(*) INTO v_count FROM users WHERE id = p_user_id;
IF v_count = 0 THEN
SET p_result = 'ERROR: User not found';
ROLLBACK;
ELSE
DELETE FROM users WHERE id = p_user_id LIMIT 1;
SET p_result = 'SUCCESS: User deleted';
COMMIT;
END IF;
END //
DELIMITER ;