Stored Procedure cho phép đóng gói logic INSERT phức tạp, tái sử dụng, và cấp quyền thực thi mà không cần cấp quyền INSERT trực tiếp trên bảng.
Cú pháp tạo procedure
DELIMITER //
CREATE PROCEDURE tên_procedure(IN tham_số1 KIỂU, IN tham_số2 KIỂU, ...)
BEGIN
INSERT INTO tên_bảng (cột1, cột2, ...) VALUES (tham_số1, tham_số2, ...);
END //
DELIMITER ;
Ví dụ minh họa
Tạo bảng:
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)
Tạo procedure (trong phpMyAdmin: tab Routines → Add Routine, hoặc chạy SQL):
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 ;
Gọi procedure:
mysql> CALL procedure_InsertIntoTable('Larry', 23);
Query OK, 1 row affected, 1 warning (0.19 sec)
Kiểm tra kết quả:
mysql> SELECT * FROM StoredProcedureInsertDemo;
+--------+----------+---------+ | UserId | UserName | UserAge | +--------+----------+---------+ | 1 | Larry | 23 | +--------+----------+---------+
Trong phpMyAdmin
- Chọn database → Tab Routines → Add routine
- Điền: Name:
procedure_InsertIntoTable, Type:PROCEDURE - Parameters: Thêm
FirstName VARCHAR(100) IN,Age INT IN - Definition (Body):
INSERT INTO StoredProcedureInsertDemo(UserName, UserAge) VALUES (FirstName, Age);
- Bấm Go
Mở rộng: Procedure với validation, transaction, trả về ID
DELIMITER //
CREATE PROCEDURE sp_InsertUser(
IN p_name VARCHAR(100),
IN p_email VARCHAR(100),
IN p_age INT,
OUT p_new_id INT
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
INSERT INTO users(name, email, age) VALUES (p_name, p_email, p_age);
SET p_new_id = LAST_INSERT_ID();
COMMIT;
END //
DELIMITER ;
Gọi với OUT parameter:
CALL sp_InsertUser('John', 'john@example.com', 25, @new_id);
SELECT @new_id;
Ưu điểm Stored Procedure
- Tái sử dụng logic, giảm code trùng lặp
- Bảo mật: Cấp EXECUTE trên procedure, không cấp INSERT trên bảng
- Hiệu năng: Execution plan cache, giảm network round-trip
- Transaction atomicity
- Logic nghiệp vụ tập trung tại DB