sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo crear un procedimiento almacenado que contenga un DELIMITADOR en PHP con PDO?

De los comentarios:

No es así como funciona.

Para comprender por qué, debe comprender cómo mysql CLI, y cualquier otro programa que pueda leer y ejecutar un archivo de volcado como este, realmente lo maneja.

DELIMITER no es algo que el servidor entienda.

DELIMITER se usa para decirle al analizador del lado del cliente cuál debería ser el delimitador de declaración actual, para que el analizador del lado del cliente pueda dividir correctamente las declaraciones y entregar una a la vez al servidor para su ejecución.

De los documentos. Note cuidadosamente que mysql , cada vez que se usa aquí, se refiere a mysql utilidad de cliente -- no el servidor.

Entonces, para manejar un archivo de este tipo, necesita un analizador del lado del cliente que haga lo mismo mysql hace... y aquí, el código que estás escribiendo es (debe ser) el analizador de declaraciones del lado del cliente. Así que tú eres el que necesita escribir la lógica para manejar el delimitador.

Para hacer lo que quieres, tienes que interpretar el DELIMITER declaraciones, utilícelas para realizar un seguimiento del delimitador de declaración actual, pero no las envíe al servidor.

Luego, debe leer la entrada una línea a la vez, almacenando en búfer lo que ha leído, hasta que encuentre el delimitador especificado al final de la línea y envíe la declaración resultante al servidor -- excluyendo el delimitador de declaración real de lo que envía... así que, por ejemplo, no enviaría el final $$ después del cuerpo del procedimiento (a menos que el delimitador de declaración actual sea ; , que puede enviar o no enviar; al servidor no le importa). Luego, vacíe el búfer y comience a leer nuevamente hasta que vea otra instancia de un delimitador (y envíe la declaración al servidor) o haga coincidir un DELIMITER y configure la variable delimitadora actual de su código para que coincida con ella, de modo que identifique correctamente el final de la siguiente declaración.