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

Syntaksfejl ved brug af afgrænsere med Aurora Serverless MySQL 5.6

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.



  1. Hvad er forskellen mellem et Oracle- og et Microsoft-skema?

  2. Kan JavaScript forbindes med MySQL?

  3. genbruge resultatet af et udvalgt udtryk i GROUP BY-sætningen?

  4. Hvordan kan jeg bekræfte, at en database er Oracle, og hvilken version bruger den SQL?