Vấn đề
MySQL không cho phép biến trực tiếp trong LIMIT ?, ?. Cần dùng Prepared Statement.
Giải pháp: PREPARE + EXECUTE
DELIMITER //
CREATE PROCEDURE Sp_limit(IN beg INT, IN end INT)
BEGIN
PREPARE myStatement FROM
'SELECT * FROM LimitWithStoredProcedure LIMIT ?, ?';
SET @beginning = beg;
SET @ending = end;
EXECUTE myStatement USING @beginning, @ending;
DEALLOCATE PREPARE myStatement;
END //
DELIMITER ;
Gọi thủ tục
mysql> CALL Sp_limit(4, 7);
Kết quả (bỏ 4 dòng đầu, lấy 7 dòng)
+----+--------+ | Id | Name | +----+--------+ | 5 | David | | 6 | Carol | | 7 | James | | 8 | Jace | | 9 | Robert | | 10 | Mike | | 11 | Sam | +----+--------+
Giải thích tham số LIMIT
LIMIT offset, row_countbeg = 4→ offset = 4 (bỏ 4 dòng đầu: Id 1-4)end = 7→ row_count = 7 (lấy 7 dòng: Id 5-11)
Tại sao cần Prepared Statement?
- MySQL không hỗ trợ placeholder trong LIMIT cho biến trực tiếp
- PREPARE tạo statement template với
? - EXECUTE gán giá trị cho
?quaUSING - DEALLOCATE PREPARE giải phóng tài nguyên
MySQL 8.0+ hỗ trợ LIMIT với biến?
Vẫn chưa hỗ trợ trực tiếp. Prepared Statement vẫn là cách chuẩn.