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

เขียน Stored Procedure สำหรับ INSERT ข้อมูลใน phpMyAdmin/MySQL


แนวคิด

Stored Procedure บรรจุ logic การ INSERT ไว้ใน database เรียกใช้ด้วย CALL ลด network round-trip และซ่อน SQL complexity

ตัวอย่างครบถ้วน

1. สร้างตาราง

mysql> create table StoredProcedureInsertDemo 
    -> ( 
    -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> UserName varchar(20), 
    -> UserAge int 
    -> ); 
Query OK, 0 rows affected (0.63 sec)

2. สร้าง Stored Procedure

mysql> DELIMITER //
mysql> CREATE PROCEDURE procedure_InsertIntoTable(
    ->   IN FirstName VARCHAR(100),
    ->   IN Age INT
    -> )
    -> BEGIN
    ->   INSERT INTO StoredProcedureInsertDemo(UserName, UserAge) 
    ->   VALUES (FirstName, Age);
    -> END //
Query OK, 0 rows affected (0.34 sec)

mysql> DELIMITER ;

DELIMITER // เปลี่ยน delimiter ชั่วคราว เพื่อให้ ; ใน procedure body ไม่จบคำสั่ง CREATE

3. เรียกใช้ Procedure

mysql> CALL procedure_InsertIntoTable('Larry', 23); 
Query OK, 1 row affected, 1 warning (0.19 sec)

4. ตรวจสอบข้อมูล

mysql> select * from StoredProcedureInsertDemo;
+--------+----------+---------+
| UserId | UserName | UserAge |
+--------+----------+---------+
| 1      | Larry    | 23      |
+--------+----------+---------+

Procedure ขั้นสูง: มี Validation และ Return ID

DELIMITER //
CREATE PROCEDURE sp_insert_user(
    IN p_name VARCHAR(100),
    IN p_age INT,
    IN p_email VARCHAR(100),
    OUT p_user_id INT,
    OUT p_status VARCHAR(50)
)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SET p_status = 'ERROR';
        SET p_user_id = -1;
        ROLLBACK;
    END;
    
    START TRANSACTION;
    
    -- Validation
    IF p_name IS NULL OR TRIM(p_name) = '' THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Name cannot be empty';
    END IF;
    
    IF p_age < 0 OR p_age > 150 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid age';
    END IF;
    
    IF p_email NOT REGEXP '^[^@]+@[^@]+\.[^@]+$' THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid email format';
    END IF;
    
    -- Insert
    INSERT INTO users (name, age, email) VALUES (p_name, p_age, p_email);
    SET p_user_id = LAST_INSERT_ID();
    SET p_status = 'SUCCESS';
    
    COMMIT;
END //
DELIMITER ;

เรียกใช้กับ OUT parameters

CALL sp_insert_user('John', 25, 'john@example.com', @user_id, @status);
SELECT @user_id, @status;

ใน phpMyAdmin

  1. แท็บ Routines → Add routine
  2. ประเภท: PROCEDURE
  3. ชื่อ: procedure_InsertIntoTable
  4. Parameters: เพิ่ม IN parameters (FirstName VARCHAR(100), Age INT)
  5. Definition: ใส่ body ระหว่าง BEGIN ... END
  6. กด Go

ข้อดีของ Stored Procedure

  • Encapsulation: ซ่อน SQL complexity
  • Performance: Execution plan cached, ลด network traffic
  • Security: Grant EXECUTE บน procedure แทน INSERT บน table
  • Maintainability: แก้ logic ที่ DB โดยไม่ต้อง deploy app

ข้อจำกัด

  • Debugging ยากกว่า application code
  • Version control ยาก (อยู่ใน DB)
  • Business logic แยก散在 DB และ App

แนะนำ: ใช้สำหรับ operations ที่ซับซ้อน/ใช้บ่อย/ต้องการ atomicity สำหรับ INSERT เรียบง่าย App-level จัดการเองก็ได้