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.