Introduzione alle stored procedure in MySQL 5

MySQL 5 ha introdotto una pletora di nuove funzionalità: le stored procedure sono tra le più significative. In questo tutorial, ci concentreremo su ciò che sono e su come possono semplificarti la vita.

Se lavori spesso con MySQL, ti consigliamo di controllare la gamma di script di codice MySQL e plugin su Envato Market.


introduzione

? Una routine memorizzata è un insieme di istruzioni SQL che possono essere memorizzate nel server.?

Una stored procedure è un metodo per incapsulare attività ripetitive. Consentono dichiarazioni variabili, controllo del flusso e altre utili tecniche di programmazione.

Il? Accademico? posizione su questo è abbastanza chiaro e supporta l'ampio uso di stored procedure. D'altra parte, quando consideri le opinioni di coloro che lavorano con loro giorno dopo giorno, noterai che le reazioni variano dal supporto completo, incrollabile all'odio totale. Tienilo presente.

Professionisti

  • Condividi la logica con altre applicazioni. Le stored procedure incapsulano la funzionalità; questo garantisce che l'accesso ai dati e la manipolazione siano coerenti tra le diverse applicazioni.
  • Isolato utenti da tabelle di dati. Questo ti dà la possibilità di concedere l'accesso alle stored procedure che manipolano i dati ma non direttamente alle tabelle.
  • Fornire un sicurezza meccanismo. Considerando l'elemento precedente, se è possibile accedere ai dati solo utilizzando le stored procedure definite, nessun altro può eseguire a ELIMINA Dichiarazione SQL e cancella i tuoi dati.
  • A migliorare la prestazione perché riduce il traffico di rete. Con una procedura memorizzata, è possibile combinare più chiamate in una sola.

Contro

  • Carico aumentato sul server del database - la maggior parte del lavoro viene eseguita sul lato server e meno sul lato client.
  • C'è un decente curva di apprendimento. Avrai bisogno di imparare la sintassi delle istruzioni MySQL per scrivere stored procedure.
  • Siete ripetendo la logica della tua applicazione in due posti diversi: il codice del server e il codice delle stored procedure, rendendo le cose un po 'più difficili da mantenere.
  • Migrazione in un altro sistema di gestione del database (DB2, SQL Server, ecc.) potrebbe essere più difficile.

Lo strumento con cui sto lavorando in questo tutorial, MySQL Query Browser, è piuttosto standard per le interazioni tra database. Lo strumento da riga di comando MySQL è un'altra scelta eccellente. Prendo atto di ciò poiché il popolare phpMyAdmin non supporta l'esecuzione della stored procedure.

Inoltre, userò strutture di tavoli molto rudimentali, strettamente per facilitare la spiegazione. Sto mostrando le stored procedure e sono abbastanza complesse senza preoccuparsi dei tavoli grandi.


Passaggio 1: selezionare un delimitatore

Il delimitatore è il carattere o la stringa di caratteri che utilizzerai per dire al client mySQL che hai finito di digitare in un'istruzione SQL. Per anni il delimitatore è sempre stato un punto e virgola. Ciò, tuttavia, causa problemi, perché, in una stored procedure, si possono avere molte istruzioni e ognuna deve terminare con un punto e virgola. In questo tutorial userò? //?


Passaggio 2: come utilizzare una stored procedure

Creazione di una stored procedure

DELIMITER // CREATE PROCEDURE 'p2' () LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER COMMENTA 'Una procedura' INIZIA SELEZIONA 'Hello World!'; FINE//

La prima parte dell'istruzione crea la procedura. Le prossime clausole definiscono le caratteristiche opzionali della procedura. Quindi hai il nome e infine il corpo o il codice di routine.

I nomi delle stored procedure non fanno distinzione tra maiuscole e minuscole e non è possibile creare procedure con lo stesso nome. All'interno di un corpo di una procedura, non è possibile inserire istruzioni di manipolazione del database.

Le quattro caratteristiche di una procedura sono:

  • linguaggio : Per scopi di portabilità; il valore predefinito è SQL.
  • Deterministico : Se la procedura restituisce sempre gli stessi risultati, dato lo stesso input. Questo è per scopi di replica e di registrazione. Il valore predefinito è NON DETERMINISTICO.
  • Sicurezza SQL : Al momento della chiamata, controlla i privilegi dell'utente. INVOKER è l'utente che chiama la procedura. DEFINER è il creatore della procedura. Il valore predefinito è DEFINER.
  • Commento : A scopo di documentazione; il valore predefinito è ""

Chiamare una stored procedure

Per chiamare una procedura, è sufficiente inserire la parola CHIAMATA, seguito dal nome della procedura e quindi dalle parentesi, inclusi tutti i parametri tra loro (variabili o valori). Le parentesi sono obbligatorie.

CALL stored_procedure_name (param1, param2 ,?) CALL procedure1 (10, 'parametro stringa', @parameter_var);

Modifica una stored procedure

MySQL fornisce un ALTER PROCEDURE dichiarazione per modificare una routine, ma consente solo la possibilità di modificare alcune caratteristiche. Se è necessario modificare il corpo oi parametri, è necessario eliminare e ricreare la procedura.

Elimina una stored procedure

PROCEDURA DI CADUTA SE ESISTE p2;

Questo è un comando semplice. Il SE ESISTE la clausola impedisce un errore nel caso in cui la procedura non esiste.


Passaggio 3: parametri

Esaminiamo come è possibile definire i parametri all'interno di una stored procedure.

  • CREATE PROCEDURE proc1 () : La lista dei parametri è vuota
  • CREATE PROCEDURE proc1 (IN varname DATA-TYPE) : Un parametro di input. La parola NEL è facoltativo perché i parametri sono NEL (input) per impostazione predefinita.
  • CREATE PROCEDURE proc1 (OUT varname DATA-TYPE) : Un parametro di uscita.
  • CREATE PROCEDURE proc1 (INOUT varname DATA-TYPE) : Un parametro che è sia input che output.

Naturalmente, puoi definire più parametri definiti con tipi diversi.

Per esempio

 DELIMITER // CREATE PROCEDURE 'proc_IN' (IN var1 INT) BEGIN SELECT var1 + 2 AS result; FINE//

Esempio OUT

DELIMITER // CREATE PROCEDURE 'proc_OUT' (OUT var1 VARCHAR (100)) BEGIN SET var1 = 'Questo è un test'; FINE //

SENZA esempio

DELIMITER // CREATE PROCEDURE 'proc_INOUT' (OUT var1 INT) INIZIO SET var1 = var1 * 2; FINE //

Passaggio 4: variabili

Il seguente passaggio ti insegnerà come definire le variabili e memorizzare i valori all'interno di una procedura. È necessario dichiararli esplicitamente all'inizio del BEGIN / END blocco, insieme ai loro tipi di dati. Una volta che hai dichiarato una variabile, puoi usarla ovunque che tu possa usare una variabile di sessione, o letterale, o nome di colonna.

Dichiarare una variabile usando la seguente sintassi:

DECLARE varname DATA-TYPE DEFAULT valore predefinito;

Dichiariamo alcune variabili:

DICHIARARE a, b INT DEFAULT 5; DECLARE str VARCHAR (50); DICHIARICHI oggi il TIMESTAMP DEFAULT CURRENT_DATE; DECLARE v1, v2, v3 TINYINT;

Lavorare con le variabili

Una volta che le variabili sono state dichiarate, puoi assegnarle i valori usando il IMPOSTATO o SELEZIONARE comando:

DELIMITER // CREATE PROCEDURE 'var_proc' (IN paramstr VARCHAR (20)) INIZIA DECLARE a, b INT DEFAULT 5; DECLARE str VARCHAR (50); DICHIARICHI oggi il TIMESTAMP DEFAULT CURRENT_DATE; DECLARE v1, v2, v3 TINYINT; INSERISCI NELLA tabella 1 VALORI (a); SET str = 'I am a string'; SELEZIONA CONCAT (str, paramstr), oggi FROM table2 WHERE b> = 5; FINE //

Passaggio 5 - Strutture di controllo del flusso

MySQL supporta il SE, CASE, ITERATE, LASCIARE LOOP, MENTRE e RIPETERE costrutti per il controllo del flusso all'interno di programmi memorizzati. Stiamo andando a rivedere come usare SE, ASTUCCIO e MENTRE in particolare, dal momento che sono le dichiarazioni più comunemente usate nelle routine.

SE dichiarazione

Con il SE dichiarazione, siamo in grado di gestire compiti che coinvolgono le condizioni:

DELIMITER // CREATE PROCEDURE 'proc_IF' (IN param1 INT) BEGIN DECLARE variable1 INT; SET variabile1 = param1 + 1; IF variable1 = 0 THEN SELECT variable1; FINISCI SE; IF param1 = 0 THEN SELECT 'Valore parametro = 0'; ELSE SELECT 'Valore parametro <> 0'; FINISCI SE; FINE //

ASTUCCIO dichiarazione

Il ASTUCCIO la dichiarazione è un altro modo per verificare le condizioni e prendere la strada appropriata. È un modo eccellente per sostituire più SE dichiarazioni. La dichiarazione può essere scritta in due modi diversi, offrendo una grande flessibilità per gestire più condizioni.

DELIMITER // CREATE PROCEDURE 'proc_CASE' (IN param1 INT) BEGIN DECLARE variable1 INT; SET variabile1 = param1 + 1; CASE variable1 WHEN 0 THEN INSERT IN table1 VALUES (param1); QUANDO 1 POI INSERISCI NELLA tabella 1 VALORI (variabile1); ELSE INSERISCE NELLA tabella 1 VALORI (99); FINE CASO; FINE //

o:

DELIMITER // CREATE PROCEDURE 'proc_CASE' (IN param1 INT) BEGIN DECLARE variable1 INT; SET variabile1 = param1 + 1; CASE WHEN variable1 = 0 THEN INSERT INTO table1 VALUES (param1); WHEN variable1 = 1 THEN INSERT INTO table1 VALUES (variable1); ELSE INSERISCE NELLA tabella 1 VALORI (99); FINE CASO; FINE //

MENTRE dichiarazione

Ci sono tecnicamente tre circuiti standard: MENTRE loop, CICLO CONTINUO cicli, e RIPETERE loop. Hai anche la possibilità di creare un loop usando il? Darth Vader? di tecniche di programmazione: il VAI A dichiarazione. Guarda questo esempio di un loop in azione:

DELIMITER // CREATE PROCEDURE 'proc_WHILE' (IN param1 INT) BEGIN DECLARE variabile1, variabile2 INT; SET variabile1 = 0; WHILE variabile1 < param1 DO INSERT INTO table1 VALUES (param1); SELECT COUNT(*) INTO variable2 FROM table1; SET variable1 = variable1 + 1; END WHILE; END //

Passaggio 6: cursori

Cursore viene utilizzato per scorrere una serie di righe restituite da una query ed elaborare ogni riga.

MySQL supporta cursore nelle stored procedure. Ecco un riassunto della sintassi essenziale per creare e utilizzare un cursore.

DICHIARARE il nome del cursore CURSOR FOR SELECT? ; / * Dichiara e popola il cursore con un'istruzione SELECT * / DECLARE CONTINUA HANDLER FOR NOT FOUND / * Specifica cosa fare quando non vengono trovati altri record * / OPEN nome-cursore; / * Cursore aperto per l'uso * / FETCH nome-cursore INTO variabile [, variabile]; / * Assegna variabili con i valori della colonna corrente * / CLOSE nome-cursore; / * Chiudi il cursore dopo l'uso * /

In questo esempio, eseguiremo alcune semplici operazioni usando un cursore:

DELIMITER // CREATE PROCEDURE 'proc_CURSOR' (OUT param1 INT) BEGIN DECLARE a, b, c INT; DECLARE cur1 CURSOR FOR SELECT col1 FROM table1; DICHIARARE CONTINUARE HANDLER PER NON TROVATO SET b = 1; OPEN cur1; SET b = 0; SET c = 0; WHILE b = 0 DO FETCH cur1 INTO a; IF b = 0 THEN SET c = c + a; FINISCI SE; FINE MENTRE; CHIUDERE cur1; SET param1 = c; FINE //

Il cursore ha tre proprietà importanti che è necessario conoscere per evitare risultati imprevisti:

  • Asensitive : Una volta aperto, il cursore non rifletterà le modifiche nelle sue tabelle di origine. Infatti, MySQL non garantisce che il cursore venga aggiornato, quindi non puoi fare affidamento su di esso.
  • Sola lettura : I cursori non sono aggiornabili.
  • Non scorrevole : I cursori possono essere attraversati solo in una direzione, in avanti, e non è possibile saltare i record dal recupero.

Conclusione

In questa lezione, abbiamo trattato i fondamenti delle stored procedure e alcune proprietà specifiche ad essi relative. Naturalmente, è necessario continuare gli studi in settori quali sicurezza, istruzioni SQL e prestazioni prima di poter padroneggiare le routine MySQL.

È necessario valutare i vantaggi che le procedure memorizzate possono potenzialmente apportare alle applicazioni e quindi eseguire un'implementazione ragionevole che soddisfi le proprie esigenze. Io generalmente uso le procedure; i loro benefici in termini di sicurezza, manutenzione del codice e progettazione del software li rendono degni di utilizzo, a mio parere. Inoltre, ricorda che le procedure in MySQL sono ancora in corso. Dovresti aspettarti completamente miglioramenti, in termini di funzionalità e prestazioni nel futuro.я

Non esitate a commentare e condividere le vostre idee e opinioni. E dai un'occhiata agli script di codice mySQL e installa Envato Market per vedere se trovi qualcosa che ti possa aiutare.