MySQL ни предоставя възможността да създаваме съхранени процедури . Съхранените процедури са мощна част от MySQL (и други системи за управление на бази данни, като SQL Server) и ви позволяват да правите повече от изгледите.
запазена процедура е колекция от SQL изрази, които се съхраняват в базата данни. Съхранената процедура може да съдържа бизнес логика, която е един от ключовите аспекти, които отличават съхранените процедури от изгледите. Съхранената процедура може да приема параметри и можете да задавате променливи, да пишете IF
оператори и т.н. в рамките на съхранена процедура.
Как работят съхранените процедури?
На първо място, създавате съхранената процедура. След това, след като бъде създаден, можете да го стартирате (или по-точно, да го „извикате“).
За да стартирате съхранена процедура, вие я „извиквате“. Когато го извикате, вие също така предоставяте всички параметри, които може да изисква. След това съхранената процедура ще се изпълни, като използва вашите параметри по какъвто и да е начин, посочен от кода.
Например, можете да напишете съхранена процедура, която приема FruitId
параметър. След това съхранената процедура може да вземе този параметър и да го използва, за да провери инвентара за този конкретен плод. Следователно можете да извикате съхранената процедура всеки път с различен идентификатор на плода и тя ще върне стойност, която ви показва колко от този плод има на склад.
Създайте съхранена процедура
Съхранените процедури се създават с помощта на CREATE PROCEDURE
изявление.
Синтаксис
Ето синтаксиса за създаване на съхранена процедура:
CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END;
Заменете sp_name с каквото и да е име, което искате да използвате за съхранената процедура. Скобите са задължителни — те обхващат всички параметри. Ако не се изискват параметри, скобите могат да бъдат празни.
Основното тяло на съхранената процедура се намира между BEGIN
и END
ключови думи. Тези ключови думи се използват за писане на съставни изрази. Съставен израз може да съдържа множество изрази и те могат да бъдат вложени, ако е необходимо. Следователно можете да вложите BEGIN
и END
блокове.
В повечето случаи ще трябва също да заобиколите CREATE PROCEDURE
изявление с DELIMITER
команди и променете END;
до END //
. Като това:
DELIMITER // CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END // DELIMITER ;
Скоро ще обясня защо, но засега нека разгледаме пример.
Пример
Ето един прост пример за създаване на съхранена процедура. Изпълняване на следния код срещу нашия FruitShop база данни ще създаде съхранена процедура, наречена 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 ;
Сега можем да извикаме тази съхранена процедура по следния начин:
CALL spCheckFruitStock(1);
Тук предаваме параметър от 1
което е идентификационният номер за
Apple
.
Ето резултата:
Можем да направим същото за всеки плод в нашата база данни, просто като променим параметъра, предаден на съхранената процедура.
Относно DELIMITER
Команда
В горния пример добавихме няколко DELIMITER
команди и заменихме точка и запетая с две наклонени черти. Какво става тук?
Направихме това, за да кажем на MySQL да използва различен разделител, докато създава нашата съхранена процедура.
Причината за това е, че MySQL вече разпознава точката и запетаята като разделител за маркиране на края на всеки SQL израз. Следователно, веднага щом MySQL види първата точка и запетая, той ще интерпретира разделителя като такъв и нашата съхранена процедура ще се счупи.
DELIMITER
команда ни позволява да кажем на MySQL да използва различен разделител. В горния пример зададохме това на две наклонени черти (//
), но това можеше да е всичко (въпреки че избягвайте използването на обратна наклонена черта (\
), тъй като това е escape-символът за MySQL). Чрез промяна на разделителя MySQL няма да се опитва да интерпретира нашите точки и запетая като край на изявлението – ще изчака, докато види двете наклонени черти напред.
След като създадем съхранената процедура, можем да използваме DELIMITER ;
за да върнете разделителя обратно към точката и запетаята.
Отпадане на съхранена процедура
Можете да махнете съхранена процедура, като използвате DROP PROCEDURE
изявление. Като това:
DROP PROCEDURE spCheckFruitStock;
Промяна на съхранена процедура
Можете да промените някои аспекти на съхранена процедура с помощта на ALTER PROCEDURE
изявление.
Въпреки това, за да промените тялото на съхранената процедура или някой от нейните параметри, трябва да пуснете процедурата и да я създадете отново. Като това:
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 ;
Тук добавихме Fruit.FruitId
към списъка с колони за връщане.
Резултат:
По-усъвършенствана съхранена процедура
Горният пример беше прост, за да демонстрира синтаксиса на създаване и извикване на съхранени процедури. Нека разгледаме малко по-сложна съхранена процедура:
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 ;
Горният пример приема два различни режима на параметри (IN
и OUT
). IN
е по подразбиране, така че ето защо предишният пример не включва режима.
Тук също задаваме променлива. Използваме DECLARE stockNumber SMALLINT
за да декларирате променлива, наречена stockNumber
с тип SMALLINT
(малко цяло число).
Използваме SELECT
изявление, за да потърсите инвентара за даден плодов идентификатор и да го присвоите в нашия stockNumber
променлива.
Накрая използваме SQL IF
изявление за определяне на нивото на запасите, поставяйки тази стойност в pStockLevel
параметър (който, разбира се, е OUT
параметър — това е стойността, която ще видим, когато извикаме съхранената процедура).
Извикване на съхранена процедура с OUT
или INOUT
Параметър
В последния ни пример посочихме два параметъра, IN
параметър и OUT
параметър.
Когато извикаме тази съхранена процедура, все още трябва да включим OUT
параметър. Въпреки това, тъй като няма да знаем стойността му (в края на краищата, затова го наричаме — за да разберем стойността му!), ще трябва да използваме променлива. След това можем да използваме SELECT
изявление, за да разберете стойността му.
Като това:
CALL spCheckFruitStockLevel(1, @stockLevel); select @stockLevel;
Резултат:
Режими на параметри
Току-що използвахме два режима на параметри (IN
и OUT
). В MySQL има три режима на параметри, които могат да се използват със съхранени процедури.
- В
- Когато използвате този режим на параметър, вие (или вашето приложение) трябва да предадете стойността на параметъра, когато извикате съхранената процедура. Тези параметри са защитени. Следователно, оригиналната му стойност се запазва след изпълнение на съхранената процедура. Ако съхранената процедура промени стойността, тя прави това само на копие на параметъра.
Този режим е режимът по подразбиране. Ако не предоставите режима на параметрите, той ще бъде
IN
. - ИЗХОД
- Стойността на
OUT
параметърът може да се промени в рамките на съхранената процедура и стойността му се връща на извикващото приложение. - INOUT
- Този режим е комбинация от
IN
иOUT
режими. Можете да предадете първоначалната стойност, съхранената процедура може да я промени и тя ще върне новата стойност на извикващото приложение.