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