Leçons du module (2/4)
Logique avancée avec PL/pgSQL
Les fonctions écrites en LANGUAGE sql ne peuvent exécuter que des requêtes standards les unes après les autres. Si nous avions besoin de quelque chose de plus avancé comme "SI le total saisi est supérieur à 100 ALORS appliquer une réduction", SQL simple ne peut pas le faire tout seul. Nous devons utiliser PL/pgSQL, un langage de programmation procédurale à part entière intégré à Postgres.
En PL/pgSQL, nous ajoutons les corps classiques constitués de BEGIN .. END, de variables et d'instructions conditionnelles.
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;Cette puissance nous permet de décharger des blocs massifs de logique répétitive que nous écririons autrement en JS, en les regroupant dans des fonctions sûres et rapides exécutées à proximité des données avec une latence très faible !
Essayez-le vous-même
Nous voulons une fonction complexe qui se remplace si elle existe déjà (« get_price_label »), accepte « price » comme NUMERIC et renvoie un TEXTE détaillé. Utilisez PL/pgSQL. Ouvrez BEGIN. Écrivez la logique : si le prix est > 100,00, renvoyez la chaîne « Premium ». ELSE renvoie 'Economico'. Fermez la FIN conditionnelle ; et le corps.
Afficher l'indice
CRÉER OU REMPLACER UNE FONCTION get_price_label(price NUMERIC) RETOURNE LE TEXTE COMME $$ COMMENCER SI prix > 100,00 ALORS RETOURNER 'Premium' ; AUTRE RETOUR 'Economico'; FIN SI ; FIN; $$ LANGUE plpgsql;
Solution disponible après 3 tentatives
Vous pouvez déclarer des variables temporaires avant BEGIN avec le mot-clé DECLARE. Écrivez une fonction 'saluta_utente(userid INTEGER)' -> Renvoie TEXT, logique PL/pgSQL. À l'intérieur, DECLARE une variable de chaîne 'nome_utente TEXT;'. Ensuite, dans BEGIN, remplissez cette variable avec le prénom en interrogeant dynamiquement 'clients' à l'aide de la clause spéciale 'SELECT first_name INTO nome_utente DE... OÙ id = userid'. Enfin, RETURN concatène la variable à 'Ciao'.
Afficher l'indice
DÉCLARE nome_utente TEXTE ; BEGIN SELECT first_name INTO nome_utente... RETURN 'Ciao ' || nome_utente;
Solution disponible après 3 tentatives