Come usare le Stored Procedure in MySQL
Categories: MySQL
Tags:
Esattamente come una funzione in qualsiasi linguaggio di programmazione evita di riscrivere più volte le stesse cose, le Stored Procedure sono un ottimo metodo di ripetetere query complicate e parametrizzarle in modo da poterle riutilizzare in qualsiasi momento, e col vantaggio di non lavorare direttamente con stringhe SQL chilometriche.
Per creare una nuova Stored Procedure è necessario avere installato MySQL con versione maggiore o uguale alla 5.0 (le Stored Procedure sono state infatti introdotte proprio nella versione 5.0). Se si utilizza il MySQL Query Browser la creazione è abbastanza immediata:
Clic col tasto destro sul database in cui si vuole creare la procedura (Dalla versione 5.0.1 le Procedure sono assegnate a un Database specifico, nella versione 5.0 invece erano globali)
Inserimento del nome della nuova procedura
Dopo aver cliccato su Create PROCEDURE (la FUNCTION serve per creare un metodo che ritorna sempre un valore), vi troverete davanti a uno stub di procedura simile al seguente:
L’istruzione DELIMITER $$ all’inizio della Procedure servono per fare capire al MySQL che il delimitatore di fine istruzione non è più punto e virgola, altrimenti al primo punto e virgola inserito nel metodo il MySQL interpreterebbe che il nostro blocco di istruzioni è terminato. Alla fine del metodo ovviamente viene ripristinato il punto e virgola come DELIMITER standard.
I parametri che possiamo passare alla funzione sono essenzialmente di due tipi: IN e OUT. Attraverso la parola chiave IN specifichiamo che quel parametro è di lettura, mentre OUT indica che è un parametro che verrà assegnato dalla funzione, e quindi utilizzabile dalla Procedure chiamante. Si può anche settare una variabile come INOUT, in modo da poter essere presa sia come input che come output. Di default tutti i parametri sono IN e nel caso delle Stored Function i parametri sono obbligatoriamente tutti IN.
Un esempio di intestazione di Procedure potrebbe quindi essere il seguente:
CREATE PROCEDURE ContaPartite(IN tipoSport VARCHAR(6), OUT numeroPartite)
Una caratteristica delle Stored Procedure in MySQL è che invocando una SELECT all’interno del metodo, il risultato della SQL verrà ritornata dalla Stored Procedure come se fosse stata questa ad eseguire la query, permettendoci quindi di evitare di utilizzare le variabili OUT:
CREATE PROCEDURE ContaPartite(IN SiglaSport VARCHAR(6)) BEGIN SELECT COUNT(ID) FROM partite_giocate; END $$
Per invocare la Stored Procedure appena creata ci basterà eseguire:
CALL ContaPartite('CALCIO');
L’esempio appena fatto è molto banale e non fa capire pienamente le potenzialità delle Stored Procedure, ma ci si può facilmente rendere conto da soli che se si creano un insieme di Procedure e Function che interagiscono tra di loro, si può ottenere un database SQL con query strutturate in maniera gerarchica facilmente gestibile!
Se sei interessato a questo post, potresti anche provare a leggere:
-
No related posts
15 Feb 2007 dzamir
Ciao, scusa ma la mia domanda non riguarda il tuo post … lo uso solo perchè ULTIMO a livello temporale.
Allora, dico subito che vorrei utilizzare REDOABLE (il tuo template).
Ho scaricato la 1.1 e lo userei con WP 2.1 … purtroppo sia OnLine che in locale se apro un singolo post mi trovo il messaggio: COMMENTS ARE CURRENTLY CLOSED … hai idee? A te non è successo?
Se riesci a postarmi qualche dritta te ne sarei grato, altrimenti … pazienza, ho fatto un tentativo!!!
Ho avuto anche io un paio di problemi con i commenti usando il tema REDOABLE! Nel mio caso invece di mostrarmi “Comments are closed”, mi mostrava SEMPRE i commenti del primo post… ho dovuto modificare il file php manualmente per sistemare questa cosa! Per adesso sono in ufficio e non posso controllare, più tardi ti rispondo e ti dico come ho fatto!
Che cosa sbaglio?
CREATE PROCEDURE `portaledipiserviiformazione`.`stManagePermissionsMinisiti` ()
BEGIN
DECLARE NIDUtente int;
DECLARE id NVARCHAR(10);
SELECT * FROM vw_PermessiMinisiti WHERE IDUTENTE=NIDUtente;
UNION
select TbMinisiti.id AS idServizio, DescrizioneBreve AS DescServizio, NULL AS idSottoServizio, NULL AS descSottoServizio, NIDUtente,
NULL as IDRuolo,’Minisiti.asp?idMinisito=’ + TbMinisiti.id as varchar,
AS PuntamentoServizio, 1 AS ViewServizio, NULL AS PuntamentoSottoServizio, 0 AS ViewSottoServizio,1,0
from tbminisiti
where TbMinisiti.id not in
(select idservizio from vw_PermessiMinisiti where idutente = NIDUtente );
END
Ma che errore ti da, e in che riga???? A vederlo così senza neanche poter provare non capisco dove possa essere l’errore.
Ciao! Come sei riuscito a modificare il CSS di Redoable?
Io ci sto provando da una settimana: se lavoro offline, tutto ok…il tema viene esattamente come lo voglio io…
quando uppo il css sul mio spazio web…niente, un disastro
Puoi aiutarmi?
grazie mille
Se vuoi puoi contattarmi via msn o google talk. Ti faccio avere il contatto via email e vedo se posso aiutarti. Comunque il tema che c’è su questo sito non è più Redoable, ma un altro.
purtroppo, non utilizzo nessun programma per messaggi immediati
Aiutarti dai commenti è un pò difficile e comunque sia già OT da un pezzo
.
Ti avevo mandato un’email, potresti mandarmi il tuo tema di wordpress in modo che posso provare a vedere cosa c’è che non va.
ieri sera ho lavorato sul tema tutta la notte….non capivo dove sbagliassi….
alla fine ci sono arrivata: non avevo disabilitato “style-dynamic.css.php”

mi vergogno da morire
ti ringrazio per l’aiuto che mi hai offerto, sei stato veramente gentile
Sono un principiante nell’uso di MYSQL
Ho redatto una sp del tipo:
create procedure prova(IN s_condition varchar(1000))
begin
select datatable1.*,datatable2.* INNER JOIN datatable2 ON datatable2.TMSTAMP=datatable1.TMSTAMP WHERE s_condition ;
end
la cui chiamata non restituisce alcun record.
L’errore credo sia nel definire la condizione WHERE mediante il parametro in input.
… ma non riesco a capire come risolvere.
Grazie in anticipo, PL