Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Съхранени процедури

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 режими. Можете да предадете първоначалната стойност, съхранената процедура може да я промени и тя ще върне новата стойност на извикващото приложение.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Динамична връзка с MySQL база данни за Entity Framework 6

  2. Отказ на база данни за уебсайтове на WordPress

  3. Изберете 3-те най-скорошни записа, където стойностите на една колона са различни

  4. Как да съхранявате IPv6-съвместим адрес в релационна база данни

  5. Не може да се промени колоната, използвана в ограничение за външен ключ