Cú pháp tạo stored procedure
DELIMITER //
CREATE PROCEDURE ten_thu_tuc()
BEGIN
-- Khai báo biến (nếu cần)
DECLARE ten_bien KIEU_DU_LIEU;
-- Câu lệnh SQL
Cau_lenh_SQL;
END //
DELIMITER ;
Ví dụ đầy đủ
1. Chọn database và đổi delimiter
mysql> USE test;
Database changed
mysql> DELIMITER //
2. Tạo procedure chọn tất cả từ StoredProcTable
mysql> CREATE PROCEDURE Sp_callTableStoredProcTable()
-> BEGIN
-> SELECT * FROM StoredProcTable;
-> END //
Query OK, 0 rows affected (0.54 sec)
3. Khôi phục delimiter và gọi procedure
mysql> DELIMITER ;
mysql> CALL Sp_callTableStoredProcTable();
+-----------+------+
| FirstName | Age |
+-----------+------+
| John | 23 |
| Bob | 24 |
| David | 20 |
+-----------+------+
3 rows in set (0.03 sec)
Query OK, 0 rows affected (0.06 sec)
4. Tạo procedure đếm bản ghi
mysql> DELIMITER //
mysql> CREATE PROCEDURE CountingRecords()
-> BEGIN
-> SELECT COUNT(*) AS AllRecords FROM StoredProcTable;
-> END //
Query OK, 0 rows affected (0.19 sec)
mysql> DELIMITER ;
5. Gọi procedure đếm
mysql> CALL CountingRecords();
+------------+
| AllRecords |
+------------+
| 3 |
+------------+
1 row in set (0.31 sec)
Query OK, 0 rows affected (0.33 sec)
Các thành phần quan trọng
| Thành phần | Mô tả | Ví dụ |
| DELIMITER // | Đổi dấu kết thúc câu lệnh từ ; sang // | Tránh xung đột ; trong BEGIN...END |
| BEGIN ... END | Khối lệnh thủ tục | Bao bọc nhiều câu lệnh |
| DECLARE | Khai báo biến cục bộ | DECLARE x INT DEFAULT 0; |
| CALL | Gọi thực thi procedure | CALL ten_proc(); |
| DROP PROCEDURE | Xóa procedure | DROP PROCEDURE IF EXISTS ten_proc; |
Procedure có tham số
DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT, OUT user_name VARCHAR(100))
BEGIN
SELECT name INTO user_name FROM users WHERE id = user_id;
END //
DELIMITER ;
Gọi procedure có tham số
mysql> CALL GetUserById(1, @name);
mysql> SELECT @name;
Lưu ý tốt
- Luôn dùng
DROP PROCEDURE IF EXISTS trước khi tạo lại
- Đặt tên procedure theo quy ước:
sp_ prefix hoặc động từ
- Comment rõ ràng logic nghiệp vụ bên trong
- Tránh logic phức tạp trong procedure - chuyển sang application layer