sql >> Base de Datos >  >> RDS >> Mysql

MySQL:¿Cómo uso delimitadores en activadores?

Parte 1

Los delimitadores se utilizan para objetos de origen como procedimiento/función almacenados, disparador o evento. Todos estos objetos pueden tener un cuerpo - código dentro de la cláusula BEGIN...END.

Todas las declaraciones en los scripts de MySQL deben terminar con un delimitador, el valor predeterminado es ';'. Pero qué hacer si el objeto fuente tiene cuerpo con algunas declaraciones, por ejemplo:

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

¿Cuántos enunciados? 3 u 8? La respuesta es tres, porque el script tiene dos instrucciones INSERT y una instrucción CREATE PROCEDURE. Como puede ver, CREATE PROCEDURE también tiene algunas declaraciones internas; deberíamos decirle al cliente MySQL que todas estas declaraciones (dentro de BEGIN...END) son parte de UNA declaración; podemos hacerlo con la ayuda de delimitadores:

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

Tenga en cuenta que cuando su activador no tiene una cláusula BEGIN...END, se pueden omitir los delimitadores.

Parte 2

Sin delimitadores, la declaración se analizará como -

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

en lugar 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