Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Syntaxfehler bei Verwendung von Trennzeichen mit Aurora Serverless MySQL 5.6

Ich habe einen Tag damit verbracht, das herauszufinden, also hoffe ich, dass das jemandem da draußen hilft ...

DELIMITER ist eine Funktion des Clients, nicht des MySQL-Servers. Der RDS-Abfrage-Editor ist ein Client, unterstützt jedoch keine Änderung des Trennzeichens, sodass der Versuch, das von Ihnen bereitgestellte Skript auszuführen, nicht funktioniert, da es das erste Mal, wenn es ein Semikolon sieht, dies als Ende des Befehls interpretiert und fehlschlägt ein Syntaxfehler.

Wie erstellen Sie also so etwas wie eine gespeicherte Prozedur, die mehrere Anweisungen und Semikolons enthält? Sie müssen es als .sql erstellen Datei und senden Sie sie mit der Daten-API von einer Lambda-Funktion oder der CLI.

Erstellen Sie zuerst Ihr Skript in einer .sql Datei ohne DELIMITER Befehle oder alternative Trennzeichen.

Beispiel:function.sql

CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
   SELECT COUNT(*) INTO param1 FROM t;
END

Führen Sie dann das Skript mithilfe der CLI wie folgt aus:

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

Alternativ können Sie eine Lambda-Funktion erstellen, die die Datei liest und rds_client.execute_statement() verwendet um das Skript über die Daten-API an den Server zu senden. Verwenden Sie aber auch hier NICHT das DELIMITER Aussage. Der Server sieht den BEGIN und END Zeilen und verhält sich entsprechend, ohne dass das Trennzeichen geändert werden muss.