際際滷

際際滷Share a Scribd company logo
SQL STORED PROCEDURES
+ STORED FUNCTIONS
MySQL 5.5
MYSQL E LE STORED PROCEDURES
 Una frase che una volta si sentiva spesso.
Bello MySQL! Peccato che non supporti le stored procedures Se ce le avesse lo userei anchio.
 Ma cosa sono le stored procedure? E perch辿 tanti ne sentivano la mancanza?
 Un esempio pratico collegato al database World, predefinito in MySQL.
DELIMITER //
CREATE PROCEDURE NumCitt (IN Lingua CHAR(30), OUT NumC
INTEGER)
BEGIN
SELECT COUNT(*) INTO NumC
FROM countrylanguage AS Cl, country AS Cn, City AS Cy
WHERE Cl.CountryCode = Cn.Code
AND Cy.CountryCode = Cn.Code
AND Cl.Language = Lingua;
END; //
DELIMITER ;
MYSQL E LE STORED PROCEDURES
 Le istruzioni della slide precedente creano un procedura per la
base di dati World.
 Questa procedura, una volta creata, pu嘆 essere richiamata in
qualsiasi momento dal prompt dei comandi, attualizzando i suoi
parametri.
 Es.
CALL NumCitt(Inglese,@Num);
SELECT @Num AS Citt_Inglese;
 In questo modo le istruzioni della Stored Procedure NumCitt
vengono eseguite assegnando al parametro di ingresso Lingua il
valore Inglese.
 Il risultato dellesecuzione viene reso disponibile nella variabile
@Num.
MYSQL E LE STORED PROCEDURES
 Esaminiamo pi湛 nel dettaglio lesempio appena
proposto.
 DELIMITER //
 Questa istruzione modifica lindicatore di fine istruzione per
MySQL.
 Di default il delimitatore 竪 il carattere ;.
 Allinterno di una stored procedure per嘆 sono presenti pi湛
istruzioni, quindi perch辿 MySQL interpreti correttamente
listruzione CREATE PROCEDURE occorre cambiare il
delimitatore.
 Nel nostro caso si sceglie la combinazione //, ma
avremmo potuto scegliere qualsiasi altra combinazione di
caratteri
 Al termine della stored procedure si ripristina il delimitatore
standard con listruzione:
 DELIMITER ;
MYSQL E LE STORED PROCEDURES
 CREATE PROCEDURE NumCitt (IN Lingua
CHAR(30), OUT NumC INTEGER)
 Lintestazione della procedura consente di definire alcune
caratteristiche essenziali:
 Nome della procedura
Il nome della procedura servir per richiamare la procedura stessa
dal prompt dei comandi di MySQL.
 Elenco dei parametri
I parametri indicano le informazioni che occorre fornire alla
procedura affinch辿 questa possa essere eseguita, e quelle che la
procedura fornir come risultato.
 IN parametri di ingresso
 OUT parametri di uscita
 INOUT parametri bidirezionali
 Nel nostro caso la procedura riceve in ingresso una stringa
Lingua e produce in uscita un numero intero NumC.
MYSQL E LE STORED PROCEDURES
 BEGIN
...
END; //
 Le due parole chiave BEGIN e END racchiudono il
corpo della funzione.
 Come si vede listruzione CREATE PROCEDURE
termina con il delimitatore //
 Il delimitatore ; invece indica il termine di ogni
istruzione allinterno del corpo della procedura e il
termine del blocco BEGIN  END (non il termine
dellistruzione CREATE)
MYSQL E LE STORED PROCEDURES
 SELECT COUNT(*) INTO NumC
FROM countrylanguage AS Cl, country AS
Cn, City AS Cy
WHERE Cl.CountryCode = Cn.Code
AND Cy.CountryCode = Cn.Code
AND Cl.Language = Lingua;
 Si tratta come si vede di una query normale
 Ci sono per嘆 due particolari importanti:
 Il risultato della SELECT viene memorizzato nel
parametro di uscita NumC
 Il valore di Cl.Language viene ricavato dal parametro
di ingresso Lingua
 In sostanza questa query determina in quante citt si
parla una certa lingua
MYSQL E LE STORED PROCEDURES
 CALL NumCitt(Inglese,@Num);
 Con questa sintassi viene eseguita dal prompt dei
comandi di MySQL la procedura NumCitt
 Al parametro lingua viene assegnato il valore
Inglese
 Il risultato della query viene memorizzato nella variabile
@Num
 SELECT @Num AS Citt_Inglese;
 Il valore della variabile @Num viene infine visualizzato
col nome Citt_Inglese.
VARIABILI IN MYSQL
 MySQL consente di memorizzare un valore in una
variabile definita dallutente
 Il valore pu嘆 cos狸 essere utilizzato da istruzioni
successive a quelle in cui 竪 stato assegnato alla
variabile
 Le variabili sono associate alla connessione in cui
vengono create
 Una variabile definita da un client non viene vista da un altro
client
 Al termine della connessione vengono tutte eliminate
 Nomi delle variabili
 Iniziano con @
 Possono contenere lettere e numeri
 Possono contenere i caratteri ., _ e $
VARIABILI IN MYSQL
 Assegnamento di un valore a una variabile
 SET @var_name = expr [, @var_name = expr] ...
 Si pu嘆 utilizzare anche il simbolo :=
 SET @t1=1, @t2=2, @t3:=4;
SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;
+------+------+------+--------------------+
| @t1 | @t2 | @t3 | @t4 := @t1+@t2+@t3 |
+------+------+------+--------------------+
| 1 | 2 | 4 | 7 |
+------+------+------+--------------------+
 Allinterno della SELECT 竪 obbligatorio utilizzare il simbolo :=
 Non si deve mai assegnare un valore a una variabile e utilizzarlo
allinterno della stessa istruzione
 MySQL non garantisce il risultato
 Possono verificarsi effetti indesiderati
VARIABILI IN MYSQL
 A una variabile si possono assegnare solo i seguenti tipi di dato
 Numeri interi (INTEGER)
 Numeri con a virgola fissa (DECIMAL)
 Numeri a virgola mobile (FLOAT, DOUBLE)
 Stringhe di caratteri
 NULL
 Tutti i tipi non ammessi vengono convertiti nei tipi ammessi
 La conversione pu嘆 essere forzata con listruzione CAST
SET @v1 = b'1000001';
SET @v2 = CAST(b'1000001' AS UNSIGNED), @v3 = b'1000001'+0;
SELECT @v1, @v2, @v3;
+------+------+------+
| @v1 | @v2 | @v3 |
+------+------+------+
| A | 65 | 65 |
+------+------+------+
VARIABILI IN MYSQL
 Le variabili trovano il loro utilizzo nelle espressioni allinterno
delle query
 Es.
SET @var = 15;
SELECT *
FROM Table AS T
WHERE T.Campo = @var;
 Non possono essere utilizzate negli identificatori di campi e
tabelle, o al posto di parole chiave
 Es. (non valido)
SET @var1 = Table;
SET @var2 = SELECT
@var2 *
FROM @var1 AS T
WHERE T.Campo = 15;
VARIABILI IN MYSQL
 C竪 una sola eccezione a questa regola
 Si costruisce una query in una variabile stringa con listruzione PREPARE
 La si esegue con listruzione EXECUTE
 Es.
SET @c = "c1";
SET @s = CONCAT("SELECT ", @c, " FROM t");
PREPARE stmt FROM @s;
EXECUTE stmt;
+----+
| c1 |
+----+
| 0 |
+----+
| 1 |
+----+
2 rows in set (0.00 sec)
DEALLOCATE PREPARE stmt;
SINTASSI DI UNA STORED PROCEDURE
 La sintassi generale di una stored procedure 竪 la
seguente.
CREATE PROCEDURE nome ([<parametro>[,...]])
[SQL SECURITY { DEFINER | INVOKER }]
BEGIN
<istruzioni>
END; //
 La sintassi di ciascun parametro 竪 invece la seguente:
 [ IN | OUT | INOUT ] <nome> <tipo>
DICHIARAZIONE DI VARIABILI
 Allinterno di una stored procedure 竪 possibile
dichiarare variabili
 DECLARE <nome> <tipo> [DEFAULT <valore>];
 Si pu嘆 assegnare valori alle variabili in due modi
 SELECT <campo> INTO <variabile>
FROM ... ;
 SET <variabile> = <espressione>;
 Un particolare tipo di variabile sono i CURSORI
 DECLARE <nome> CURSOR FOR <query> ;
LE VARIABILI CURSORI
 Una variabile cursore serve per scorrere il risultato di una query caricandone i
record progressivamente allinterno di opportune variabili
DECLARE a INT;
DECLARE b CHAR(50);
DECLARE cur CURSOR FOR
SELECT id, nome
FROM clienti
WHERE cat = <parametro>;
OPEN cur;
FETCH cur INTO a, b;
CLOSE cur;
 Quando viene aperto, il cursore si posiziona sulla prima tupla del risultato della
query
 Ogni volta che si effettua un FETCH, la tupla viene caricata nelle variabili
specificate dopo la parola chiave INTO.
 La chiusura del cursore non 竪 obbligatoria. MySQL chiude automaticamente i
cursori al termine di una procedura.
LA STRUTTURA IF  THEN  ELSE
  possibile utilizzare una semplice struttura di
selezione
 La sintassi 竪 la seguente
IF <condizione> THEN
<istruzioni>
ELSE
<istruzioni>
END IF;
 Come sempre la parte ELSE 竪 facoltativa
LA STRUTTURA DI ITERAZIONE LOOP
 Si tratta di un semplice costrutto per cicli illimitati
 Sintassi:
<etichetta>: LOOP
<istruzioni>
END LOOP <etichetta>;
 Per uscire dal ciclo:
LEAVE <etichetta>;
 Per passare alliterazione successiva:
ITERATE <etichetta>;
LA STRUTTURA DI ITERAZIONE LOOP
 Es.
DELIMITER //
CREATE PROCEDURE SommaInt(IN p1 INT, OUT Sum INT)
BEGIN
DECLARE i INT;
SET Sum = 0;
SET i = 0;
label1: LOOP
SET i = i + 1;
SET Sum = Sum + i;
IF i < p1 THEN
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
END; //
DELIMITER ;
LA STRUTTURA DI ITERAZIONE REPEAT
 Si tratta di un semplice costrutto per cicli limitati
 Sintassi:
<etichetta>: REPEAT
<istruzioni>
UNTIL <condizione>
END REPEAT <etichetta>;
 Il ciclo si interrompe quando la condizione diventa vera
per la prima volta
 La condizione viene valutata al termine di ogni
iterazione
LA STRUTTURA DI ITERAZIONE REPEAT
 Es.
DELIMITER //
CREATE PROCEDURE SommaInt(IN p1 INT, OUT Sum INT)
BEGIN
DECLARE n INT;
SET n = 0;
SET Sum = 0;
REPEAT
SET n = n + 1;
SET Sum = Sum + n;
UNTIL n = p1
END REPEAT;
END; //
CALL SommaInt(10,@Somma) //
SELECT @Somma //
+------+
| @x |
+------+
| 55 |
+------+
1 row in set (0.00 sec)
LA STRUTTURA DI ITERAZIONE WHILE
 Si tratta di un semplice costrutto per cicli limitati
 Sintassi:
<etichetta>: WHILE <condizione> DO
<istruzioni>
END WHILE <etichetta>;
 Il ciclo si interrompe quando la condizione diventa
falsa per la prima volta
 La condizione viene valutata prima di ogni
iterazione
LA STRUTTURA DI ITERAZIONE WHILE
 Es.
DELIMITER //
CREATE PROCEDURE SommaInt(IN p1 INT, OUT Sum
INT)
BEGIN
DECLARE i INT;
SET Sum = 0;
SET i = 0;
label1: WHILE i <= p1 DO
SET i = i + 1;
SET Sum = Sum + i;
END WHILE label1;
END; //
DELIMITER ;
DICHIARAZIONE DI HANDLER
 Handler: gruppo di istruzioni da eseguire al verificarsi di
particolari condizioni durante lesecuzione di una procedura
 Sintassi:
DECLARE <azione> HANDLER
FOR <condizione1> [, <condizione2>] ...
<istruzioni>;
 Azioni
 EXIT Termina la procedura
 CONTINUE Continua lesecuzione
 Condizioni
 <codice_errore_MySQL>
 SQLSTATE [VALUE] <valore>
 SQLWARNING
 NOT FOUND
 SQLEXCEPTION
CONDIZIONI PER GLI HANDLER
 <codice_errore_MySQL> e SQLSTATE
 Elenco dei codici di errore e SQLSTATE di MySQL
 SQLWARNING
 Tutti i codici di errore che cominciano per 01
 NOT FOUND
 Tutti i codici di errore che cominciano per 02
 SQLEXCEPTION
 Tutti i codici di errore che NON cominciano per 00, 01, 02
 I codici che cominciano con 00 non indicano un errore ma
lesecuzione corretta di unoperazione, e quindi non
andrebbero mai utilizzati in un Handler
STORED FUNCTIONS
 Simili alle Stored Procedures ma pi湛 semplici
 Restituiscono un dato semplice
 Non possono restituire un insieme di tuple
 Esempi di Stored Functions predefinite sono le funzioni di aggregazione
 Sintassi:
CREATE FUNCTION <nome>([<parametro>[,...]])
RETURNS <tipo>
[SQL SECURITY { DEFINER | INVOKER }]
BEGIN
<istruzioni>
END;
 Parametri
<parametro> <tipo>
SQL SECURITY
 Per eseguire una qualsiasi istruzione su una base di dati
竪 necessario che lutente possieda i privilegi necessari
 Per esempio non 竪 detto che un utente abbia il permesso di
inserire tuple in una tabella, oppure di cancellarle
 La clausola SQL SECURITY permette di specificare chi
deve possedere i privilegi necessari a eseguire tutte le
istruzioni contenute in una stored procedure
 DEFINER Chi ha creato la procedura deve
possedere i permessi necessari a eseguirla
 INVOKER Chi invoca la procedura deve possedere i
permessi necessari a eseguirla

More Related Content

Sql stored procedures

  • 1. SQL STORED PROCEDURES + STORED FUNCTIONS MySQL 5.5
  • 2. MYSQL E LE STORED PROCEDURES Una frase che una volta si sentiva spesso. Bello MySQL! Peccato che non supporti le stored procedures Se ce le avesse lo userei anchio. Ma cosa sono le stored procedure? E perch辿 tanti ne sentivano la mancanza? Un esempio pratico collegato al database World, predefinito in MySQL. DELIMITER // CREATE PROCEDURE NumCitt (IN Lingua CHAR(30), OUT NumC INTEGER) BEGIN SELECT COUNT(*) INTO NumC FROM countrylanguage AS Cl, country AS Cn, City AS Cy WHERE Cl.CountryCode = Cn.Code AND Cy.CountryCode = Cn.Code AND Cl.Language = Lingua; END; // DELIMITER ;
  • 3. MYSQL E LE STORED PROCEDURES Le istruzioni della slide precedente creano un procedura per la base di dati World. Questa procedura, una volta creata, pu嘆 essere richiamata in qualsiasi momento dal prompt dei comandi, attualizzando i suoi parametri. Es. CALL NumCitt(Inglese,@Num); SELECT @Num AS Citt_Inglese; In questo modo le istruzioni della Stored Procedure NumCitt vengono eseguite assegnando al parametro di ingresso Lingua il valore Inglese. Il risultato dellesecuzione viene reso disponibile nella variabile @Num.
  • 4. MYSQL E LE STORED PROCEDURES Esaminiamo pi湛 nel dettaglio lesempio appena proposto. DELIMITER // Questa istruzione modifica lindicatore di fine istruzione per MySQL. Di default il delimitatore 竪 il carattere ;. Allinterno di una stored procedure per嘆 sono presenti pi湛 istruzioni, quindi perch辿 MySQL interpreti correttamente listruzione CREATE PROCEDURE occorre cambiare il delimitatore. Nel nostro caso si sceglie la combinazione //, ma avremmo potuto scegliere qualsiasi altra combinazione di caratteri Al termine della stored procedure si ripristina il delimitatore standard con listruzione: DELIMITER ;
  • 5. MYSQL E LE STORED PROCEDURES CREATE PROCEDURE NumCitt (IN Lingua CHAR(30), OUT NumC INTEGER) Lintestazione della procedura consente di definire alcune caratteristiche essenziali: Nome della procedura Il nome della procedura servir per richiamare la procedura stessa dal prompt dei comandi di MySQL. Elenco dei parametri I parametri indicano le informazioni che occorre fornire alla procedura affinch辿 questa possa essere eseguita, e quelle che la procedura fornir come risultato. IN parametri di ingresso OUT parametri di uscita INOUT parametri bidirezionali Nel nostro caso la procedura riceve in ingresso una stringa Lingua e produce in uscita un numero intero NumC.
  • 6. MYSQL E LE STORED PROCEDURES BEGIN ... END; // Le due parole chiave BEGIN e END racchiudono il corpo della funzione. Come si vede listruzione CREATE PROCEDURE termina con il delimitatore // Il delimitatore ; invece indica il termine di ogni istruzione allinterno del corpo della procedura e il termine del blocco BEGIN END (non il termine dellistruzione CREATE)
  • 7. MYSQL E LE STORED PROCEDURES SELECT COUNT(*) INTO NumC FROM countrylanguage AS Cl, country AS Cn, City AS Cy WHERE Cl.CountryCode = Cn.Code AND Cy.CountryCode = Cn.Code AND Cl.Language = Lingua; Si tratta come si vede di una query normale Ci sono per嘆 due particolari importanti: Il risultato della SELECT viene memorizzato nel parametro di uscita NumC Il valore di Cl.Language viene ricavato dal parametro di ingresso Lingua In sostanza questa query determina in quante citt si parla una certa lingua
  • 8. MYSQL E LE STORED PROCEDURES CALL NumCitt(Inglese,@Num); Con questa sintassi viene eseguita dal prompt dei comandi di MySQL la procedura NumCitt Al parametro lingua viene assegnato il valore Inglese Il risultato della query viene memorizzato nella variabile @Num SELECT @Num AS Citt_Inglese; Il valore della variabile @Num viene infine visualizzato col nome Citt_Inglese.
  • 9. VARIABILI IN MYSQL MySQL consente di memorizzare un valore in una variabile definita dallutente Il valore pu嘆 cos狸 essere utilizzato da istruzioni successive a quelle in cui 竪 stato assegnato alla variabile Le variabili sono associate alla connessione in cui vengono create Una variabile definita da un client non viene vista da un altro client Al termine della connessione vengono tutte eliminate Nomi delle variabili Iniziano con @ Possono contenere lettere e numeri Possono contenere i caratteri ., _ e $
  • 10. VARIABILI IN MYSQL Assegnamento di un valore a una variabile SET @var_name = expr [, @var_name = expr] ... Si pu嘆 utilizzare anche il simbolo := SET @t1=1, @t2=2, @t3:=4; SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3; +------+------+------+--------------------+ | @t1 | @t2 | @t3 | @t4 := @t1+@t2+@t3 | +------+------+------+--------------------+ | 1 | 2 | 4 | 7 | +------+------+------+--------------------+ Allinterno della SELECT 竪 obbligatorio utilizzare il simbolo := Non si deve mai assegnare un valore a una variabile e utilizzarlo allinterno della stessa istruzione MySQL non garantisce il risultato Possono verificarsi effetti indesiderati
  • 11. VARIABILI IN MYSQL A una variabile si possono assegnare solo i seguenti tipi di dato Numeri interi (INTEGER) Numeri con a virgola fissa (DECIMAL) Numeri a virgola mobile (FLOAT, DOUBLE) Stringhe di caratteri NULL Tutti i tipi non ammessi vengono convertiti nei tipi ammessi La conversione pu嘆 essere forzata con listruzione CAST SET @v1 = b'1000001'; SET @v2 = CAST(b'1000001' AS UNSIGNED), @v3 = b'1000001'+0; SELECT @v1, @v2, @v3; +------+------+------+ | @v1 | @v2 | @v3 | +------+------+------+ | A | 65 | 65 | +------+------+------+
  • 12. VARIABILI IN MYSQL Le variabili trovano il loro utilizzo nelle espressioni allinterno delle query Es. SET @var = 15; SELECT * FROM Table AS T WHERE T.Campo = @var; Non possono essere utilizzate negli identificatori di campi e tabelle, o al posto di parole chiave Es. (non valido) SET @var1 = Table; SET @var2 = SELECT @var2 * FROM @var1 AS T WHERE T.Campo = 15;
  • 13. VARIABILI IN MYSQL C竪 una sola eccezione a questa regola Si costruisce una query in una variabile stringa con listruzione PREPARE La si esegue con listruzione EXECUTE Es. SET @c = "c1"; SET @s = CONCAT("SELECT ", @c, " FROM t"); PREPARE stmt FROM @s; EXECUTE stmt; +----+ | c1 | +----+ | 0 | +----+ | 1 | +----+ 2 rows in set (0.00 sec) DEALLOCATE PREPARE stmt;
  • 14. SINTASSI DI UNA STORED PROCEDURE La sintassi generale di una stored procedure 竪 la seguente. CREATE PROCEDURE nome ([<parametro>[,...]]) [SQL SECURITY { DEFINER | INVOKER }] BEGIN <istruzioni> END; // La sintassi di ciascun parametro 竪 invece la seguente: [ IN | OUT | INOUT ] <nome> <tipo>
  • 15. DICHIARAZIONE DI VARIABILI Allinterno di una stored procedure 竪 possibile dichiarare variabili DECLARE <nome> <tipo> [DEFAULT <valore>]; Si pu嘆 assegnare valori alle variabili in due modi SELECT <campo> INTO <variabile> FROM ... ; SET <variabile> = <espressione>; Un particolare tipo di variabile sono i CURSORI DECLARE <nome> CURSOR FOR <query> ;
  • 16. LE VARIABILI CURSORI Una variabile cursore serve per scorrere il risultato di una query caricandone i record progressivamente allinterno di opportune variabili DECLARE a INT; DECLARE b CHAR(50); DECLARE cur CURSOR FOR SELECT id, nome FROM clienti WHERE cat = <parametro>; OPEN cur; FETCH cur INTO a, b; CLOSE cur; Quando viene aperto, il cursore si posiziona sulla prima tupla del risultato della query Ogni volta che si effettua un FETCH, la tupla viene caricata nelle variabili specificate dopo la parola chiave INTO. La chiusura del cursore non 竪 obbligatoria. MySQL chiude automaticamente i cursori al termine di una procedura.
  • 17. LA STRUTTURA IF THEN ELSE possibile utilizzare una semplice struttura di selezione La sintassi 竪 la seguente IF <condizione> THEN <istruzioni> ELSE <istruzioni> END IF; Come sempre la parte ELSE 竪 facoltativa
  • 18. LA STRUTTURA DI ITERAZIONE LOOP Si tratta di un semplice costrutto per cicli illimitati Sintassi: <etichetta>: LOOP <istruzioni> END LOOP <etichetta>; Per uscire dal ciclo: LEAVE <etichetta>; Per passare alliterazione successiva: ITERATE <etichetta>;
  • 19. LA STRUTTURA DI ITERAZIONE LOOP Es. DELIMITER // CREATE PROCEDURE SommaInt(IN p1 INT, OUT Sum INT) BEGIN DECLARE i INT; SET Sum = 0; SET i = 0; label1: LOOP SET i = i + 1; SET Sum = Sum + i; IF i < p1 THEN ITERATE label1; END IF; LEAVE label1; END LOOP label1; END; // DELIMITER ;
  • 20. LA STRUTTURA DI ITERAZIONE REPEAT Si tratta di un semplice costrutto per cicli limitati Sintassi: <etichetta>: REPEAT <istruzioni> UNTIL <condizione> END REPEAT <etichetta>; Il ciclo si interrompe quando la condizione diventa vera per la prima volta La condizione viene valutata al termine di ogni iterazione
  • 21. LA STRUTTURA DI ITERAZIONE REPEAT Es. DELIMITER // CREATE PROCEDURE SommaInt(IN p1 INT, OUT Sum INT) BEGIN DECLARE n INT; SET n = 0; SET Sum = 0; REPEAT SET n = n + 1; SET Sum = Sum + n; UNTIL n = p1 END REPEAT; END; // CALL SommaInt(10,@Somma) // SELECT @Somma // +------+ | @x | +------+ | 55 | +------+ 1 row in set (0.00 sec)
  • 22. LA STRUTTURA DI ITERAZIONE WHILE Si tratta di un semplice costrutto per cicli limitati Sintassi: <etichetta>: WHILE <condizione> DO <istruzioni> END WHILE <etichetta>; Il ciclo si interrompe quando la condizione diventa falsa per la prima volta La condizione viene valutata prima di ogni iterazione
  • 23. LA STRUTTURA DI ITERAZIONE WHILE Es. DELIMITER // CREATE PROCEDURE SommaInt(IN p1 INT, OUT Sum INT) BEGIN DECLARE i INT; SET Sum = 0; SET i = 0; label1: WHILE i <= p1 DO SET i = i + 1; SET Sum = Sum + i; END WHILE label1; END; // DELIMITER ;
  • 24. DICHIARAZIONE DI HANDLER Handler: gruppo di istruzioni da eseguire al verificarsi di particolari condizioni durante lesecuzione di una procedura Sintassi: DECLARE <azione> HANDLER FOR <condizione1> [, <condizione2>] ... <istruzioni>; Azioni EXIT Termina la procedura CONTINUE Continua lesecuzione Condizioni <codice_errore_MySQL> SQLSTATE [VALUE] <valore> SQLWARNING NOT FOUND SQLEXCEPTION
  • 25. CONDIZIONI PER GLI HANDLER <codice_errore_MySQL> e SQLSTATE Elenco dei codici di errore e SQLSTATE di MySQL SQLWARNING Tutti i codici di errore che cominciano per 01 NOT FOUND Tutti i codici di errore che cominciano per 02 SQLEXCEPTION Tutti i codici di errore che NON cominciano per 00, 01, 02 I codici che cominciano con 00 non indicano un errore ma lesecuzione corretta di unoperazione, e quindi non andrebbero mai utilizzati in un Handler
  • 26. STORED FUNCTIONS Simili alle Stored Procedures ma pi湛 semplici Restituiscono un dato semplice Non possono restituire un insieme di tuple Esempi di Stored Functions predefinite sono le funzioni di aggregazione Sintassi: CREATE FUNCTION <nome>([<parametro>[,...]]) RETURNS <tipo> [SQL SECURITY { DEFINER | INVOKER }] BEGIN <istruzioni> END; Parametri <parametro> <tipo>
  • 27. SQL SECURITY Per eseguire una qualsiasi istruzione su una base di dati 竪 necessario che lutente possieda i privilegi necessari Per esempio non 竪 detto che un utente abbia il permesso di inserire tuple in una tabella, oppure di cancellarle La clausola SQL SECURITY permette di specificare chi deve possedere i privilegi necessari a eseguire tutte le istruzioni contenute in una stored procedure DEFINER Chi ha creato la procedura deve possedere i permessi necessari a eseguirla INVOKER Chi invoca la procedura deve possedere i permessi necessari a eseguirla