PostgreSQL non "parla" solo SQL! Ecco a te: PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language), un linguaggio di programmazione procedurale integrato in PostgreSQL. È stato creato per semplificare l'esecuzione di operazioni complesse usando query SQL e strutture di controllo come condizioni (IF, CASE) e cicli (LOOP, FOR, WHILE).
PL/pgSQL e SQL — sono come una linea di montaggio automatizzata e un semplice "strumento manuale" tipo un martello. Come il martello, SQL è uno strumento affidabile. Solo che per ogni colpo devi alzare la mano e farlo manualmente. Invece PL/pgSQL è come una linea di montaggio automatica: imposti una volta cosa e come deve essere fatto, e poi tutto va da solo — esegue i comandi, memorizza, controlla, se qualcosa va storto continua tranquillo. Perché piantare ogni chiodo a mano, se puoi solo guardare come tutto si fa da solo? Non è un sogno?
Confronto tra PL/pgSQL e le normali query SQL
Vediamo in cosa PL/pgSQL è diverso dalle semplici query SQL.
SQL va benissimo quando devi fare una cosa specifica: tipo selezionare tutti gli studenti da una tabella o aggiungere una nuova riga. Ma appena inizi a imbatterti in logiche tipo "se succede questo, allora fai quello" o devi ripetere le stesse azioni, SQL comincia a fare fatica.
Per esempio, immagina che devi:
- Controllare se esiste già una riga per uno studente nella tabella.
- Se la riga esiste — aggiornare i dati.
- Se la riga non esiste — aggiungere una nuova riga.
Con il semplice SQL dovresti scrivere più query e gestire il risultato lato client. Con PL/pgSQL puoi mettere tutto in una procedura che gira direttamente nel database.
PL/pgSQL dà il meglio di sé nei progetti più complessi. Ti permette di:
- salvare risultati intermedi in variabili;
- gestire gli errori così il database non "crasha" quando succede qualcosa di strano;
- usare cicli e condizioni per eseguire algoritmi complessi.
Dove si usa PL/pgSQL
PL/pgSQL si usa spesso in questi scenari:
Automatizzazione dei task. Per esempio, la creazione automatica di righe nel log (
log) ogni volta che aggiorni i dati.Business logic. Hai una regola: ogni studente con più di 5 assenze deve essere segnato automaticamente come "non attivo". Perché non mettere questa regola in una funzione PL/pgSQL?
Analisi e report. Invece di spostare i dati avanti e indietro tra database e applicazione client, puoi aggregarli direttamente lato server.
Trigger. PL/pgSQL viene usato per scrivere trigger che eseguono azioni automatiche quando inserisci, aggiorni o cancelli dati.
Esempio di utilizzo di PL/pgSQL
Ecco un esempio di funzione che prende due numeri, li somma e restituisce il risultato:
CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
Spiegazione:
CREATE FUNCTION add_numbers(a INT, b INT)— stiamo creando una funzione chiamataadd_numbersche prende due argomenti di tipoINT(numero intero).RETURNS INT— indica che la funzione restituisce un intero.BEGIN ... END— questo è il blocco principale dove gira la logica della funzione.RETURN a + b;— il risultato della somma viene restituito.
Per chiamare questa funzione, usa una normale query SQL:
SELECT add_numbers(10, 20);
Risultato: 30.
Trappole e limiti
PL/pgSQL è uno strumento potente, ma va usato con attenzione:
- Performance: funzioni troppo complesse possono rallentare il database. Testa e ottimizza sempre.
- Testing: gli errori nelle funzioni possono non vedersi finché non le chiami. Non dimenticare i test!
- Leggibilità: funzioni e procedure grosse con logica complicata possono essere difficili da capire. Scrivi codice che capirai anche tra un mese.
Ora che hai già un'idea di cosa sia PL/pgSQL, parliamo ancora della sua sintassi e delle sue funzioni base. Impareremo a creare blocchi di codice, dichiarare variabili e lavorare con i tipi di dati nelle prossime lezioni. Avanti con la programmazione lato database!
GO TO FULL VERSION