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.