web-dev-qa-db-fra.com

Délimiteurs dans MySQL

Je vois souvent des gens utiliser des délimiteurs. J'ai moi-même essayé de savoir ce que sont les délimiteurs et quel est leur but. Après 20 minutes de recherches sur Google, je n’étais pas en mesure de trouver une réponse qui me satisfasse. Ma question est donc la suivante: que sont les délimiteurs et quand devrais-je les utiliser?

132
System.Data

Les délimiteurs autres que le ; par défaut sont généralement utilisés lors de la définition de fonctions, de procédures stockées et de déclencheurs dans lesquels vous devez définir plusieurs instructions. Vous définissez un délimiteur différent, tel que $$, utilisé pour définir la fin de la procédure entière, mais à l'intérieur de celui-ci, les instructions individuelles sont terminées par ;. Ainsi, lorsque le code est exécuté dans le client mysql, celui-ci peut indiquer où se termine la procédure entière et l'exécuter en tant qu'unité plutôt que d'exécuter les instructions individuelles qu'il contient.

Notez que le mot clé DELIMITER est uniquement une fonction de la ligne de commande mysql client (et de certains autres clients) et non d'une fonctionnalité standard du langage MySQL. Cela ne fonctionnera pas si vous essayez de le transmettre à MySQL via une API de langage de programmation. D'autres clients, comme PHPMyAdmin, utilisent d'autres méthodes pour spécifier un délimiteur autre que celui par défaut.

Exemple:

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 ;

Si vous tentez d'utiliser DELIMITER avec un client qui ne le prend pas en charge, il sera envoyé au serveur, ce qui générera une erreur de syntaxe. Par exemple, en utilisant PHP et MySQLi:

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

Erreurs avec:

Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser près de 'DELIMITER $$' à la ligne 1.

203
Michael Berkowski

L'instruction DELIMITER modifie le délimiteur standard, qui est un point-virgule (;), en un autre. Le délimiteur est remplacé par le point-virgule (;) par une double barre oblique //.

Pourquoi devons-nous changer le délimiteur?

Parce que nous voulons transmettre la procédure stockée, les fonctions personnalisées, etc. au serveur dans son ensemble plutôt que de laisser l'outil mysql interpréter chaque instruction à la fois.

18
Pradeep Singh

Lorsque vous créez une routine stockée comportant un bloc BEGIN...END, les instructions de ce bloc sont terminées par un point-virgule (;). Mais l'instruction CREATE PROCEDURE nécessite également un terminateur. Ainsi, il devient ambigu de savoir si le point-virgule dans le corps de la routine se termine CREATE PROCEDURE, ou termine l'une des instructions dans le corps de la procédure.

La façon de résoudre cette ambiguïté consiste à déclarer une chaîne distincte (qui ne doit pas figurer dans le corps de la procédure) que le client MySQL reconnaît comme étant le véritable terminateur de l'instruction CREATE PROCEDURE.

8
Rizwan Ahmed

Vous définissez un DELIMITER pour indiquer au client mysql de traiter les instructions, les fonctions, les procédures stockées ou les déclencheurs comme une instruction complète. Normalement, dans un fichier .sql, vous définissez un DELIMITER différent, comme $$. La commande DELIMITER permet de modifier le délimiteur standard des commandes MySQL (c'est-à-dire;). Comme les instructions des routines (fonctions, procédures stockées ou déclencheurs) se terminent par un point-virgule (;), pour les traiter en tant qu'instruction composée, nous utilisons DELIMITER. S'il n'est pas défini lors de l'utilisation de routines différentes dans le même fichier ou la même ligne de commande, une erreur de syntaxe sera générée.

Notez que vous pouvez utiliser une variété de caractères non réservés pour créer votre propre délimiteur personnalisé. Vous devez éviter l'utilisation du caractère barre oblique inversée (\), car il s'agit du caractère d'échappement pour MySQL.

DELIMITER n'est pas vraiment une commande du langage MySQL, c'est une commande client.

Exemple

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 ;
3
Optimizer

Le délimiteur est le caractère ou la chaîne de caractères que vous utiliserez pour indiquer au client MySQL que vous avez fini de taper une instruction Sql.

2