Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การใช้ DELETE ใน MySQL Stored Procedure พร้อม Parameter

สามารถสร้าง 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คำอธิบายตัวอย่าง
INInput בלבד (Default) ค่าจาก CallerIN id INT
OUTOutput เท่านั้น คืนค่าให้ CallerOUT result VARCHAR(100)
INOUTทั้ง Input และ OutputINOUT 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 ;