sql >> Database >  >> RDS >> Mysql

Syntaxisfout bij gebruik van scheidingstekens met Aurora Serverless MySQL 5.6

Ik heb een dag besteed om dit uit te zoeken, dus hopelijk helpt dit iemand daar...

DELIMITER is een functie van de client, niet de MySQL-server. De RDS-queryeditor is een client, maar ondersteunt het wijzigen van het scheidingsteken niet, dus een poging om het script dat u hebt opgegeven uit te voeren, zal niet werken, aangezien de eerste keer dat het een puntkomma ziet, dit wordt geïnterpreteerd als het einde van de opdracht en mislukt met een syntaxisfout.

Dus, hoe creëer je zoiets als een opgeslagen procedure die meerdere instructies en puntkomma's bevat? Je moet het maken als een .sql bestand en verzend het met behulp van de Data API vanuit een Lambda-functie of de CLI.

Maak eerst uw script in een .sql bestand zonder DELIMITER commando's of alternatieve scheidingstekens.

Bijvoorbeeld:function.sql

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

Voer het script vervolgens als volgt uit met behulp van de CLI:

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

U kunt ook een Lambda-functie maken die het bestand leest en gebruikmaakt van rds_client.execute_statement() om het script via de Data API naar de server te sturen. Maar nogmaals, gebruik NIET de DELIMITER uitspraak. De server ziet de BEGIN en END lijnen en handelt dienovereenkomstig zonder de noodzaak om het scheidingsteken te wijzigen.



  1. SQL Server Collection Inventory Script -2

  2. NLSSORT() Functie in Oracle

  3. Java - Hoe de kolomnaam op de resultatenset te krijgen

  4. Is het mogelijk om naar kolomnamen te verwijzen via bindvariabelen in Oracle?