Delimitadores no MySQL

Muitas vezes vejo pessoas usando Delimitadores. Eu tentei descobrir quais são os delimitadores e qual é o propósito deles. Após 20 minutos de googling, não consegui encontrar uma resposta que me satisfizesse. Então, minha pergunta agora é: o que são delimitadores e quando devo usá-los?

Delimitadores além do padrão ; são normalmente usados ​​ao definir funções, stored procedures e gatilhos em que você deve definir várias instruções. Você define um delimitador diferente, como $$ que é usado para definir o final de todo o procedimento, mas dentro dele, cada instrução individual é terminada por ; . Dessa forma, quando o código é executado no cliente mysql , o cliente pode dizer onde o procedimento inteiro termina e executá-lo como uma unidade, em vez de executar as instruções individuais internas.

Observe que a palavra-chave DELIMITER é uma function da linha de comando cliente mysql (e alguns outros clientes) apenas e não é um recurso de linguagem regular do MySQL. Não funcionará se você tentar passá-lo por meio de uma API de linguagem de programação para o MySQL. Alguns outros clientes, como o PHPMyAdmin, possuem outros methods para especificar um delimitador não padrão.

Exemplo:

 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 ; 

A tentativa de usar o DELIMITER com um cliente que não suporta isso fará com que ele seja enviado ao servidor, que relatará um erro de syntax. Por exemplo, usando PHP e MySQLi:

 $mysqli = new mysqli('localhost', 'user', 'pass', 'test'); $result = $mysqli->query('DELIMITER $$'); echo $mysqli->error; 

Erros com:

Você tem um erro na sua syntax SQL; verifique o manual que corresponde à sua versão do servidor MySQL para a syntax correta para usar perto de ‘DELIMITER $$’ na linha 1

A instrução DELIMITER altera o delimitador padrão, que é ponto e vírgula (;) para outro. O delimitador é alterado do ponto-e-vírgula (;) para barras duplas //.

Por que precisamos mudar o delimitador?

Porque queremos passar o procedimento armazenado, funções personalizadas, etc. para o servidor como um todo, em vez de permitir que a ferramenta mysql interprete cada instrução por vez.

Quando você cria uma rotina armazenada que tem um bloco BEGIN...END , instruções dentro do bloco são finalizadas por ponto e vírgula (;) . Mas a instrução CREATE PROCEDURE também precisa de um terminador. Portanto, torna-se ambíguo se o ponto-e-vírgula dentro do corpo da rotina termina em CREATE PROCEDURE ou encerra uma das instruções dentro do corpo do procedimento.

A maneira de resolver a ambiguidade é declarar uma cadeia distinta (que não deve ocorrer dentro do corpo do procedimento) que o cliente MySQL reconheça como o terminador verdadeiro para a instrução CREATE PROCEDURE .

Você define um DELIMITER para dizer ao cliente mysql para tratar as declarações, funções, stored procedures ou gatilhos como uma instrução inteira. Normalmente, em um arquivo .sql, você define um DELIMITER diferente como $$. O comando DELIMITER é usado para alterar o delimitador padrão dos comandos do MySQL (ie;). Como as instruções dentro das rotinas (funções, stored procedures ou gatilhos) terminam com um ponto e vírgula (;), para tratá-las como uma declaração composta, usamos DELIMITER. Se não definido ao usar rotinas diferentes no mesmo arquivo ou linha de comando, ocorrerá um erro de syntax.

Observe que você pode usar vários caracteres não reservados para criar seu próprio delimitador personalizado. Você deve evitar o uso do caractere barra invertida (\) porque esse é o caractere de escape para o MySQL.

DELIMITER não é realmente um comando de linguagem do MySQL, é um comando do cliente.

Exemplo

 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 ; 

O delimitador é o caractere ou cadeia de caracteres que você usará para informar ao cliente MySQL que você terminou de digitar em uma instrução Sql.