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

Vytváření a používání uložených procedur MySQL – výukový program

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í:

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

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

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

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

  2. Dále uvidíte výzvu MySQL podobnou té, která je zobrazena níže.

    mysql >
  3. 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)
  4. Vytvořte uživatele databáze a udělte úplný přístup k test_db databáze. Nahraďte PASSWORD 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)
  5. Udělte test_user plná oprávnění k test_db databáze;

    GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
    

    Výstup:

    Query OK, 1 row affected (0.01 sec)
  6. Flush oprávnění:

    FLUSH PRIVILEGES;
    

    Výstup:

    Query OK, 0 rows affected (0.01 sec)

Naplnění databáze

  1. Dále se přepněte do databáze test_db:

    USE test_db;
    

    Výstup:

    Database changed
  2. 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)
  3. 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)
  4. 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)
  5. Ukončete server MySQL.

    QUIT;
    

    Výstup:

    Bye!
  6. 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 a OUT 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.

  1. 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
    
  2. Zadejte heslo test_user a stiskněte Enter pokračovat.

  3. Získáte mysql > výzva. Pokračujte výběrem test_db :

     USE test_db;
    

    Výstup:

    Database changed.
  4. 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)
  5. Změňte DELIMITER zpět na ;

    DELIMITER ;
    
  6. 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 zadali COMPUTER 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

  1. Skript pro nalezení víceúrovňových závislostí balíčku

  2. Jak nasadit distribuci Percona pro PostgreSQL pro vysokou dostupnost

  3. Jaká jsou omezení SQL a jejich různé typy?

  4. Jak vytvořit uloženou proceduru vázanou na schéma na serveru SQL Server