Vai al contenuto
eLearner.app
Modulo 12 · Lezione 2 di 446/57 nel corso~15 min
Lezioni del modulo (2/4)

Logica Avanzata con PL/pgSQL

Le funzioni scritte in LANGUAGE sql possono eseguire solo query standard una dietro l'altra. Se ci servisse una roba avanzata del tipo "SE il totale inserito è maggiore di 100 ALLORA applica sconto", questo il linguaggio SQL nudo di base non lo sa fare da solo. Dobbiamo usare il PL/pgSQL, un linguaggio di programmazione procedurale vero e proprio montato dentro Postgres.

Nelle PL/pgSQL si aggiungono i body classici formati da BEGIN .. END, variabili e comandi condizionali.

SQL
CREATE OR REPLACE FUNCTION valuta_cliente(ordini INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF ordini > 10 THEN
    RETURN 'VIP';
  ELSE
    RETURN 'Standard';
  END IF;
END;
$$ LANGUAGE plpgsql;

Questa potenza permette di delegare blocchi massicci di logica ripetitiva che faremo in JS, chiudendoli in funzioni da lanciare sicure e veloci a bassissima latenza vicino al disco dati!

Prova tu

Esercizio#sql.m12.l2.e1
Tentativi: 0Caricamento…

Vogliamo una funzione complessa che si rimpiazzi se esistente ('get_price_label') e accetti 'price' come NUMERIC, e ci ritorni un TEXT verboso.\nUsa PL/pgSQL. Apri BEGIN.\nScrivi la logica dove se price è > 100.00 ritorna stringa 'Premium'. ELSE ritorna 'Economico'. \nChiudi l'END; condizionale ed il body.

Caricamento editor…
Mostra suggerimento

CREATE OR REPLACE FUNCTION get_price_label(price NUMERIC) RETURNS TEXT AS $$ BEGIN IF price > 100.00 THEN RETURN 'Premium'; ELSE RETURN 'Economico'; END IF; END; $$ LANGUAGE plpgsql;

Soluzione disponibile dopo 3 tentativi

Esercizio#sql.m12.l2.e2
Tentativi: 0Caricamento…

Si possono dichiarare variabili provvisorie prima di BEGIN con la keyword DECLARE. \nScrivi una funzione 'saluta_utente(userid INTEGER)' -> Ritorna TEXT logica PL/pgSQL.\nAl suo interno DICHIARA una variabile stringa 'nome_utente TEXT;'.\nIn seguito, dentro al BEGIN, popola questa variabile col firstname interrogando da 'customers' dinamicamente usando la clausola speciale 'SELECT first_name INTO nome_utente FROM... WHERE id = userid'. Infine, RETURN concatena la var a 'Ciao '.

Caricamento editor…
Mostra suggerimento

DECLARE nome_utente TEXT; \nBEGIN SELECT first_name INTO nome_utente... \nRETURN 'Ciao ' || nome_utente;

Soluzione disponibile dopo 3 tentativi