Jag tillbringade en dag med att försöka komma på det här så förhoppningsvis hjälper det någon där ute...
DELIMITER
är en funktion hos klienten, inte MySQL-servern. RDS Query Editor är en klient men den stöder inte att ändra avgränsaren så att försöka köra skriptet du har tillhandahållit kommer inte att fungera eftersom första gången den ser ett semikolon kommer det att tolka det som slutet på kommandot och misslyckas med ett syntaxfel.
Så, hur skapar du något som en lagrad procedur som har flera uttalanden och semikolon i sig? Du måste skapa den som en .sql
fil och skicka den med Data API från antingen en Lambda-funktion eller CLI.
Skapa först ditt skript i en .sql
fil utan någon DELIMITER
kommandon eller alternativa avgränsare.
Till exempel:function.sql
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END
Kör sedan skriptet med CLI så här:
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
Alternativt kan du skapa en Lambda-funktion som läser filen och använder rds_client.execute_statement()
för att skicka skriptet till servern via Data API. Men återigen, använd INTE DELIMITER
påstående. Servern ser BEGIN
och END
linjer och agerar därefter utan att behöva ändra avgränsaren.