Mysql
 sql >> Database >  >> RDS >> Mysql

Procedure memorizzate MySQL

MySQL ci offre la possibilità di creare procedure archiviate . Le stored procedure sono una parte importante di MySQL (e di altri sistemi di gestione di database, come SQL Server) e consentono di fare più delle visualizzazioni.

Una procedura memorizzata è una raccolta di istruzioni SQL archiviate nel database. Una procedura memorizzata può contenere logica aziendale, che è uno degli aspetti chiave che distingue le procedure memorizzate dalle viste. Una procedura memorizzata può accettare parametri e puoi impostare variabili, scrivere IF istruzioni, ecc. all'interno di una procedura memorizzata.

Come funzionano le stored procedure?

Prima di tutto, crei la stored procedure. Quindi, una volta creato, puoi eseguirlo (o più precisamente "chiamarlo").

Per eseguire una procedura memorizzata la si "chiama". Quando lo chiami, fornisci anche tutti i parametri che potrebbe richiedere. La procedura memorizzata verrà quindi eseguita, utilizzando i parametri in qualsiasi modo specificato dal codice.

Ad esempio, potresti scrivere una procedura memorizzata che accetta un FruitId parametro. La procedura memorizzata potrebbe quindi prendere quel parametro e usarlo per controllare l'inventario per quel particolare frutto. Pertanto, potresti chiamare la procedura memorizzata, ogni volta con un ID frutta diverso e restituirebbe un valore che ti mostra quanto di quel frutto è in magazzino.

Crea una stored procedure

Le stored procedure vengono create utilizzando CREATE PROCEDURE dichiarazione.

Sintassi

Ecco la sintassi per creare una stored procedure:

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

Sostituisci sp_name con il nome che desideri utilizzare per la procedura memorizzata. Le parentesi sono obbligatorie:racchiudono tutti i parametri. Se non sono richiesti parametri, le parentesi possono essere vuote.

Il corpo principale della procedura memorizzata si trova tra BEGIN e END parole chiave. Queste parole chiave vengono utilizzate per scrivere istruzioni composte. Un'istruzione composta può contenere più istruzioni e queste possono essere nidificate se necessario. Pertanto, puoi annidare BEGIN e END blocchi.

Nella maggior parte dei casi, dovrai racchiudere anche CREATE PROCEDURE istruzione con DELIMITER comandi e cambia END; a END // . In questo modo:

DELIMITER //

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

DELIMITER ;

Ti spiegherò perché presto, ma per ora diamo un'occhiata a un esempio.

Esempio

Ecco un semplice esempio di creazione di una stored procedure. Eseguire il codice seguente sul nostro FruitShop database creerà una procedura memorizzata chiamata 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 ;

Ora possiamo chiamare quella stored procedure in questo modo:

CALL spCheckFruitStock(1);

Qui passiamo un parametro di 1 che è l'ID di Apple .

Ecco il risultato:

Possiamo fare lo stesso per qualsiasi frutto nel nostro database, semplicemente modificando il parametro passato alla stored procedure.

Informazioni sul DELIMITER Comando

Nell'esempio sopra, abbiamo aggiunto un paio di DELIMITER comandi e abbiamo sostituito un punto e virgola con due barre in avanti. Cosa sta succedendo qui?

L'abbiamo fatto per dire a MySQL di utilizzare un delimitatore diverso mentre crea la nostra procedura memorizzata.

Il motivo è che MySQL riconosce già il punto e virgola come delimitatore per contrassegnare la fine di ogni istruzione SQL. Pertanto, non appena MySQL vede il primo punto e virgola, interpreta il delimitatore come tale e la nostra procedura memorizzata si interrompe.

Il DELIMITER Il comando ci consente di dire a MySQL di utilizzare un delimitatore diverso. Nell'esempio precedente lo impostiamo su due barre (// ) ma potrebbe essere qualsiasi cosa (sebbene, evita di usare una barra rovesciata (\ ) poiché questo è il carattere di escape per MySQL). Modificando il delimitatore, MySQL non cercherà di interpretare i nostri punti e virgola come la fine dell'istruzione:aspetterà finché non vedrà le due barre in avanti.

Una volta creata la procedura memorizzata, possiamo utilizzare DELIMITER ; per reimpostare il delimitatore sul punto e virgola.

Eliminazione di una stored procedure

È possibile eliminare una stored procedure utilizzando la DROP PROCEDURE dichiarazione. In questo modo:

DROP PROCEDURE spCheckFruitStock;

Modificare una stored procedure

Puoi modificarne alcuni aspetti di una procedura memorizzata utilizzando ALTER PROCEDURE dichiarazione.

Tuttavia, per modificare il corpo della stored procedure o uno qualsiasi dei suoi parametri, è necessario eliminare la procedura e crearla nuovamente. In questo modo:

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 ;

Qui abbiamo aggiunto Fruit.FruitId all'elenco delle colonne da restituire.

Risultato:

Una procedura archiviata più avanzata

L'esempio precedente era semplice per dimostrare la sintassi della creazione e della chiamata di stored procedure. Diamo un'occhiata a una stored procedure leggermente più complessa:

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 ;

L'esempio precedente accetta due diverse modalità di parametrizzazione (IN e OUT ). IN è l'impostazione predefinita, quindi questo è il motivo per cui l'esempio precedente non includeva la modalità.

Qui impostiamo anche una variabile. Usiamo DECLARE stockNumber SMALLINT per dichiarare una variabile chiamata stockNumber con un tipo di SMALLINT (numero intero piccolo).

Usiamo un SELECT per cercare l'inventario per l'ID frutta fornito e assegnarlo al nostro stockNumber variabile.

Infine, utilizziamo un IF SQL dichiarazione per determinare il livello delle scorte, inserendo questo valore nel pStockLevel parametro (che ovviamente è il OUT parametro — questo è il valore che vedremo quando chiamiamo la procedura memorizzata).

Chiamare una stored procedure con un OUT o INOUT Parametro

Nel nostro ultimo esempio abbiamo specificato due parametri, un IN parametro e un OUT parametro.

Quando chiamiamo questa stored procedure, dobbiamo comunque includere OUT parametro. Tuttavia, poiché non ne conosceremo il valore (dopotutto, ecco perché lo chiamiamo — per scoprirne il valore!), dovremo usare una variabile. Quindi possiamo usare un SELECT dichiarazione per scoprirne il valore.

In questo modo:

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

Risultato:

Modalità parametro

Abbiamo appena usato due modalità parametro (IN e OUT ). In MySQL, ci sono tre modalità di parametro che possono essere utilizzate con le procedure memorizzate.

IN
Quando utilizzi questa modalità parametro, tu (o la tua applicazione) dovete passare il valore del parametro quando chiamate la procedura memorizzata. Questi parametri sono protetti. Pertanto, il suo valore originale viene mantenuto dopo l'esecuzione della stored procedure. Se la procedura memorizzata modifica il valore, lo fa solo su una copia del parametro.

Questa modalità è la modalità predefinita. Se non fornisci la modalità parametro, sarà IN .

FUORI
Il valore di un OUT il parametro può cambiare all'interno della procedura memorizzata e il suo valore viene restituito all'applicazione chiamante.
INOUT
Questa modalità è una combinazione di IN e OUT modalità. Puoi passare il valore iniziale, la procedura memorizzata può modificarlo e restituirà il nuovo valore all'applicazione chiamante.