sql >> Database >  >> RDS >> Mysql

MySQL:Hoe gebruik ik scheidingstekens in triggers?

Deel 1

De scheidingstekens worden gebruikt voor bronobjecten zoals opgeslagen procedure/functie, trigger of gebeurtenis. Al deze objecten kunnen een body - code hebben binnen de BEGIN...END-clausule.

Alle instructies in MySQL-scripts moeten worden afgesloten met een scheidingsteken, de standaard is ';'. Maar wat te doen als het bronobject body heeft met enkele statements, bijvoorbeeld:

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

Hoeveel verklaringen? 3 of 8? Het antwoord is drie, omdat het script twee INSERT's en één CREATE PROCEDURE-statement heeft. Zoals je ziet, heeft CREATE PROCEDURE ook enkele interne verklaringen; we zouden tegen de MySQL-client moeten zeggen dat al deze verklaringen (binnen BEGIN...END) - deel uitmaken van EEN verklaring; we kunnen het doen met behulp van scheidingstekens:

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

Let op, als uw trigger geen BEGIN...END-clausule heeft, kunnen scheidingstekens worden weggelaten.

Deel 2

Zonder scheidingstekens wordt de instructie geparseerd als -

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

in plaats van -

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. Een API aanroepen vanuit de opgeslagen procedure van SQL Server

  2. Datums opmaken in Oracle

  3. MYSQL group_concat equivalent in Sybase ASE?

  4. Hoe een ontbrekend nummer uit een reeks nummers te controleren?