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.