Delimitadores en MySQL

Resuelto System.Data asked hace 12 años • 5 respuestas

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?

System.Data avatar Apr 21 '12 20:04 System.Data
Aceptado

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 mysqlcliente, 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 DELIMITERpalabra clave es una función del mysqlcliente 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 DELIMITERcon 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.

Michael Berkowski avatar Apr 21 '2012 13:04 Michael Berkowski

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.

Pradeep Singh avatar Feb 02 '2015 09:02 Pradeep Singh

Cuando crea una rutina almacenada que tiene un BEGIN...ENDbloque, las declaraciones dentro del bloque terminan con punto y coma (;). Pero la CREATE PROCEDUREdeclaración también necesita un terminador. Por lo tanto, resulta ambiguo si el punto y coma dentro del cuerpo de la rutina termina CREATE PROCEDUREo 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 PROCEDUREdeclaración.

Rizwan Ahmed avatar Aug 16 '2017 23:08 Rizwan Ahmed

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 ;
Optimizer avatar Dec 06 '2017 14:12 Optimizer