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.
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
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.
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
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 '.
Mostra suggerimento
DECLARE nome_utente TEXT; \nBEGIN SELECT first_name INTO nome_utente... \nRETURN 'Ciao ' || nome_utente;
Soluzione disponibile dopo 3 tentativi