Từ nhận xét:
Đó không phải là cách nó hoạt động.
Để hiểu tại sao, bạn cần hiểu cách mysql
CLI - và bất kỳ chương trình nào khác có thể đọc và thực thi một tệp kết xuất như thế này - thực sự xử lý nó.
DELIMITER
không phải là thứ mà máy chủ hiểu được.
DELIMITER
được sử dụng để thông báo cho trình phân tích cú pháp phía máy khách dấu phân cách câu lệnh hiện tại nên là gì, để trình phân tích cú pháp phía máy khách có thể phân chia chính xác các câu lệnh và gửi từng câu lệnh một đến máy chủ để thực thi.
Từ các tài liệu. Lưu ý cẩn thận rằng mysql
, mỗi khi nó được sử dụng ở đây, hãy tham chiếu đến mysql
tiện ích khách hàng - không phải máy chủ.
Vì vậy, để xử lý một tệp như vậy, bạn cần một trình phân tích cú pháp phía máy khách thực hiện điều tương tự mysql
hiện ... và đây, mã bạn đang viết là (cần phải là) trình phân tích cú pháp câu lệnh phía máy khách. Vì vậy, bạn là người cần viết logic để xử lý dấu phân cách.
Để làm những gì bạn muốn, bạn phải diễn giải DELIMITER
, sử dụng chúng để theo dõi dấu phân cách câu lệnh hiện tại, nhưng không gửi chúng đến máy chủ.
Sau đó, bạn phải đọc qua đầu vào từng dòng một, lưu vào bộ đệm những gì bạn đã đọc, cho đến khi bạn tìm thấy dấu phân cách được chỉ định ở cuối dòng và gửi câu lệnh kết quả đến máy chủ - loại trừ dấu phân cách câu lệnh thực tế với những gì bạn gửi ... vì vậy, ví dụ:bạn sẽ không gửi phần cuối là $$
sau phần thân thủ tục (trừ khi dấu phân cách câu lệnh hiện tại là ;
, bạn có thể gửi hoặc không gửi - máy chủ không quan tâm.) Sau đó, làm trống bộ đệm và bắt đầu đọc lại cho đến khi bạn thấy một phiên bản khác của dấu phân cách (và gửi câu lệnh tới máy chủ) hoặc khớp với một DELIMITER
và đặt biến dấu phân tách hiện tại của mã của bạn khớp với nó để bạn xác định chính xác phần cuối của câu lệnh tiếp theo.