Delimitadores en MySQL
A menudo veo que la gente usa delimitadores. Intenté descubrir qué son los delimitadores y cuál es su propósito. Después de 20 minutos de buscar en Google, no pude encontrar una respuesta que me satisficiera. Entonces mi pregunta ahora es: ¿Qué son los delimitadores y cuándo debo usarlos?
Los delimitadores distintos del predeterminado ;
se utilizan normalmente al definir funciones, procedimientos almacenados y activadores en los que se deben definir varias declaraciones. Usted define un delimitador diferente como $$
el que se usa para definir el final de todo el procedimiento, pero dentro de él, cada declaración individual termina en ;
. De esa manera, cuando el código se ejecuta en el mysql
cliente, el cliente puede saber dónde termina todo el procedimiento y ejecutarlo como una unidad en lugar de ejecutar las declaraciones individuales que contiene.
Tenga en cuenta que la DELIMITER
palabra clave es una función del mysql
cliente de línea de comandos (y algunos otros clientes) únicamente y no una característica normal del lenguaje MySQL. No funcionará si intenta 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 usarlo DELIMITER
con un cliente que no lo admite hará que se envíe al servidor, lo 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:
Tienes un error en tu sintaxis SQL; Consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta que debe usar cerca de 'DELIMITER $$' en la línea 1.
La instrucción DELIMITER cambia el delimitador estándar que es punto y coma (;) por otro. El delimitador se cambia de punto y coma (;) a barras dobles //.
¿Por qué tenemos que cambiar el delimitador?
Porque queremos pasar el procedimiento almacenado, funciones personalizadas, etc. al servidor como un todo en lugar de permitir que la herramienta MySQL interprete cada declaración a la vez.
Cuando crea una rutina almacenada que tiene un BEGIN...END
bloque, las declaraciones dentro del bloque terminan con punto y coma (;)
. Pero la CREATE PROCEDURE
declaración también necesita un terminador. Por lo tanto, resulta ambiguo si el punto y coma dentro del cuerpo de la rutina termina CREATE PROCEDURE
o termina una de las declaraciones dentro del cuerpo del procedimiento.
La forma de resolver la ambigüedad es declarar una cadena distinta (que no debe aparecer dentro del cuerpo del procedimiento) que el cliente MySQL reconozca como el verdadero terminador de la CREATE PROCEDURE
declaración.
Usted define un DELIMITER para indicarle al cliente MySQL que trate las declaraciones, funciones, procedimientos almacenados o activadores como una declaración completa. Normalmente en un archivo .sql configuras un DELIMITER diferente como $$. El comando DELIMITER se utiliza para cambiar el delimitador estándar de los comandos MySQL (es decir;). Como las declaraciones dentro de las rutinas (funciones, procedimientos almacenados o disparadores) terminan con punto y coma (;), para tratarlas como una declaración compuesta usamos DELIMITER. Si no se define al usar diferentes rutinas en el mismo archivo o línea de comando, se producirá un error de sintaxis.
Tenga en cuenta que puede utilizar una variedad de caracteres no reservados para crear su propio delimitador personalizado. Debe evitar el uso del carácter de barra invertida (\) porque es el carácter de escape de MySQL.
DELIMITER no es realmente un comando del lenguaje MySQL, es un comando del 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 ;