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).

¿Fue útil?

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 el dorepeat() 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top