header | marp | footer |
---|---|---|
Fondamenti di basi di dati |
true |
Mauro Bogliaccino |
Le Stored Functions (funzioni memorizzate) sono blocchi di codice SQL predefiniti che possono essere richiamati per eseguire calcoli o elaborazioni complesse e restituire un singolo valore. Sono simili alle Stored Procedures, ma con una differenza importante: le funzioni restituiscono sempre un valore e possono essere utilizzate direttamente in query SQL.
- Restituiscono un valore unico: Le Stored Functions sono progettate per restituire un risultato, come un numero, una stringa o una data.
- Riutilizzabili: Una volta definite, possono essere richiamate più volte.
- Integrabili nelle query: Possono essere usate in selezioni (
SELECT
), condizioni (WHERE
,HAVING
), o altri contesti. - Definizione personalizzata: Permettono di creare logiche complesse usando SQL.
CREATE FUNCTION NomeFunzione (parametri)
RETURNS TipoDato
DETERMINISTIC
BEGIN
-- Corpo della funzione
RETURN Valore;
END;
NomeFunzione
: Il nome della funzione.parametri
: I parametri di input (opzionali) con il loro tipo di dato.RETURNS TipoDato
: Specifica il tipo di dato restituito dalla funzione.DETERMINISTIC
/NOT DETERMINISTIC
: Indica se la funzione restituisce sempre lo stesso valore per lo stesso input.RETURN
: Specifica il valore da restituire.
Supponiamo di avere una tabella Prodotti
con una colonna Prezzo
. Creiamo una funzione per calcolare il prezzo con IVA al 22%.
Creazione della funzione:
CREATE FUNCTION CalcolaIVA(Prezzo DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN Prezzo * 1.22;
END;
Uso della funzione:
SELECT Nome, Prezzo, CalcolaIVA(Prezzo) AS PrezzoConIVA
FROM Prodotti;
Tabella: Dipendenti
ID | Nome | SalarioMensile | Bonus |
---|---|---|---|
1 | Mario | 3000 | 200 |
2 | Laura | 4000 | 300 |
Creazione della funzione:
CREATE FUNCTION CalcolaSalarioAnnuale(SalarioMensile DECIMAL(10,2), Bonus DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN (SalarioMensile * 12) + Bonus;
END;
Uso della funzione:
SELECT Nome, CalcolaSalarioAnnuale(SalarioMensile, Bonus) AS SalarioAnnuale
FROM Dipendenti;
Risultato:
Nome | SalarioAnnuale |
---|---|
Mario | 36200 |
Laura | 48300 |
Le Stored Functions possono essere usate in clausole come WHERE
o HAVING
.
Esempio:
Filtrare i prodotti che costano meno di 50€ con IVA.
SELECT Nome, Prezzo, CalcolaIVA(Prezzo) AS PrezzoConIVA
FROM Prodotti
WHERE CalcolaIVA(Prezzo) < 50;
È possibile gestire errori usando controlli condizionali nel corpo della funzione.
Esempio: Funzione con validazione
CREATE FUNCTION CalcolaSconto(Prezzo DECIMAL(10,2), PercentualeSconto DECIMAL(5,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
IF PercentualeSconto < 0 OR PercentualeSconto > 100 THEN
RETURN NULL; -- Percentuale non valida
ELSE
RETURN Prezzo - (Prezzo * PercentualeSconto / 100);
END IF;
END;
Uso della funzione:
SELECT Nome, Prezzo, CalcolaSconto(Prezzo, 20) AS PrezzoScontato
FROM Prodotti;
- Riutilizzabilità: Le funzioni possono essere richiamate ovunque, riducendo la ripetizione di codice.
- Manutenibilità: La logica complessa può essere centralizzata in una funzione, semplificando le query.
- Efficienza: Le Stored Functions sono eseguite lato server, riducendo il carico sul client.
- Non possono eseguire operazioni che modificano i dati (come
INSERT
,UPDATE
, oDELETE
). - In alcuni DBMS, le funzioni possono essere meno efficienti rispetto a query ottimizzate direttamente.
- Devono essere usate con cautela per evitare problemi di performance quando sono applicate a grandi dataset.
- **Definizione di Funzioni
- Una funzione è un blocco di codice che esegue un'operazione specifica e restituisce un valore. Le funzioni nei database possono essere incorporare (come funzioni di aggregazione) o definite dall'utente.
-
**Funzioni Incorporate
- I database relazionali forniscono numerose funzioni incorporate che possono essere utilizzate per eseguire operazioni comuni sui dati. Esempi includono funzioni di aggregazione come SUM, AVG, COUNT e funzioni di manipolazione delle stringhe come CONCAT, SUBSTRING, ecc.
SELECT AVG(Voto) FROM Esami;
Questa query utilizza la funzione AVG per calcolare la media dei voti nella tabella degli esami.
-
**Creazione di Funzioni Definite dall'Utente
- Alcuni database consentono agli utenti di definire le proprie funzioni per eseguire operazioni personalizzate sui dati.
- Esempio di creazione di una funzione in SQL Server:
CREATE FUNCTION CalcolaIva(@prezzo DECIMAL(10, 2)) RETURNS DECIMAL(10, 2) AS BEGIN DECLARE @iva DECIMAL(10, 2); SET @iva = @prezzo * 0.22; RETURN @iva; END;
Questa funzione calcola l'IVA per un dato importo di prezzo.
-
**Chiamata di Funzioni
- Le funzioni possono essere chiamate in una query SQL per eseguire operazioni sui dati. Le funzioni definite dall'utente o le funzioni incorporate possono essere utilizzate in questo modo.
SELECT Nome, CalcolaIva(Prezzo) AS PrezzoIva FROM Prodotti;
Questa query utilizza la funzione CalcolaIva per ottenere il prezzo con l'IVA per ogni prodotto nella tabella Prodotti.
-
**Parametri delle Funzioni
- Le funzioni possono accettare parametri che fungono da input per il calcolo o la manipolazione dei dati.
CREATE FUNCTION ConcatenaNomi(@nome1 VARCHAR(50), @nome2 VARCHAR(50)) RETURNS VARCHAR(100) AS BEGIN DECLARE @nomeCompleto VARCHAR(100); SET @nomeCompleto = @nome1 + ' ' + @nome2; RETURN @nomeCompleto; END;
Questa funzione accetta due nomi come parametri e restituisce il loro concatenamento.
- **Funzioni con Effetti Collaterali
- Le funzioni possono avere o meno effetti collaterali, ovvero modificare o accedere a dati al di fuori della funzione stessa. Le funzioni senza effetti collaterali sono spesso preferite per garantire una progettazione più prevedibile e mantenibile.
-
**Funzioni Aggregate
- Le funzioni aggregate operano su un insieme di valori restituendo un singolo valore aggregato. Esempi comuni includono SUM, AVG, MIN, MAX e COUNT.
SELECT COUNT(*) FROM Ordini;
Questa query utilizza la funzione COUNT per contare il numero totale di ordini nella tabella Ordini.
Le funzioni nei database relazionali sono uno strumento potente per eseguire operazioni specifiche sui dati. La loro corretta progettazione e utilizzo contribuiscono a una gestione efficace e flessibile delle informazioni nel contesto di un sistema di gestione di database.