Lecții din modul (2/4)
Logica avansata cu PL/pgSQL
Funcțiile scrise în LANGUAGE sql pot rula doar interogări standard una după alta. Dacă aveam nevoie de ceva mai avansat, cum ar fi „DACĂ totalul introdus este mai mare de 100, APLICĂ O REDUCERE”, SQL simplu nu poate face asta de unul singur. Trebuie să folosim PL/pgSQL, un limbaj de programare procedural cu drepturi depline încorporat în Postgres.
În PL/pgSQL adăugăm corpurile clasice formate din BEGIN .. END, variabile și instrucțiuni condiționale.
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;Această putere ne permite să descarcăm blocuri masive de logică repetitivă pe care altfel le-am scrie în JS, împachetându-le în funcții sigure, rapide, executate aproape de date, cu o latență foarte scăzută!
Încercați-l singur
Dorim o funcție complexă care să se înlocuiască pe ea însăși dacă există deja ('get_price_label'), acceptă 'price' ca NUMERIC și returnează un TEXT verbos.\nUtilizați PL/pgSQL. Deschideți BEGIN.\nScrieți logica: dacă prețul este > 100,00 returnați șirul „Premium”. ELSE returnează „Economico”.\nÎnchide condiționalul END; si corpul.
Afișează indiciu
CREATE SAU ÎNLOCUITĂ FUNCȚIA get_price_label(price NUMERIC) RETURNEAZĂ TEXTUL CA $$ ÎNCEPE DACĂ preț > 100,00 APOI RETURNEAZĂ „Premium”; ELSE RETURN 'Economico'; END IF; SFÂRŞIT; $$ LIMBA plpgsql;
Soluție disponibilă după 3 încercări
Puteți declara variabile temporare înainte de BEGIN cu cuvântul cheie DECLARE.\nScrieți o funcție „saluta_utente(userid INTEGER)” -> Returnează TEXT, logica PL/pgSQL.\nÎn interiorul acesteia DECLARE o variabilă șir „nome_utente TEXT;”.\nApoi, în interiorul BEGIN, completați acea variabilă cu primul nume de interogare folosind clauza „custom_name first” folosind dinamica clauză „primul_nume” INTO nome_utente FROM... WHERE id = userid'. În cele din urmă, RETURN concatenează variabila la „Ciao”.
Afișează indiciu
DECLARE nume_utente TEXT; \nÎNCEPEȚI SELECTAȚI prenumele INTO nome_utente... \nRETURNĂ „Ciao” || nume_utente;
Soluție disponibilă după 3 încercări