Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lỗi cú pháp khi sử dụng Dấu phân cách với Aurora Serverless MySQL 5.6

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 BEGINEND dòng và hoạt động tương ứng mà không cần thay đổi dấu phân cách.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khi nào sử dụng STRAIGHT_JOIN với MySQL

  2. SELECT LAST_INSERT_ID () hoạt động trong Truy vấn MySQL Trực tiếp nhưng không liên tục PHP QUERY

  3. không thể lưu dữ liệu từ 1 bảng sang bảng khác

  4. Xếp hạng dày đặc của MySQL cho mỗi nhóm / phân vùng

  5. nhóm bằng cách thêm các giá trị