Jeg brugte en dag på at finde ud af det, så forhåbentlig hjælper det nogen derude...
DELIMITER
er en funktion af klienten, ikke MySQL-serveren. RDS Query Editor er en klient, men den understøtter ikke ændring af afgrænsningstegnet, så forsøg på at køre det script, du har angivet, vil ikke fungere, da det første gang, det ser et semikolon, vil fortolke det som slutningen af kommandoen og mislykkes med en syntaksfejl.
Så hvordan opretter du noget som en lagret procedure, der har flere sætninger og semikoloner i sig? Du skal oprette den som en .sql
fil og send den ved hjælp af Data API fra enten en Lambda-funktion eller CLI.
Først skal du oprette dit script i en .sql
fil uden nogen DELIMITER
kommandoer eller alternative afgrænsninger.
For eksempel:function.sql
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END
Kør derefter scriptet ved hjælp af CLI som denne:
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 oprette en Lambda-funktion, der læser filen og bruger rds_client.execute_statement()
at sende scriptet til serveren via Data API. Men igen, brug IKKE DELIMITER
udmelding. Serveren ser BEGIN
og END
linjer og handler derefter uden at skulle ændre afgrænsningen.