Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Erro de sintaxe ao usar Delimiters com Aurora Serverless MySQL 5.6


Passei um dia tentando descobrir isso, espero que isso ajude alguém por aí ...

DELIMITER é um recurso do cliente, não do servidor MySQL. O RDS Query Editor é um cliente, mas não suporta a alteração do delimitador, portanto, tentar executar o script que você forneceu não funcionará desde a primeira vez que vir um ponto e vírgula, ele interpretará isso como o final do comando e falhará com um erro de sintaxe.

Então, como você cria algo como um procedimento armazenado que possui várias instruções e ponto e vírgula? Você deve criá-lo como um .sql e envie-o usando a API de dados de uma função do Lambda ou da CLI.

Primeiro, crie seu script em um .sql arquivo sem nenhum DELIMITER comandos ou delimitadores alternativos.

Por exemplo:function.sql
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
   SELECT COUNT(*) INTO param1 FROM t;
END

Em seguida, execute o script usando a CLI assim:
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

Como alternativa, você pode criar uma função Lambda que leia o arquivo e use rds_client.execute_statement() para enviar o script ao servidor por meio da API de dados. Mas, novamente, NÃO use o DELIMITER declaração. O servidor vê o BEGIN e END linhas e age de acordo sem a necessidade de alterar o delimitador.