Съхранените процедури са дефинирани от потребителя SQL изрази, които се съхраняват в MySQL база данни и се изпълняват при поискване за извършване на конкретна операция с база данни. Тези предварително дефинирани подпрограми помагат при преместването на бизнес логиката в базата данни, което предлага няколко предимства:
- Обиколните пътувания, направени до сървъра на базата данни от приложение, са сведени до минимум.
- Поддържаемостта на кода е подобрена, тъй като различни приложения могат да споделят съхранената процедура.
- Ефективността на базата данни е подобрена, тъй като съхранените процедури се компилират веднъж и се изпълняват много бързо и ефективно.
В това ръководство ще:
-
Научете синтаксиса за създаване на съхранени процедури и декларирайте първата си процедура.
-
Изпълнете примерната процедура, след като сте я декларирали.
-
Научете как да изтриете процедура, когато вече не се нуждаете от нея.
Преди да започнете
Уверете се, че имате следното:
-
Ако все още не сте го направили, създайте акаунт в Linode и Compute Instance. Вижте нашите ръководства Първи стъпки с Linode и Създаване на изчислителен екземпляр.
-
Следвайте нашето ръководство за настройка и осигуряване на изчислителен екземпляр, за да актуализирате вашата система. Може също да пожелаете да зададете часовата зона, да конфигурирате името на хоста си, да създадете ограничен потребителски акаунт и да укрепите SSH достъпа.
-
MySQL сървър и клиент, инсталирани на сървъра на Linode. Ръководствата за инсталиране на MySQL са налични за различни дистрибуции в нашия раздел MySQL.
Подгответе базата данни
Ще започнете със създаване на примерна база данни, таблица и потребител за достъп до базата данни. Освен това ще попълните таблицата с примерни данни за тестови цели.
Създаване на базата данни, таблицата и потребителя
-
Влезте в MySQL сървъра:
mysql -u root -p
Ще бъдете подканени да въведете root паролата на вашата MySQL база данни. След това натиснете Enter за да продължите.
-
След това ще видите подкана за MySQL, подобна на показаната по-долу.
mysql >
-
Въведете командата по-долу, за да създадете
test_db
база данни:CREATE DATABASE test_db;
Изход:
Query OK, 1 row affected (0.01 sec)
-
Създайте потребител на база данни и дайте пълен достъп до
test_db
база данни. ЗаменетеPASSWORD
със сложна и уникална стойност, която следва указанията за MySQL пароли:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Изход:
Query OK, 1 row affected (0.01 sec)
-
Предоставете
test_user
пълни привилегии заtest_db
база данни;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
Изход:
Query OK, 1 row affected (0.01 sec)
-
Привилегии за изтриване:
FLUSH PRIVILEGES;
Изход:
Query OK, 0 rows affected (0.01 sec)
Попълване на базата данни
-
След това превключете към базата данни test_db:
USE test_db;
Изход:
Database changed
-
Създайте
products
таблица за съхраняване на примерни записи:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
Изход:
Query OK, 0 rows affected (0.01 sec)
-
Вече можете да добавите няколко продукта към таблицата с продукти, като изпълните командите по-долу един по един:
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');
Трябва да получите следния изход след изпълнение на всяко
Insert
изявление:Query OK, 1 row affected (0.00 sec)
-
Следващия. потвърдете дали примерните продукти са били вмъкнати успешно в базата данни, като изпълните
Select
команда по-долу:SELECT * FROM products;
Вашите примерни продукти трябва да са изброени, както е показано по-долу:
+------------+-----------------+----------------------+ | 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)
-
Излезте от MySQL сървъра.
QUIT;
Изход:
Bye!
-
След като създадете
test_db
база данни,products
таблица,test_user
и добавих някои примерни продукти, сега можете да преминете към създаване на първата съхранена процедура.
Създаване на съхранена процедура
Синтаксис на запаметената процедура
Основният синтаксис на създаване на съхранена процедура в MySQL база данни е показан по-долу:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
DELIMITER &&
ред в началото казва на MySQL сървъра да третира следните SQL изрази като единичен израз, вместо да ги изпълнява поотделно. Друг&&
е включен на по-късен ред, за да отбележи края на това изявление. -
PROCEDURE_NAME
е мястото, където се декларира името на вашата съхранена процедура. -
Името на процедурата е последвано от набор от скоби, които обхващат параметрите на вашата процедура. Съхранените процедури поддържат параметри, разделени със запетая, и тази функция ги прави по-гъвкави. Вижте раздела с параметри за повече подробности.
-
BEGIN...END
командите обхващат SQL израза, който искате да бъде изпълнен от съхранената процедура. -
В крайна сметка изразът
DELIMITER ;
се издава отново, за да промени разделителя обратно към стойността по подразбиране на;
Параметри на запаметената процедура
Всеки параметър за процедура има тип, име и тип данни, разделени с интервали:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Например, за да създадете параметър от тип IN
, с име category
, с VARCHAR
тип данни с дължина от 50 символи, използвайте този синтаксис:
IN category VARCHAR(50)
MySQL поддържа три типа параметри:
-
IN
:Стойността на параметъра трябва да бъде определена от извикващия клиент. Тази стойност не може да бъде променена от съхранената процедура .Например, ако предадете променлива на сесията на aMySQL като
IN
параметър към процедура и процедурата променя тази стойност в своите оператори, вашата променлива на сесията ще остане непроменена след излизане от процедурата. -
OUT
:Този тип параметър също се посочва от извикващата програма, но стойността му може да бъде променена от съхранената процедура и извлечена от извикващата програма.Обърнете внимание, че съхранената процедура не може да получи достъп до първоначалната стойност на променлива, която се предава като
OUT
параметър. -
INOUT
:Параметър от този тип комбинира поведението наIN
иOUT
параметри:-
Съхранената процедура може да чете първоначалната стойност на параметъра.
-
Параметърът може да бъде променен по време на изпълнение на съхранената процедура.
-
Променената стойност може да бъде върната обратно към извикващата програма, ако извикващата програма е прехвърлила променлива като параметър.
-
Примерна съхранена процедура
След като разберем основния синтаксис, нека създадем проста съхранена процедура за филтриране на продукти по име на категория. Името на категорията ще бъде предоставено като IN
параметър.
-
Влезте в MySQL сървъра, като използвате
test_user
's идентификационни данни, които сте създали при подготовката на базата данни:mysql -u test_user -p
-
Въведете паролата на
test_user
и натиснете Enter за да продължите. -
Ще получите
mysql >
бърза. Продължете, като изберетеtest_db
:USE test_db;
Изход:
Database changed.
-
След това въведете SQL командите по-долу, за да създадете
filter_by_category
съхранена процедура:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
Изход:
Query OK, 0 rows affected (0.00 sec)
-
Променете
DELIMITER
обратно към;
DELIMITER ;
-
Ако кодът за създаване на съхранената процедура се изпълни успешно, вече можете да преминете към изпълнение на съхранената процедура.
Изпълнение на съхранена процедура
В тази стъпка ще извикаме съхранената процедура, която създадохме по-горе. Ще следваме този основен синтаксис:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
За да изпълните
filter_by_category
съхранена процедура, която създадохме по-горе, въведете командата по-долу:CALL filter_by_category('COMPUTER ACCESSORIES');
Съхранената процедура вече трябва да извежда всички продукти в
COMPUTER ACCESSORIES
категория, защото сме посочилиCOMPUTER ACCESSORIES
като параметър:+------------+-----------------+----------------------+ | 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)
-
По същия начин можете да извлечете списък с всички продукти от
ELECTRONICS
категория, като изпълните командата по-долу.CALL filter_by_category('ELECTRONICS') ;
Изход:
+------------+-----------------+---------------+ | 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)
Нашата съхранена процедура работи, както очаквахме. След това ще научим как да изтрием съхранените процедури, ако вече не искаме те да се изпълняват отново.
Изтриване на съхранени процедури
Можете да изтриете съхранена процедура в MySQL, ако вече не искате да я използвате или ако искате да я пресъздадете от нулата. Основният синтаксис на отпадане на съхранената процедура е показан по-долу:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Например, за да изтриете нашия filter_by_category
съхранена процедура, изпълнете командата MySQL по-долу:
DROP PROCEDURE IF EXISTS filter_by_category;
Ако съхранената процедура съществува, ще получите изхода, показан по-долу:
Query OK, 0 rows affected (0.00 sec)
Това е всичко, когато става въпрос за създаване, използване и премахване на MySQL съхранени процедури.
Повече информация
Може да пожелаете да се консултирате със следните ресурси за допълнителна информация по тази тема. Въпреки че те са предоставени с надеждата, че ще бъдат полезни, моля, имайте предвид, че не можем да гарантираме за точността или навременността на външно хостваните материали.
- Работа със съхранени процедури на MySQL