Phần 1
Các dấu phân cách được sử dụng cho các đối tượng nguồn như thủ tục / chức năng được lưu trữ, trình kích hoạt hoặc sự kiện. Tất cả các đối tượng này có thể có nội dung - mã trong mệnh đề BEGIN ... END.
Tất cả các câu lệnh trong tập lệnh MySQL phải được kết thúc bằng dấu phân cách, mặc định là ';'. Nhưng phải làm gì nếu đối tượng nguồn có nội dung với một số câu lệnh, e, g:
INSERT INTO table1 VALUES(1);
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END;
INSERT INTO table1 VALUES(2);
Có bao nhiêu tiểu bang? 3 hoặc 8? Câu trả lời là ba, bởi vì script có hai câu lệnh INSERT và một câu lệnh CREATE PROCEDURE. Như bạn thấy, TẠO THỦ TỤC cũng có một số câu lệnh nội bộ; chúng ta nên nói với máy khách MySQL rằng tất cả các câu lệnh này (bên trong BEGIN ... END) - là một phần của MỘT câu lệnh; chúng ta có thể làm điều đó với sự trợ giúp của các dấu phân cách:
INSERT INTO table1 VALUES(1);
DELIMITER $$
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END$$
DELIMITER ;
INSERT INTO table1 VALUES(2);
Lưu ý, khi trình kích hoạt của bạn không có mệnh đề BEGIN ... END, các dấu phân cách có thể bị bỏ qua.
Phần 2
Không có dấu phân cách, câu lệnh sẽ được phân tích cú pháp thành -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
thay vì -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END