Tôi đã dành một ngày để tìm ra điều này vì vậy hy vọng điều này sẽ giúp ích cho ai đó ngoài kia ...
DELIMITER là một tính năng của máy khách, không phải máy chủ MySQL. Trình soạn thảo truy vấn RDS là một ứng dụng khách nhưng nó không hỗ trợ thay đổi dấu phân cách vì vậy việc cố gắng chạy tập lệnh bạn đã cung cấp sẽ không hoạt động vì lần đầu tiên nó nhìn thấy dấu chấm phẩy, nó sẽ hiểu rằng đó là phần cuối của lệnh và không thành công với lỗi cú pháp.
Vì vậy, làm thế nào để bạn tạo một cái gì đó giống như một thủ tục được lưu trữ có nhiều câu lệnh và dấu chấm phẩy trong đó? Bạn phải tạo nó dưới dạng .sql và gửi nó bằng API dữ liệu từ một hàm Lambda hoặc CLI.
Đầu tiên, tạo tập lệnh của bạn trong .sql tệp không có DELIMITER nào lệnh hoặc dấu phân cách thay thế.
Ví dụ:function.sql
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END
Sau đó, chạy tập lệnh bằng CLI như sau:
cat function.sql | xargs -0 aws rds-data execute-statement \
--resource-arn arn:aws:rds:eu-west-1:xxx:cluster:cluster-name \
--secret-arn arn:aws:secretsmanager:eu-west-1:xxx:secret:secret-name-xxx \
--database "database_name" \
--sql
Ngoài ra, bạn có thể tạo một hàm Lambda đọc tệp và sử dụng rds_client.execute_statement() để gửi tập lệnh tới máy chủ thông qua API dữ liệu. Nhưng một lần nữa, KHÔNG sử dụng DELIMITER bản tường trình. Máy chủ thấy BEGIN và END dòng và hoạt động tương ứng mà không cần thay đổi dấu phân cách.