Uložené procedury jsou uživatelem definované příkazy SQL, které jsou uloženy v databázi MySQL a spouštěny na vyžádání k provedení konkrétní databázové operace. Tyto předdefinované podprogramy pomáhají při přesunu obchodní logiky do databáze, což nabízí několik výhod:
- Opáteční cesty prováděné aplikací na databázový server jsou minimalizovány.
- Udržovatelnost kódu je vylepšena, protože různé aplikace mohou sdílet uloženou proceduru.
- Výkon databáze je vylepšen, protože uložené procedury jsou zkompilovány jednou a spouštěny velmi rychle a efektivně.
V této příručce budete:
-
Naučte se syntaxi pro vytváření uložených procedur a deklarujte svou první proceduru.
-
Po deklaraci proveďte ukázkový postup.
-
Přečtěte si, jak smazat proceduru, když ji již nepotřebujete.
Než začnete
Ujistěte se, že máte následující:
-
Pokud jste tak ještě neučinili, vytvořte si účet Linode a Compute Instance. Podívejte se na naše příručky Začínáme s Linode a Vytvoření výpočetní instance.
-
Při aktualizaci systému postupujte podle našeho průvodce nastavením a zabezpečením výpočetní instance. Můžete také chtít nastavit časové pásmo, nakonfigurovat název hostitele, vytvořit omezený uživatelský účet a posílit přístup SSH.
-
Server a klient MySQL nainstalovaný na serveru Linode. Instalační příručky pro MySQL jsou k dispozici pro různé distribuce v naší sekci MySQL.
Příprava databáze
Začnete vytvořením vzorové databáze, tabulky a uživatele pro přístup k databázi. Tabulku také vyplníte ukázkovými daty pro účely testování.
Vytvoření databáze, tabulky a uživatele
-
Přihlaste se k serveru MySQL:
mysql -u root -p
Budete vyzváni k zadání hesla root vaší databáze MySQL. Poté stiskněte Enter pokračovat.
-
Dále uvidíte výzvu MySQL podobnou té, která je zobrazena níže.
mysql >
-
Zadejte příkaz níže a vytvořte
test_db
databáze:CREATE DATABASE test_db;
Výstup:
Query OK, 1 row affected (0.01 sec)
-
Vytvořte uživatele databáze a udělte úplný přístup k
test_db
databáze. NahraďtePASSWORD
s komplexní a jedinečnou hodnotou, která se řídí pokyny pro hesla MySQL:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Výstup:
Query OK, 1 row affected (0.01 sec)
-
Udělte
test_user
plná oprávnění ktest_db
databáze;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
Výstup:
Query OK, 1 row affected (0.01 sec)
-
Flush oprávnění:
FLUSH PRIVILEGES;
Výstup:
Query OK, 0 rows affected (0.01 sec)
Naplnění databáze
-
Dále se přepněte do databáze test_db:
USE test_db;
Výstup:
Database changed
-
Vytvořte
products
tabulka pro uložení vzorových záznamů:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
Výstup:
Query OK, 0 rows affected (0.01 sec)
-
Nyní můžete do tabulky produktů přidat několik produktů tak, že jeden po druhém provedete níže uvedené příkazy:
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');
Po provedení každého
Insert
byste měli získat níže uvedený výstup prohlášení:Query OK, 1 row affected (0.00 sec)
-
Další. potvrďte, zda byly vzorové produkty úspěšně vloženy do databáze spuštěním
Select
příkaz níže:SELECT * FROM products;
Vzorové produkty by měly být uvedeny níže:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec)
-
Ukončete server MySQL.
QUIT;
Výstup:
Bye!
-
Jakmile vytvoříte
test_db
databáze,products
tabulka,test_user
a přidali některé vzorové produkty, můžete nyní přejít k vytvoření první uložené procedury.
Vytvoření uložené procedury
Syntaxe uložené procedury
Základní syntaxe vytvoření uložené procedury v databázi MySQL je uvedena níže:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
DELIMITER &&
řádek na začátku říká serveru MySQL, aby s následujícími příkazy SQL zacházel jako s jedním příkazem, místo aby je spouštěl jednotlivě. Další&&
je zahrnuto na pozdějším řádku pro označení konce tohoto prohlášení. -
PROCEDURE_NAME
je místo, kde je deklarován název vaší uložené procedury. -
Za názvem procedury následuje sada závorek, které uzavírají parametry vaší procedury. Uložené procedury podporují parametry oddělené čárkami a tato funkce je činí flexibilnějšími. Další podrobnosti naleznete v části Parametry.
-
BEGIN...END
příkazy ohraničují příkaz SQL, který chcete, aby byl proveden uloženou procedurou. -
Nakonec příkaz
DELIMITER ;
je vydáno znovu, aby se oddělovač změnil zpět na výchozí hodnotu;
Parametry uložené procedury
Každý parametr procedury má typ, název a datový typ oddělené mezerami:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Chcete-li například vytvořit parametr typu IN
, s názvem category
, s VARCHAR
datový typ, který má délku 50 znaků, použijte tuto syntaxi:
IN category VARCHAR(50)
MySQL podporuje tři typy parametrů:
-
IN
:Hodnotu parametru musí zadat volající klient. Tuto hodnotu nelze změnit uloženou procedurou .Pokud například předáte proměnnou relace MySQL jako
IN
parametr do procedury a procedura tuto hodnotu ve svých příkazech upraví, vaše proměnná relace zůstane po ukončení procedury nezměněna. -
OUT
:Tento typ parametru je také specifikován volajícím programem, ale jeho hodnotu lze změnit uloženou procedurou a načíst ji volající program.Všimněte si, že uložená procedura nemůže získat přístup k počáteční hodnotě proměnné, která je předána jako
OUT
parametr. -
INOUT
:Parametr tohoto typu kombinuje chováníIN
aOUT
parametry:-
Uložená procedura může číst počáteční hodnotu parametru.
-
Parametr lze změnit během provádění uložené procedury.
-
Změněná hodnota může být vrácena zpět volajícímu programu, pokud volající program předal jako parametr proměnnou.
-
Příklad uložené procedury
Po pochopení základní syntaxe vytvoříme jednoduchou uloženou proceduru pro filtrování produktů podle názvu kategorie. Název kategorie bude poskytnut jako IN
parametr.
-
Přihlaste se k serveru MySQL pomocí
test_user
přihlašovací údaje, které jste vytvořili při přípravě databáze:mysql -u test_user -p
-
Zadejte heslo
test_user
a stiskněte Enter pokračovat. -
Získáte
mysql >
výzva. Pokračujte výběremtest_db
:USE test_db;
Výstup:
Database changed.
-
Poté zadejte příkazy SQL níže a vytvořte
filter_by_category
uložená procedura:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
Výstup:
Query OK, 0 rows affected (0.00 sec)
-
Změňte
DELIMITER
zpět na;
DELIMITER ;
-
Pokud kód pro vytvoření uložené procedury proběhl úspěšně, můžete nyní přejít ke spuštění uložené procedury.
Provedení uložené procedury
V tomto kroku zavoláme uloženou proceduru, kterou jsme vytvořili výše. Budeme postupovat podle této základní syntaxe:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
Chcete-li spustit
filter_by_category
uloženou proceduru, kterou jsme vytvořili výše, zadejte příkaz níže:CALL filter_by_category('COMPUTER ACCESSORIES');
Uložená procedura by nyní měla vypsat všechny produkty v
COMPUTER ACCESSORIES
kategorii, protože jsme zadaliCOMPUTER ACCESSORIES
jako parametr:+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
-
Podobně můžete získat seznam všech produktů z
ELECTRONICS
kategorii provedením příkazu níže.CALL filter_by_category('ELECTRONICS') ;
Výstup:
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
Naše uložená procedura fungovala tak, jak jsme očekávali. Dále se naučíme, jak zrušit uložené procedury, pokud již nechceme, aby se znovu spouštěly.
Odstranění uložených procedur
Uloženou proceduru MySQL můžete odstranit, pokud ji již nechcete používat nebo pokud ji chcete znovu vytvořit od začátku. Základní syntaxe zrušení uložené procedury je uvedena níže:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Chcete-li například smazat náš filter_by_category
uloženou proceduru, spusťte níže uvedený příkaz MySQL:
DROP PROCEDURE IF EXISTS filter_by_category;
Pokud uložená procedura existuje, dostanete výstup zobrazený níže:
Query OK, 0 rows affected (0.00 sec)
To je vše, pokud jde o vytváření, používání a odstraňování uložených procedur MySQL.
Další informace
Další informace o tomto tématu můžete získat v následujících zdrojích. Přestože jsou poskytovány v naději, že budou užitečné, vezměte prosím na vědomí, že nemůžeme ručit za přesnost nebo aktuálnost externě hostovaných materiálů.
- Práce s uloženými procedurami MySQL