Mysql
 sql >> Database >  >> RDS >> Mysql

Errore di sintassi quando si utilizzano i delimitatori con Aurora Serverless MySQL 5.6

Ho passato un giorno cercando di capirlo, quindi spero che questo aiuti qualcuno là fuori...

DELIMITER è una caratteristica del client, non del server MySQL. L'editor di query RDS è un client ma non supporta la modifica del delimitatore, quindi il tentativo di eseguire lo script fornito non funzionerà poiché la prima volta che vede un punto e virgola lo interpreterà come la fine del comando e fallirà con un errore di sintassi.

Quindi, come si crea qualcosa come una stored procedure che contiene più istruzioni e punti e virgola? Devi crearlo come .sql file e invialo utilizzando l'API dei dati da una funzione Lambda o dalla CLI.

Innanzitutto, crea il tuo script in un .sql file senza alcun DELIMITER comandi o delimitatori alternativi.

Ad esempio:function.sql

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

Quindi, esegui lo script utilizzando la CLI in questo modo:

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

In alternativa, puoi creare una funzione Lambda che legga il file e utilizzi rds_client.execute_statement() per inviare lo script al server tramite la Data API. Ma ancora una volta, NON utilizzare il DELIMITER dichiarazione. Il server vede il BEGIN e END linee e agisce di conseguenza senza la necessità di modificare il delimitatore.