แนวคิด
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
- แท็บ Routines → Add routine
- ประเภท: PROCEDURE
- ชื่อ:
procedure_InsertIntoTable - Parameters: เพิ่ม IN parameters (FirstName VARCHAR(100), Age INT)
- Definition: ใส่ body ระหว่าง BEGIN ... END
- กด 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 จัดการเองก็ได้