sintaxis - como se crea un disparador en mysql
Delimitadores en MySQL (5)
A menudo veo que las personas usan Delimiters. Intenté descubrir qué son delimitadores y cuál es su propósito. Después de 20 minutos de googlear, no pude encontrar una respuesta que me satisfaga. Entonces, mi pregunta es ahora: ¿Qué son los delimitadores y cuándo debo usarlos?
Cuando crea una rutina almacenada que tiene un bloque BEGIN...END
, las sentencias dentro del bloque terminan con punto (;)
coma (;)
. Pero la instrucción CREATE PROCEDURE
también necesita un terminador. Por lo tanto, resulta ambiguo si el punto y coma dentro del cuerpo de la rutina finaliza CREATE PROCEDURE
o termina una de las instrucciones dentro del cuerpo del procedimiento.
La forma de resolver la ambigüedad es declarar una cadena distinta (que no debe ocurrir dentro del cuerpo del procedimiento) que el cliente MySQL reconoce como el verdadero terminador para la instrucción CREATE PROCEDURE
.
El delimitador es el carácter o cadena de caracteres que usará para decirle al cliente de MySQL que ha terminado de escribir en una instrucción Sql.
La instrucción DELIMITER cambia el delimitador estándar que es punto y coma (;) a otro. El delimitador se cambia del punto y coma (;) a barras dobles //.
¿Por qué tenemos que cambiar el delimitador?
Porque queremos pasar el procedimiento almacenado, las funciones personalizadas, etc. al servidor como un todo, en lugar de dejar que la herramienta mysql interprete cada enunciado a la vez.
Usted define un DELIMITER para decirle al cliente mysql que trate las declaraciones, funciones, procedimientos almacenados o activadores como una declaración completa. Normalmente en un archivo .sql configura un DELIMITER diferente como $$. El comando DELIMITER se utiliza para cambiar el delimitador estándar de los comandos de MySQL (es decir;). Como las declaraciones dentro de las rutinas (funciones, procedimientos almacenados o desencadenantes) finalizan con un punto y coma (;), para tratarlas como una declaración compuesta utilizamos DELIMITER. Si no se define al usar diferentes rutinas en el mismo archivo o línea de comando, dará error de sintaxis.
Tenga en cuenta que puede usar una variedad de caracteres no reservados para crear su propio delimitador personalizado. Debe evitar el uso del carácter de barra diagonal inversa (/) porque ese es el carácter de escape de MySQL.
DELIMITER no es realmente un comando de lenguaje MySQL, es un comando de cliente.
Ejemplo
DELIMITER $$
/*This is treated as a single statement as it ends with $$ */
DROP PROCEDURE IF EXISTS `get_count_for_department`$$
/*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/
CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT)
BEGIN
SELECT COUNT(*) INTO the_count FROM employees where department=the_department;
END$$
/*DELIMITER is set to it''s default*/
DELIMITER ;
Delimitadores distintos al predeterminado ;
se suelen utilizar al definir funciones, procedimientos almacenados y desencadenadores en los que debe definir múltiples instrucciones. Define un delimitador diferente como $$
que se utiliza para definir el final de todo el procedimiento, pero dentro de él, las declaraciones individuales son terminadas por ;
. De esta forma, cuando el código se ejecuta en el cliente mysql
, el cliente puede decir dónde termina todo el procedimiento y ejecutarlo como una unidad en lugar de ejecutar las instrucciones individuales dentro.
Tenga en cuenta que la palabra clave DELIMITER
es una función del cliente de línea de comando mysql
(y algunos otros clientes) solamente y no una característica regular del lenguaje MySQL. No funcionará si intentas pasarlo a través de una API de lenguaje de programación a MySQL. Algunos otros clientes como PHPMyAdmin tienen otros métodos para especificar un delimitador no predeterminado.
Ejemplo:
DELIMITER $$
/* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */
DROP PROCEDURE my_procedure$$
/* Now start the procedure code */
CREATE PROCEDURE my_procedure ()
BEGIN
/* Inside the procedure, individual statements terminate with ; */
CREATE TABLE tablea (
col1 INT,
col2 INT
);
INSERT INTO tablea
SELECT * FROM table1;
CREATE TABLE tableb (
col1 INT,
col2 INT
);
INSERT INTO tableb
SELECT * FROM table2;
/* whole procedure ends with the custom delimiter */
END$$
/* Finally, reset the delimiter to the default ; */
DELIMITER ;
Intentar utilizar DELIMITER
con un cliente que no lo admite provocará que se envíe al servidor, que informará un error de sintaxis. Por ejemplo, usando PHP y MySQLi:
$mysqli = new mysqli(''localhost'', ''user'', ''pass'', ''test'');
$result = $mysqli->query(''DELIMITER $$'');
echo $mysqli->error;
Errores con:
Usted tiene un error en su sintaxis SQL; verifique el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ''DELIMITER $$'' en la línea 1