Passer au contenu principal
eLearner.app
Module 12 · Leçon 1 sur 445/57 dans le cours~15 min
Leçons du module (1/4)

UDFs et SQL de base

Jusqu'à présent, nous envoyons des requêtes depuis le serveur Node.js. Mais si une formule est utilisée dans des dizaines de requêtes différentes (par exemple pour calculer le prix final, TVA incluse), pourquoi dupliquer les calculs en JavaScript ? Fonctions SQL (Fonctions définies par l'utilisateur - UDF) créons des "macros" à l'intérieur de la base de données elle-même.

Voici comment créer une macro SQL mathématique :

SQL
CREATE OR REPLACE FUNCTION calculate_tax(price NUMERIC)
RETURNS NUMERIC AS $$
  SELECT price * 1.22;
$$ LANGUAGE sql;

Une fois cette commande exécutée, la fonction reste éternellement dans notre base de données. Il peut être appelé à partir de n'importe quelle requête :

SQL
SELECT name, calculate_tax(unit_price) AS price_with_tax FROM products;

Création dynamique

Nous pouvons définir autant de variables que nous le souhaitons, en spécifiant leurs types, et LANGUAGE sql exécutera la requête et retournera implicitement la dernière instruction placée entre les signes dollar $$.

Essayez-le vous-même

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

Créez une fonction appelable simple nommée 'get_full_name' qui accepte deux paramètres TEXT ('first_name' TEXT, 'last_name' TEXT). Elle doit renvoyer une valeur TEXT. À l'intérieur, effectuez un SELECT trivial qui concatène les deux arguments avec un seul espace entre eux, et déclarez-le en langage SQL.

Chargement de l'éditeur…
Afficher l'indice

CRÉER OU REMPLACER UNE FONCTION get_full_name(first_name TEXT, last_name TEXT) RETOURNE LE TEXTE AS $$ SELECT first_name || ' ' || nom de famille; $$ LANGUE sql ;

Solution disponible après 3 tentatives

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

Dans les UDF plus avancées, nous pouvons intégrer des requêtes entières. Créez une fonction 'get_customer_count()' qui n'accepte aucun paramètre et RETOURNE un ENTIER. À l'intérieur, exécutez un trivial 'SELECT COUNT(id) FROM customer'. Déclarez-le en langage SQL pur.

Chargement de l'éditeur…
Afficher l'indice

Attention : COUNT renvoie un bigint, convertissez-le en INTEGER pour qu'il corresponde au type de retour ! CRÉER OU REPLACER UNE FONCTION get_customer_count() RETOURNE UN ENTIER AS $$ SELECT CAST(COUNT(id) AS INTEGER) FROM clients ; $$ LANGUE sql ;

Solution disponible après 3 tentatives