Nguyên nhân và giải pháp
Lỗi cú pháp SQL này thường xảy ra khi làm việc với stored procedure, trigger hoặc function trong MySQL. Nguyên nhân chính là do dấu phân cách câu lệnh mặc định là dấu chấm phẩy (;) xung đột với các câu lệnh bên trong thủ tục lưu trữ.
Giải pháp: Thay đổi Delimiter
Bạn cần thay đổi delimiter từ ; sang // (hoặc ký tự khác không xung đột) trước khi tạo thủ tục, sau đó đổi lại.
Cú pháp cơ bản
DELIMITER //
CREATE PROCEDURE ten_thu_tuc()
BEGIN
Cau_lenh_1;
-- ...
Cau_lenh_N;
END;
//
DELIMITER ;
Ví dụ minh họa
Tạo stored procedure lấy tất cả bản ghi từ bảng employeetable:
mysql> DELIMITER // mysql> CREATE PROCEDURE sp_getAllRecords() -> BEGIN -> SELECT * FROM employeetable; -> END; -> // Query OK, 0 rows affected (0.23 sec) mysql> DELIMITER ;
Gọi thủ tục lưu trữ
Sử dụng lệnh CALL:
CALL ten_thu_tuc();
Ví dụ gọi procedure vừa tạo:
mysql> CALL sp_getAllRecords();
Kết quả đầu ra
+------------+--------------+----------------+ | EmployeeId | EmployeeName | EmployeeSalary | +------------+--------------+----------------+ | 2 | Bob | 1000 | | 3 | Carol | 2500 | +------------+--------------+----------------+ 2 rows in set (0.00 sec) Query OK, 0 rows affected (0.02 sec)
Lưu ý quan trọng
- Luôn khôi phục delimiter về
;sau khi tạo xong thủ tục - Khi gọi procedure, MySQL tự hiểu delimiter là
;nên không cần thay đổi - Áp dụng tương tự cho
TRIGGERvàFUNCTION