sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Hur använder jag avgränsare i triggers?

Del 1

Avgränsarna används för källobjekt som lagrad procedur/funktion, trigger eller händelse. Alla dessa objekt kan ha en body - kod inom BEGIN...END-satsen.

Alla uttalanden i MySQL-skript ska avslutas med avgränsare, standard är ';'. Men vad ska man göra om källobjektet har en kropp med vissa uttalanden, t.ex.:

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

Hur många statsman? 3 eller 8? Svaret är tre, eftersom skriptet har två INSERT- och en CREATE PROCEDURE-sats. Som du ser har CREATE PROCEDURE några interna uttalanden också; vi bör säga till MySQL-klienten att alla dessa uttalanden (inuti BEGIN...END) - är en del av EN sats; vi kan göra det med hjälp av avgränsare:

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

Observera att när din utlösare inte har någon BEGIN...END-sats, kan avgränsare utelämnas.

Del 2

Utan avgränsare kommer satsen att tolkas som -

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

istället för -

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


  1. SQL (MySQL) vs NoSQL (CouchDB)

  2. Jag försöker en enkel fråga med parametern in med mysql 5.5 genom jdbc-kod

  3. Vad är @@TEXTSIZE i SQL Server?

  4. När jag använder Docker får jag felet:SQLSTATE[HY000] [2002] Ingen sådan fil eller katalog