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
eOUT
modalità. Puoi passare il valore iniziale, la procedura memorizzata può modificarlo e restituirà il nuovo valore all'applicazione chiamante.