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

Como criar um procedimento armazenado contendo um DELIMITER em PHP com PDO?


Dos comentários:

Não é assim que funciona.

Para entender o porquê, você precisa entender como o mysql CLI -- e qualquer outro programa que possa ler e executar um arquivo de despejo como este -- realmente lida com isso.

DELIMITER não é algo que o servidor entenda.

DELIMITER é usado para informar ao analisador do lado do cliente qual deve ser o delimitador de instrução atual, para que o analisador do lado do cliente possa dividir corretamente as instruções e entregar uma de cada vez ao servidor para execução.

Dos documentos. Observe cuidadosamente que mysql , toda vez que é usado aqui, refere-se ao mysql utilitário do cliente -- não o servidor.

Então, para lidar com esse arquivo, você precisa de um analisador do lado do cliente que faça a mesma coisa mysql faz... e aqui, o código que você está escrevendo é (precisa ser) o analisador de instrução do lado do cliente. Então você é quem precisa escrever a lógica para lidar com o delimitador.

Para fazer o que você quer, você tem que interpretar o DELIMITER instruções, use-as para acompanhar o delimitador de instrução atual, mas não as envie para o servidor.

Então, você tem que ler a entrada uma linha por vez, armazenando em buffer o que você leu, até encontrar o delimitador especificado no final da linha e enviar a instrução resultante para o servidor -- excluindo o delimitador de instrução real do que você envia... então, por exemplo, você não enviaria o final $$ após o corpo do procedimento (a menos que o delimitador da instrução atual seja ; , que você pode enviar ou não enviar -- o servidor não se importa.) Em seguida, esvazie o buffer e comece a ler novamente até ver outra instância de um delimitador (e enviar a instrução para o servidor) ou corresponder a um DELIMITER e defina a variável delimitadora atual do seu código para corresponder a ela para que você identifique corretamente o final da próxima instrução.