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
aOUT
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.