sql >> Databáze >  >> RDS >> Mysql

MySQL:Jak mohu použít oddělovače v triggerech?

Část 1

Oddělovače se používají pro zdrojové objekty, jako je uložená procedura/funkce, spouštěč nebo událost. Všechny tyto objekty mohou mít tělo - kód v klauzuli BEGIN...END.

Všechny příkazy ve skriptech MySQL by měly být ukončeny oddělovačem, výchozí je ';'. Ale co dělat, když má zdrojový objekt tělo s nějakými příkazy, např.:

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

Kolik prohlášení? 3 nebo 8? Odpověď je tři, protože skript má dva příkazy INSERT a jeden příkaz CREATE PROCEDURE. Jak vidíte, CREATE PROCEDURE má také některé interní příkazy; měli bychom říci klientovi MySQL, že všechny tyto příkazy (uvnitř BEGIN...END) - jsou součástí JEDNOHO příkazu; můžeme to udělat pomocí oddělovačů:

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

Všimněte si, že když váš spouštěč nemá klauzuli BEGIN...END, oddělovače mohou být vynechány.

Část 2

Bez oddělovačů bude příkaz analyzován jako -

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

místo -

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. Problém s Mysql při vytváření nového uživatele

  2. Jak zřetězit řetězce v SQLite

  3. mysql -> vložit do tbl (vybrat z jiné tabulky) a nějaké výchozí hodnoty

  4. Jak vypočítat procento růstu po měsíci v MySQL