Mysql
 sql >> Base de données >  >> RDS >> Mysql

Erreur de syntaxe lors de l'utilisation de délimiteurs avec Aurora Serverless MySQL 5.6

J'ai passé une journée à essayer de comprendre cela, alors j'espère que cela aidera quelqu'un là-bas...

DELIMITER est une fonctionnalité du client, pas du serveur MySQL. L'éditeur de requête RDS est un client mais il ne prend pas en charge la modification du délimiteur, donc tenter d'exécuter le script que vous avez fourni ne fonctionnera pas car la première fois qu'il verra un point-virgule, il l'interprétera comme la fin de la commande et échouera avec une erreur de syntaxe.

Alors, comment créez-vous quelque chose comme une procédure stockée qui contient plusieurs instructions et points-virgules ? Vous devez le créer en tant que .sql fichier et envoyez-le à l'aide de l'API de données à partir d'une fonction Lambda ou de l'interface de ligne de commande.

Commencez par créer votre script dans un .sql fichier sans aucun DELIMITER commandes ou délimiteurs alternatifs.

Par exemple :function.sql

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

Ensuite, exécutez le script à l'aide de la CLI comme ceci :

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

Vous pouvez également créer une fonction Lambda qui lit le fichier et utilise rds_client.execute_statement() pour envoyer le script au serveur via l'API de données. Mais encore une fois, n'utilisez PAS le DELIMITER déclaration. Le serveur voit le BEGIN et END lignes et agit en conséquence sans qu'il soit nécessaire de modifier le délimiteur.