Spędziłem dzień próbując to rozgryźć, więc mam nadzieję, że to komuś pomoże...
DELIMITER jest cechą klienta, a nie serwera MySQL. Edytor zapytań RDS jest klientem, ale nie obsługuje zmiany ogranicznika, więc próba uruchomienia podanego skryptu nie zadziała, ponieważ po raz pierwszy zobaczy średnik, zinterpretuje to jako koniec polecenia i zakończy się niepowodzeniem błąd składni.
Jak więc utworzyć coś takiego jak procedura składowana, która zawiera wiele instrukcji i średników? Musisz go utworzyć jako .sql pliku i wyślij go za pomocą Data API z funkcji Lambda lub CLI.
Najpierw utwórz skrypt w pliku .sql plik bez DELIMITER poleceń lub alternatywnych ograniczników.
Na przykład:function.sql
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END
Następnie uruchom skrypt za pomocą CLI w następujący sposób:
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
Alternatywnie możesz utworzyć funkcję Lambda, która odczytuje plik i używa rds_client.execute_statement() aby wysłać skrypt na serwer za pośrednictwem interfejsu Data API. Ale znowu, NIE używaj DELIMITER oświadczenie. Serwer widzi BEGIN i END linie i działają odpowiednio bez konieczności zmiany ogranicznika.