Passer au contenu principal
eLearner.app
Module 12 · Leçon 2 sur 446/57 dans le cours~15 min
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.

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;

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

Exercice#sql.m12.l2.e1
Tentatives : 0Chargement…

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.

Chargement de l'éditeur…
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

Exercice#sql.m12.l2.e2
Tentatives : 0Chargement…

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'.

Chargement de l'éditeur…
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