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

Uložené procedury MySQL

MySQL nám poskytuje možnost vytvářet uložené procedury . Uložené procedury jsou výkonnou součástí MySQL (a dalších systémů správy databází, jako je SQL Server) a umožňují vám dělat více než pohledy.

Uložená procedura je kolekce SQL příkazů, které jsou uloženy v databázi. Uložená procedura může obsahovat obchodní logiku, což je jeden z klíčových aspektů, který odlišuje uložené procedury od pohledů. Uložená procedura může přijímat parametry a můžete nastavit proměnné, napište IF příkazy atd. v rámci uložené procedury.

Jak fungují uložené procedury?

Nejprve vytvoříte uloženou proceduru. Poté, co byl vytvořen, jej můžete spustit (nebo přesněji „nazvat“).

Chcete-li spustit uloženou proceduru, "zavolejte" ji. Když jej zavoláte, zadáte také všechny parametry, které může vyžadovat. Uložená procedura se pak spustí s použitím vašich parametrů jakýmkoli způsobem, který kód specifikuje.

Můžete například napsat uloženou proceduru, která přijímá FruitId parametr. Uložená procedura by pak mohla převzít tento parametr a použít jej ke kontrole inventáře pro toto konkrétní ovoce. Proto můžete zavolat uloženou proceduru pokaždé s jiným ID ovoce a vrátí hodnotu, která vám ukáže, kolik toho ovoce je na skladě.

Vytvořte uloženou proceduru

Uložené procedury se vytvářejí pomocí CREATE PROCEDURE prohlášení.

Syntaxe

Zde je syntaxe pro vytvoření uložené procedury:

CREATE PROCEDURE sp_name(p_1 INT)
BEGIN
  ...code goes here...
END;

Nahraďte sp_name s jakýmkoli názvem, který chcete použít pro uloženou proceduru. Závorky jsou povinné — uzavírají případné parametry. Pokud nejsou vyžadovány žádné parametry, mohou být závorky prázdné.

Hlavní část uložené procedury se nachází mezi BEGIN a END klíčová slova. Tato klíčová slova se používají pro psaní složených příkazů. Složený příkaz může obsahovat více příkazů a ty lze v případě potřeby vnořit. Proto můžete vnořit BEGIN a END bloky.

Ve většině případů budete také muset obklopit CREATE PROCEDURE příkaz s DELIMITER příkazy a změňte END; do END // . Takhle:

DELIMITER //

CREATE PROCEDURE sp_name(p_1 INT)
BEGIN
  ...code goes here...
END //

DELIMITER ;

Brzy vysvětlím proč, ale nyní se podívejme na příklad.

Příklad

Zde je jednoduchý příklad vytvoření uložené procedury. Spuštění následujícího kódu proti našemu FruitShopu databáze vytvoří uloženou proceduru nazvanou spCheckFruitStock :

DELIMITER //

CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT)
BEGIN
	SELECT 
		Fruit.FruitName, 
		Fruit.Inventory, 
		Units.UnitName
	FROM 
		Fruit INNER JOIN Units ON
		Fruit.UnitId = Units.UnitId
	WHERE 
		Fruit.FruitId = thisFruit;
END //

DELIMITER ;

Nyní můžeme tuto uloženou proceduru nazvat takto:

CALL spCheckFruitStock(1);

Zde předáme parametr 1 což je ID pro Apple .

Zde je výsledek:

Totéž můžeme udělat pro jakékoli ovoce v naší databázi, jednoduše změnou parametru předávaného do uložené procedury.

O DELIMITER Příkaz

Ve výše uvedeném příkladu jsme přidali pár DELIMITER a středník jsme nahradili dvěma lomítky. Co se tady děje?

Udělali jsme to, abychom řekli MySQL, aby při vytváření naší uložené procedury používala jiný oddělovač.

Důvodem je to, že MySQL již rozpoznává středník jako oddělovač pro označení konce každého příkazu SQL. Jakmile tedy MySQL uvidí první středník, bude interpretovat oddělovač jako takový a naše uložená procedura by se zlomila.

DELIMITER nám umožňuje říci MySQL, aby použil jiný oddělovač. Ve výše uvedeném příkladu jsme to nastavili na dvě lomítka (// ), ale mohlo to být cokoliv (i když nepoužívejte zpětné lomítko (\ ), protože to je znak escape pro MySQL). Změnou oddělovače se MySQL nebude snažit interpretovat naše středníky jako konec příkazu – počká, dokud neuvidí dvě lomítka.

Jakmile vytvoříme uloženou proceduru, můžeme použít DELIMITER ; pro resetování oddělovače zpět na středník.

Vypuštění uložené procedury

Uloženou proceduru můžete zrušit pomocí DROP PROCEDURE prohlášení. Takhle:

DROP PROCEDURE spCheckFruitStock;

Změna uložené procedury

některé můžete změnit aspekty uložené procedury pomocí ALTER PROCEDURE prohlášení.

Chcete-li však změnit tělo uložené procedury nebo některý z jejích parametrů, musíte proceduru zrušit a vytvořit ji znovu. Takhle:

DROP PROCEDURE IF EXISTS spCheckFruitStock;

DELIMITER //

CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT)
BEGIN
	SELECT 
		Fruit.FruitId, 
		Fruit.FruitName, 
		Fruit.Inventory, 
		Units.UnitName
	FROM 
		Fruit INNER JOIN Units ON
		Fruit.UnitId = Units.UnitId
	WHERE 
		Fruit.FruitId = thisFruit;
END //

DELIMITER ;

Zde jsme přidali Fruit.FruitId do seznamu sloupců, které se mají vrátit.

Výsledek:

Pokročilejší uložená procedura

Výše uvedený příklad byl jednoduchý, aby demonstroval syntaxi vytváření a volání uložených procedur. Podívejme se na trochu složitější uloženou proceduru:

DROP PROCEDURE IF EXISTS spCheckFruitStockLevel;

DELIMITER //

CREATE PROCEDURE spCheckFruitStockLevel(
	IN pFruitId SMALLINT(5),
    OUT pStockLevel VARCHAR(6))
BEGIN
	DECLARE stockNumber SMALLINT;
    
	SELECT 
		Fruit.Inventory into stockNumber
	FROM 
		Fruit INNER JOIN Units ON
		Fruit.UnitId = Units.UnitId
	WHERE 
		Fruit.FruitId = pFruitId;
        
	IF stockNumber > 10 THEN
		SET pStockLevel = 'High';
    ELSEIF (stockNumber <= 10 AND stockNumber >= 5) THEN
		SET pStockLevel = 'Medium';
    ELSEIF (stockNumber < 5) THEN
		SET pStockLevel = 'Low - Please Replace Now!';
	END IF;
    
END //

DELIMITER ;

Výše uvedený příklad přijímá dva různé režimy parametrů (IN a OUT ). IN je výchozí, takže to je důvod, proč předchozí příklad nezahrnoval režim.

Zde také nastavíme proměnnou. Používáme DECLARE stockNumber SMALLINT deklarovat proměnnou s názvem stockNumber s typem SMALLINT (malé celé číslo).

Používáme SELECT příkaz k vyhledání inventáře pro dané ID ovoce a přiřazení k našemu stockNumber proměnná.

Nakonec použijeme SQL IF k určení úrovně zásob, umístěním této hodnoty do pStockLevel parametr (což je samozřejmě OUT parametr — toto je hodnota, kterou uvidíme, když zavoláme uloženou proceduru).

Volání uložené procedury s OUT nebo INOUT Parametr

V našem posledním příkladu jsme zadali dva parametry, IN parametr a OUT parametr.

Když voláme tuto uloženou proceduru, musíme ještě zahrnout OUT parametr. Protože však nebudeme znát její hodnotu (koneckonců proto ji nazýváme — abychom zjistili její hodnotu!), budeme muset použít proměnnou. Pak můžeme použít SELECT příkazu, abyste zjistili jeho hodnotu.

Takhle:

CALL spCheckFruitStockLevel(1, @stockLevel);
select @stockLevel;

Výsledek:

Režimy parametrů

Právě jsme použili dva režimy parametrů (IN a OUT ). V MySQL existují tři režimy parametrů, které lze použít s uloženými procedurami.

IN
Když použijete tento režim parametrů, musíte vy (nebo vaše aplikace) při volání uložené procedury předat hodnotu parametru. Tyto parametry jsou chráněny. Po provedení uložené procedury je proto zachována jeho původní hodnota. Pokud uložená procedura změní hodnotu, provede tak pouze na kopii parametru.

Tento režim je výchozím režimem. Pokud režim parametrů nezadáte, bude IN .

OUT
Hodnota OUT Parametr se může v rámci uložené procedury změnit a jeho hodnota je vrácena volající aplikaci.
VSTUP
Tento režim je kombinací IN a OUT režimy. Počáteční hodnotu můžete předat, uložená procedura ji může změnit a volající aplikaci vrátí novou hodnotu.

  1. psycopg2:vložte více řádků jedním dotazem

  2. Upgradovat sloupec PostgreSQL JSON na JSONB?

  3. Instalace a konfigurace protokolu SQL Serveru a obnovení po havárii -1

  4. Příliš dlouhá chyba řetězce vývojáře Oracle Sql