Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:come si utilizzano i delimitatori nei trigger?

Parte 1

I delimitatori vengono utilizzati per oggetti di origine come stored procedure/funzioni, trigger o eventi. Tutti questi oggetti possono avere un codice corpo all'interno della clausola BEGIN...END.

Tutte le istruzioni negli script MySQL devono essere terminate con delimitatore, il valore predefinito è ';'. Ma cosa fare se l'oggetto sorgente ha un corpo con alcune istruzioni, ad esempio:

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);

Quanti statisti? 3 o 8? La risposta è tre, perché lo script ha due INSERT e un'istruzione CREATE PROCEDURE. Come vedi, CREATE PROCEDURE ha anche alcune istruzioni interne; dovremmo dire al client MySQL che tutte queste istruzioni (all'interno di BEGIN...END) - fanno parte di UNA istruzione; possiamo farlo con l'aiuto dei delimitatori:

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);

Nota, quando il trigger non ha la clausola BEGIN...END, i delimitatori possono essere omessi.

Parte 2

Senza delimitatori l'istruzione verrà analizzata come -

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

invece di -

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