Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Wie verwende ich Trennzeichen in Triggern?

Teil 1

Die Trennzeichen werden für Quellobjekte wie gespeicherte Prozeduren/Funktionen, Trigger oder Ereignisse verwendet. Alle diese Objekte können einen Body-Code innerhalb der BEGIN...END-Klausel haben.

Alle Anweisungen in MySQL-Skripten sollten mit Trennzeichen enden, der Standardwert ist ';'. Aber was tun, wenn das Quellobjekt einen Körper mit einigen Anweisungen hat, z. B.:

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

Wie viele Statements? 3 oder 8? Die Antwort ist drei, weil das Skript zwei INSERTs und eine CREATE PROCEDURE-Anweisung hat. Wie Sie sehen, hat CREATE PROCEDURE auch einige interne Anweisungen; Wir sollten dem MySQL-Client sagen, dass alle diese Anweisungen (innerhalb von BEGIN ... END) - Teil EINER Anweisung sind; wir können es mit Hilfe von Trennzeichen machen:

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

Beachten Sie, dass Trennzeichen weggelassen werden können, wenn Ihr Trigger keine BEGIN...END-Klausel hat.

Teil 2

Ohne Trennzeichen wird die Anweisung als -

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

statt -

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