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.