Giới thiệu
Để thực thi câu lệnh SQL được xây dựng động (dưới dạng chuỗi) bên trong Stored Procedure, MySQL cung cấp cơ chế PREPARE, EXECUTE, DEALLOCATE PREPARE.
Ví dụ minh họa
Bước 1: Tạo bảng và chèn dữ liệu
CREATE TABLE DemoTable2033 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(20)
);
INSERT INTO DemoTable2033 (Name) VALUES ('Chris'), ('Bob'), ('David'), ('Mike');
Bước 2: Tạo procedure dùng Dynamic SQL
DELIMITER //
CREATE PROCEDURE dynamic_query()
BEGIN
SET @query = CONCAT('SELECT * FROM DemoTable2033 WHERE Id = 3');
PREPARE st FROM @query;
EXECUTE st;
DEALLOCATE PREPARE st;
END //
DELIMITER ;
Bước 3: Gọi procedure
CALL dynamic_query();
Kết quả:
+----+-------+
| Id | Name |
+----+-------+
| 3 | David |
+----+-------+
Lưu ý: Luôn gọi DEALLOCATE PREPARE để giải phóng tài nguyên. Dynamic SQL trong procedure hữu ích khi tên bảng, cột, điều kiện WHERE được xác định tại runtime. Cần cảnh giác SQL Injection nếu chuỗi query chứa đầu vào người dùng chưa được kiểm tra.