Modulelessen (2/4)
Geavanceerde logica met PL/pgSQL
Functies geschreven in LANGUAGE sql kunnen standaardquery's alleen na elkaar uitvoeren. Als we iets geavanceerder nodig hadden, zoals "ALS het ingevoerde totaal groter is dan 100 DAN een korting toepassen", kan gewone SQL dat niet alleen doen. We moeten PL/pgSQL gebruiken, een volwaardige procedurele programmeertaal ingebouwd in Postgres.
In PL/pgSQL voegen we de klassieke lichamen toe die zijn gemaakt van BEGIN .. END, variabelen en voorwaardelijke instructies.
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;Deze kracht stelt ons in staat enorme blokken repetitieve logica te ontladen die we anders in JS zouden schrijven, en deze in veilige, snelle functies te verpakken die dicht bij de gegevens worden uitgevoerd met een zeer lage latentie!
Probeer het zelf
We willen een complexe functie die zichzelf vervangt als deze al bestaat ('get_price_label'), 'price' accepteert als NUMERIC, en een uitgebreide TEKST retourneert.\nGebruik PL/pgSQL. Open BEGIN.\nSchrijf de logica op: als de prijs > 100,00 is, retourneer dan de string 'Premium'. ELSE retourneert 'Economico'.\nSluit de voorwaardelijke END; en het lichaam.
Toon hint
FUNCTIE MAKEN OF VERVANGEN get_price_label(price NUMERIC) RETOURNEERT TEKST ALS $$ BEGIN ALS prijs > 100,00 DAN RETOUR 'Premium'; ANDERS RETOUR 'Economico'; EINDE ALS; EINDE; $$ TAAL plpgsql;
Oplossing beschikbaar na 3 pogingen
Je kunt tijdelijke variabelen declareren vóór BEGIN met het DECLARE trefwoord.\nSchrijf een functie 'saluta_utente(userid INTEGER)' -> Geeft TEXT, PL/pgSQL-logica terug.\nDaarin DECLARE een stringvariabele 'nome_utente TEXT;'.\nVul vervolgens, binnen BEGIN, die variabele in met de voornaam door 'klanten' dynamisch te bevragen met behulp van de speciale clausule 'SELECT voornaam INTO nome_utente FROM... WAAR id = gebruikers-ID'. Ten slotte voegt RETURN de variabele samen tot 'Ciao'.
Toon hint
VERKLAREN nome_utente TEXT; \nBEGIN SELECTEER voornaam INTO nome_utente... \nRETURN 'Ciao ' || nome_utente;
Oplossing beschikbaar na 3 pogingen