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

MySQL:Hvordan bruger jeg afgrænsere i triggere?

Del 1

Afgrænsningerne bruges til kildeobjekter som lagret procedure/funktion, trigger eller hændelse. Alle disse objekter kan have en body - kode i BEGIN...END klausulen.

Alle sætninger i MySQL scripts skal afsluttes med skilletegn, standard er ';'. Men hvad skal man gøre, hvis kildeobjektet har krop med nogle udsagn, f.eks.:

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

Hvor mange statsmænd? 3 eller 8? Svaret er tre, fordi scriptet har to INSERT- og en CREATE PROCEDURE-sætning. Som du kan se, har CREATE PROCEDURE også nogle interne erklæringer; vi bør sige til MySQL-klienten, at alle disse sætninger (inde i BEGIN...END) - er en del af EN sætning; vi kan gøre det ved hjælp af skilletegn:

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

Bemærk, når din trigger ikke har nogen BEGIN...END-sætning, kan afgrænsningstegn udelades.

Del 2

Uden skilletegn vil sætningen blive parset som -

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

i stedet for -

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. Hvad er der galt med min SQL her? #1089 - Forkert præfiksnøgle

  2. Kan ikke kopiere forudoprettet db fra aktiver

  3. Hvordan laver man en tilføje ven/defriend funktion i PHP?

  4. Laravel 4:multiplum hvor med eller i veltalende