¿Por qué SQLYOG cambia delimitador cuando crea el procedimiento almacenado MySQL?
-
27-10-2019 - |
Pregunta
Cuando hago un procedimiento almacenado con Sqlyog, me da esta plantilla:
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `apachelogs`.`test`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
END$$
DELIMITER ;
Me pregunto por qué cambia delimitador antes de crear un procedimiento almacenado. Y por qué todavía puedo usar ;
delimitador dentro de create
Declaración (supongo que puede debido al alcance).
Solución
Que cambia el delimitador de la declaración a $$
Para evitar que MySQL intente interpretar cualquier semicolones dentro del procedimiento almacenado como delimitador. Sin el DELIMITER $$
, no podrías definir un procedimiento almacenado que contenía ;
para delimitar las declaraciones dentro de él. Puede pensar en ello como una forma de escapar globalmente de la sémica durante la definición del procedimiento.
Desde el buen manual:
Para redefinir el mysql delimitador, usa el
delimiter
dominio. El siguiente ejemplo muestra cómo hacer esto para eldorepeat()
procedimiento que se acaba de mostrar. El delimitador se cambia a//
para habilitar la definición completa que se pase al servidor como una sola declaración, y luego se restaura a;
antes de invocar el procedimiento. Esto permite el;
delimitador utilizado en el cuerpo del procedimiento para pasar al servidor en lugar de ser interpretado por mysql sí mismo.
No sé si mi explicación es más clara que la del manual, pero tal vez uno de ellos (o ambos combinados) resultará en cierta comprensión.