Nozioni fondamentali sulle funzioni PL/pgSQL
Scriva funzioni PL/pgSQL con parametri, RETURNS TABLE, controllo del flusso (IF, LOOP, FOREACH) e gestione delle eccezioni.
Nozioni fondamentali sulle funzioni PL/pgSQL è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Che cos'è PL/pgSQL?
Il linguaggio procedurale integrato di PostgreSQL. SQL esteso con variabili, flusso di controllo, eccezioni e possibilità di richiamare query dinamicamente. Viene utilizzato per le stored procedure e le funzioni trigger.
Struttura di una funzione
Una funzione semplice:
CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
SELECT add(2, 3); -- 5Variabili
Dichiarare con DECLARE; assegnare con := o INTO:
CREATE FUNCTION user_orders(uid BIGINT)
RETURNS INT AS $$
DECLARE
cnt INT;
BEGIN
SELECT COUNT(*) INTO cnt FROM orders WHERE user_id = uid;
RETURN cnt;
END;
$$ LANGUAGE plpgsql STABLE;Flusso di controllo
IF / ELSE, FOR, WHILE, CASE:
IF cnt = 0 THEN
RAISE NOTICE 'no orders';
ELSIF cnt < 10 THEN
RAISE NOTICE 'few';
ELSE
RAISE NOTICE 'many';
END IF;
FOR i IN 1..10 LOOP
RAISE NOTICE '%', i;
END LOOP;Iterare sui risultati di una query
Iterazione in stile cursore:
CREATE FUNCTION recalc_totals() RETURNS VOID AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT id FROM users LOOP
UPDATE users SET
order_count = (SELECT COUNT(*) FROM orders WHERE user_id = r.id)
WHERE id = r.id;
END LOOP;
END;
$$ LANGUAGE plpgsql;RETURNS TABLE
Restituire un set di risultati:
CREATE FUNCTION top_buyers(n INT)
RETURNS TABLE (user_id BIGINT, total NUMERIC) AS $$
BEGIN
RETURN QUERY
SELECT o.user_id, SUM(o.total)
FROM orders o
GROUP BY o.user_id
ORDER BY SUM(o.total) DESC
LIMIT n;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM top_buyers(10);Parametri IN / OUT / INOUT
Più valori restituiti:
CREATE FUNCTION stats(uid BIGINT,
OUT total NUMERIC,
OUT cnt INT) AS $$
BEGIN
SELECT SUM(total), COUNT(*) INTO total, cnt
FROM orders WHERE user_id = uid;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM stats(42); -- total | cntGestione delle eccezioni
BEGIN ... EXCEPTION WHEN ... THEN:
BEGIN
INSERT INTO users (email) VALUES ($1);
EXCEPTION
WHEN unique_violation THEN
RAISE NOTICE 'email already exists';
WHEN OTHERS THEN
RAISE;
END;RAISE per la registrazione
Livelli: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:
RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';Indicatori di volatilità
Contrassegnare correttamente le funzioni per il planner:
- IMMUTABLE — gli stessi argomenti producono sempre lo stesso risultato (nessun I/O); consente l'inlining e l'uso indicizzabile
- STABLE — gli stessi argomenti producono lo stesso risultato all'interno di una query
- VOLATILE — il risultato può variare a ogni chiamata (predefinito; corretto per NOW() e RANDOM())
SECURITY DEFINER
Viene eseguita con i privilegi del proprietario della funzione: la utilizzi con cautela:
CREATE FUNCTION sensitive_op() RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$ ... $$;
-- Always set search_path explicitly to avoid hijacking:
ALTER FUNCTION sensitive_op() SET search_path = public, pg_temp;Riepilogo
PL/pgSQL estende SQL con cicli, condizioni IF, eccezioni e restituzioni strutturate. Lo utilizzi per una logica coerente in più passaggi che trae vantaggio dall'esecuzione vicino ai dati.
Verifica rapida
Quale indicatore di volatilità dovrebbe utilizzare per una funzione che restituisce sempre lo stesso risultato con gli stessi argomenti, senza effetti collaterali né I/O?
Domande Frequenti
La lezione «Nozioni fondamentali sulle funzioni PL/pgSQL» è gratuita?
Sì — il testo completo di «Nozioni fondamentali sulle funzioni PL/pgSQL» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «Nozioni fondamentali sulle funzioni PL/pgSQL»?
Scriva funzioni PL/pgSQL con parametri, RETURNS TABLE, controllo del flusso (IF, LOOP, FOREACH) e gestione delle eccezioni. Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Nozioni fondamentali sulle funzioni PL/pgSQL»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Anatomia dei trigger: BEFORE/AFTER, FOR EACH ROW
- Nozioni fondamentali sulle funzioni PL/pgSQL
- Blocchi DO e codice anonimo
- Audit delle tabelle con i trigger