Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :Comment utiliser les délimiteurs dans les déclencheurs ?

Partie 1

Les délimiteurs sont utilisés pour les objets source tels que la procédure/fonction stockée, le déclencheur ou l'événement. Tous ces objets peuvent avoir un corps - code dans la clause BEGIN...END.

Toutes les instructions dans les scripts MySQL doivent se terminer par un délimiteur, la valeur par défaut est ';'. Mais que faire si l'objet source a un corps avec certaines déclarations, par exemple :

INSERT INTO table1 VALUES(1);

CREATE PROCEDURE procedure1()
BEGIN
  SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
  PREPARE stmt2 FROM @s;
  SET @a = 6;
  SET @b = 8;
  EXECUTE stmt2 USING @a, @b;
END;

INSERT INTO table1 VALUES(2);

Combien de déclarants ? 3 ou 8 ? La réponse est trois, car le script a deux instructions INSERT et une instruction CREATE PROCEDURE. Comme vous le voyez, CREATE PROCEDURE contient également des instructions internes ; nous devrions dire au client MySQL que toutes ces instructions (à l'intérieur de BEGIN...END) - font partie d'UNE instruction ; nous pouvons le faire à l'aide de délimiteurs :

INSERT INTO table1 VALUES(1);

DELIMITER $$

CREATE PROCEDURE procedure1()
BEGIN
  SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
  PREPARE stmt2 FROM @s;
  SET @a = 6;
  SET @b = 8;
  EXECUTE stmt2 USING @a, @b;
END$$

DELIMITER ;

INSERT INTO table1 VALUES(2);

Notez que lorsque votre déclencheur n'a pas de clause BEGIN...END, les délimiteurs peuvent être omis.

Partie 2

Sans délimiteurs, l'instruction sera analysée comme -

CREATE PROCEDURE procedure1()
BEGIN
  SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';

au lieu de -

CREATE PROCEDURE procedure1()
BEGIN
  SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
  PREPARE stmt2 FROM @s;
  SET @a = 6;
  SET @b = 8;
  EXECUTE stmt2 USING @a, @b;
END