CodeGym /Corsi /SQL SELF /Differenze tra funzioni e procedure

Differenze tra funzioni e procedure

SQL SELF
Livello 51 , Lezione 4
Disponibile

In molti linguaggi di programmazione tra funzioni e procedure non c'è quasi differenza. In SQL invece sì. In PostgreSQL funzioni e procedure non sono solo due modi diversi di lanciare codice. Sono paradigmi di pensiero diversi.

Una funzione in SQL non può modificare i dati nel database. Deve lavorare solo con i dati passati e restituire un risultato basato su di essi. È fatta per essere usata dentro le query SELECT.

Una procedura in SQL è fatta per modificare il database. Quindi può lavorare con le transazioni (a differenza delle funzioni), scrivere roba nel db. E non può essere usata dentro le query SELECT.

Ecco un confronto veloce:

Caratteristica Funzione (FUNCTION) Procedura (PROCEDURE)
Restituisce dati ✅ Sì (RETURNS ...) ❌ No (può solo fare azioni)
Si chiama tramite SELECT, PERFORM CALL
Si può usare nelle query ✅ Sì ❌ No
Può essere in DO ✅ Sì ❌ No
Supporta COMMIT, ROLLBACK ❌ No ✅ Sì
Introdotte in PostgreSQL Dall'inizio Dalla versione 11

Differenze in SQL

Nel SQL normale, una funzione è come un'espressione: calcola e restituisce un valore. Una procedura è un comando: fa qualcosa, ma non partecipa nelle espressioni.

Funzione in SQL

SELECT calculate_discount(200);
  • Può essere usata in WHERE, ORDER BY, INSERT, UPDATE ecc.
  • Deve essere pura: non deve cambiare lo stato del db (se IMMUTABLE/STABLE).

Procedura in SQL

CALL process_order(123);
  • Non restituisce risultato.
  • Può fare COMMIT, ROLLBACK, chiamare RAISE, lanciare cicli.

Differenze in PL/pgSQL

Le funzioni in PostgreSQL si possono vedere come un gruppo di calcoli. Sono molto flessibili: puoi passare parametri, usare if, cicli, cursori, subquery, restituire righe, scalari, tabelle.

Funzioni in PL/pgSQL

CREATE FUNCTION square(x INT) RETURNS INT AS $$
BEGIN
    RETURN x * x;
END;
$$ LANGUAGE plpgsql;

Caratteristiche:

  • RETURNS obbligatorio
  • Può usare DECLARE, BEGIN, END, LOOP, IF, CASE
  • Non si può fare COMMIT/ROLLBACK
  • Si può chiamare in SELECT, UPDATE, CHECK, WHERE, RETURNING

Chiamata:

SELECT square(5);  -- restituirà 25

Procedure in PL/pgSQL

Le procedure sono un meccanismo di gestione delle azioni. Sono perfette quando devi:

  • fare tanti step con logica;
  • aggiornare e inserire grandi quantità di dati;
  • usare gestione delle transazioni: COMMIT, ROLLBACK, SAVEPOINT.
CREATE PROCEDURE log_event(msg TEXT) AS $$
BEGIN
    INSERT INTO logs(message) VALUES (msg);
    COMMIT;
END;
$$ LANGUAGE plpgsql;

Caratteristiche:

  • Nessun RETURNS
  • Si chiama solo con CALL
  • Si può usare COMMIT, ROLLBACK, SAVEPOINT
  • Perfetta per batch, migrazioni, ETL

Chiamata:

CALL log_event('Elaborazione completata');

Perché funzioni e procedure sono separate

Perché hanno scopi diversi in SQL:

Funzioni Procedure
"Calcolare qualcosa e restituire" "Fare qualcosa e non restituire risultato"
Chiamata da SQL Chiamata come comando
Non possono gestire transazioni Possono gestire transazioni
Usate in SELECT, JOIN, WHERE Usate in CALL, script

Il vantaggio chiave della procedura — COMMIT

Le procedure possono gestire le transazioni al loro interno. Cioè, direttamente dentro la procedura puoi fare:

BEGIN;
-- logica
SAVEPOINT point1;
-- tentativo di aggiornamento
ROLLBACK TO point1;
COMMIT;

Ma nelle funzioni COMMIT e ROLLBACK sono vietati. Se ci provi — ottieni: ERROR: invalid transaction termination in function

Questo significa che la funzione deve essere deterministica e sicura, mentre la procedura può fare il "lavoro sporco" — pulire, loggare, inserire.

Tabella comparativa

Caratteristica FUNCTION PROCEDURE
Restituisce valore RETURNS
Usata in SELECT
Chiamata SELECT, PERFORM, DO Solo CALL
Può essere in trigger ❌ (solo funzioni)
Transazioni dentro (COMMIT) ❌ Vietato ✅ Consentito
Uso parametri OUT Tramite RETURNS TABLE, RECORD Tramite parametri OUT direttamente
Adatta per calcoli 🚫 non pensata per questo
Adatta per ETL, caricamenti 🚫 limitatamente ✅ perfetta
Si possono usare cursori ✅ Sì ✅ Sì

Dove usare cosa?

Usa una funzione se:

  • vuoi un valore di ritorno;
  • la chiami in SELECT, filtri dati;
  • è un calcolo semplice, un check o un wrapper per SQL.

Usa una procedura se:

  • vuoi fare azioni complesse;
  • ti serve controllo sulle transazioni;
  • gestisci batch, sposti dati, archivi, logghi.
1
Sondaggio/quiz
Costrutti di controllo, livello 51, lezione 4
Non disponibile
Costrutti di controllo
Costrutti di controllo
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION