sql >> Databasteknik >  >> RDS >> Mysql

MySQL lagrade procedurer

MySQL ger oss möjligheten att skapa lagrade procedurer . Lagrade procedurer är en kraftfull del av MySQL (och andra databashanteringssystem, som SQL Server) och de låter dig göra mer än vad vyer gör.

En lagrad procedur är en samling SQL-satser som lagras i databasen. En lagrad procedur kan innehålla affärslogik, vilket är en av nyckelaspekterna som skiljer lagrade procedurer från vyer. En lagrad procedur kan acceptera parametrar, och du kan ställa in variabler, skriva IF uttalanden etc inom en lagrad procedur.

Hur fungerar lagrade procedurer?

Först och främst skapar du den lagrade proceduren. Sedan när det har skapats kan du köra det (eller mer exakt, du "kallar" det).

För att köra en lagrad procedur "kallar" du den. När du anropar det anger du också alla parametrar som det kan kräva. Den lagrade proceduren kommer sedan att köras med dina parametrar på något sätt som koden anger.

Du kan till exempel skriva en lagrad procedur som accepterar en FruitId parameter. Den lagrade proceduren kan sedan ta den parametern och använda den för att kontrollera inventeringen för just den frukten. Därför kan du anropa den lagrade proceduren, varje gång med ett annat frukt-ID och det skulle returnera ett värde som visar hur mycket av den frukten som finns i lager.

Skapa en lagrad procedur

Lagrade procedurer skapas med CREATE PROCEDURE uttalande.

Syntax

Här är syntaxen för att skapa en lagrad procedur:

CREATE PROCEDURE sp_name(p_1 INT)
BEGIN
  ...code goes here...
END;

Ersätt sp_name med vilket namn du än vill använda för den lagrade proceduren. Parenteserna är obligatoriska - de omsluter alla parametrar. Om inga parametrar krävs kan parenteserna vara tomma.

Huvuddelen av den lagrade proceduren går mellan BEGIN och END nyckelord. Dessa nyckelord används för att skriva sammansatta uttalanden. En sammansatt sats kan innehålla flera satser, och dessa kan kapslas om det behövs. Därför kan du kapsla BEGIN och END block.

I de flesta fall måste du också omge CREATE PROCEDURE uttalande med DELIMITER kommandon och ändra END; till END // . Så här:

DELIMITER //

CREATE PROCEDURE sp_name(p_1 INT)
BEGIN
  ...code goes here...
END //

DELIMITER ;

Jag ska snart förklara varför, men låt oss nu titta på ett exempel.

Exempel

Här är ett enkelt exempel på hur du skapar en lagrad procedur. Kör följande kod mot vår FruitShop databasen kommer att skapa en lagrad procedur som heter 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 ;

Nu kan vi kalla den lagrade proceduren så här:

CALL spCheckFruitStock(1);

Här skickar vi parametern 1 som är ID för Apple .

Här är resultatet:

Vi kan göra samma sak för vilken frukt som helst i vår databas, helt enkelt genom att ändra parametern som skickas till den lagrade proceduren.

Om DELIMITER Kommando

I exemplet ovan lade vi till ett par DELIMITER kommandon och vi ersatte ett semikolon med två snedstreck framåt. Vad händer här?

Vi gjorde detta för att berätta för MySQL att använda en annan avgränsare medan den skapar vår lagrade procedur.

Anledningen till detta är att MySQL redan känner igen semikolon som en avgränsare för att markera slutet på varje SQL-sats. Därför, så snart MySQL ser det första semikolonet, kommer den att tolka avgränsaren som sådan och vår lagrade procedur skulle gå sönder.

DELIMITER kommandot låter oss berätta för MySQL att använda en annan avgränsare. I exemplet ovan ställer vi in ​​detta på två snedstreck (// ) men det här kunde ha varit vad som helst (även om du undviker att använda ett snedstreck (\ ) eftersom det är flyktkaraktären för MySQL). Genom att ändra avgränsaren kommer MySQL inte att försöka tolka våra semikolon som slutet på uttalandet – det kommer att vänta tills det ser de två snedstrecket framåt.

När vi har skapat den lagrade proceduren kan vi använda DELIMITER ; för att återställa avgränsaren till semikolon.

Släpp en lagrad procedur

Du kan släppa en lagrad procedur genom att använda DROP PROCEDURE påstående. Så här:

DROP PROCEDURE spCheckFruitStock;

Ändra en lagrad procedur

Du kan ändra en del aspekter av en lagrad procedur genom att använda ALTER PROCEDURE påstående.

Men för att ändra innehållet i den lagrade proceduren, eller någon av dess parametrar, måste du släppa proceduren och skapa den igen. Så här:

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 ;

Här har vi lagt till Fruit.FruitId till listan över kolumner att återvända.

Resultat:

En mer avancerad lagrad procedur

Ovanstående exempel var enkelt för att demonstrera syntaxen för att skapa och anropa lagrade procedurer. Låt oss titta på en lite mer komplex lagrad procedur:

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 ;

Ovanstående exempel accepterar två olika lägen av parametrar (IN och OUT ). IN är standard, så det är därför det föregående exemplet inte inkluderade läget.

Här ställer vi också in en variabel. Vi använder DECLARE stockNumber SMALLINT för att deklarera en variabel som heter stockNumber med en typ av SMALLINT (litet heltal).

Vi använder en SELECT uttalande för att slå upp inventeringen för det givna frukt-ID:t och tilldela det till vårt stockNumber variabel.

Slutligen använder vi en SQL IF för att bestämma lagernivån, placera detta värde i pStockLevel parameter (som naturligtvis är OUT parameter — detta är värdet som vi kommer att se när vi anropar den lagrade proceduren).

Anropa en lagrad procedur med en OUT eller INOUT Parameter

I vårt senaste exempel specificerade vi två parametrar, en IN parameter och en OUT parameter.

När vi anropar denna lagrade procedur måste vi fortfarande inkludera OUT parameter. Men eftersom vi inte kommer att veta dess värde (trots allt, det är därför vi kallar det - för att ta reda på dess värde!), måste vi använda en variabel. Sedan kan vi använda en SELECT uttalande för att ta reda på dess värde.

Så här:

CALL spCheckFruitStockLevel(1, @stockLevel);
select @stockLevel;

Resultat:

Parameterlägen

Vi använde bara två parameterlägen (IN och OUT ). I MySQL finns det tre parameterlägen som kan användas med lagrade procedurer.

IN
När du använder detta parameterläge måste du (eller din applikation) skicka parameterns värde när du anropar den lagrade proceduren. Dessa parametrar är skyddade. Därför behålls dess ursprungliga värde efter att den lagrade proceduren har utförts. Om den lagrade proceduren ändrar värdet, gör den det endast på en kopia av parametern.

Detta läge är standardläget. Om du inte tillhandahåller parameterläget kommer det att vara IN .

UT
Värdet på en OUT parametern kan ändras inom den lagrade proceduren, och dess värde returneras till den anropande applikationen.
INOUT
Det här läget är en kombination av IN och OUT lägen. Du kan skicka det initiala värdet, den lagrade proceduren kan ändra det och det kommer att returnera det nya värdet till den anropande applikationen.

  1. MySQL Trigger efter uppdatering endast om raden har ändrats

  2. Eftersom du behöver känna till PowerShell

  3. Kan inte INFOGA:FEL:matrisvärdet måste börja med { eller dimensionsinformation

  4. Använder Geekbench 3.2 för att testa stora databasservrar