0Pricing
SQL Academy · Leçon

Bases des fonctions PL/pgSQL

Écrivez des fonctions PL/pgSQL avec des paramètres, RETURNS TABLE, un flux de contrôle (IF, LOOP, FOREACH) et la gestion des exceptions.

Bases des fonctions PL/pgSQL est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

Qu’est-ce que PL/pgSQL ?

Le langage procédural intégré de PostgreSQL. SQL enrichi de variables, du contrôle de flux, des exceptions et de la possibilité d’appeler des requêtes dynamiquement. Il est utilisé pour les procédures stockées et les fonctions de déclencheur.

Structure d’une fonction

Une fonction simple :

CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
  RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

SELECT add(2, 3);   -- 5

Variables

Déclarez-les avec DECLARE ; affectez-leur une valeur avec := ou INTO :

CREATE FUNCTION user_orders(uid BIGINT)
RETURNS INT AS $$
DECLARE
  cnt INT;
BEGIN
  SELECT COUNT(*) INTO cnt FROM orders WHERE user_id = uid;
  RETURN cnt;
END;
$$ LANGUAGE plpgsql STABLE;

Contrôle de flux

IF / ELSE, FOR, WHILE, CASE :

IF cnt = 0 THEN
  RAISE NOTICE 'no orders';
ELSIF cnt < 10 THEN
  RAISE NOTICE 'few';
ELSE
  RAISE NOTICE 'many';
END IF;

FOR i IN 1..10 LOOP
  RAISE NOTICE '%', i;
END LOOP;

Parcourir les résultats d’une requête

Itération de type curseur :

CREATE FUNCTION recalc_totals() RETURNS VOID AS $$
DECLARE
  r RECORD;
BEGIN
  FOR r IN SELECT id FROM users LOOP
    UPDATE users SET
      order_count = (SELECT COUNT(*) FROM orders WHERE user_id = r.id)
    WHERE id = r.id;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

RETURNS TABLE

Renvoyer un ensemble de résultats :

CREATE FUNCTION top_buyers(n INT)
RETURNS TABLE (user_id BIGINT, total NUMERIC) AS $$
BEGIN
  RETURN QUERY
    SELECT o.user_id, SUM(o.total)
    FROM orders o
    GROUP BY o.user_id
    ORDER BY SUM(o.total) DESC
    LIMIT n;
END;
$$ LANGUAGE plpgsql STABLE;

SELECT * FROM top_buyers(10);

Paramètres IN / OUT / INOUT

Plusieurs valeurs de retour :

CREATE FUNCTION stats(uid BIGINT,
  OUT total NUMERIC,
  OUT cnt INT) AS $$
BEGIN
  SELECT SUM(total), COUNT(*) INTO total, cnt
  FROM orders WHERE user_id = uid;
END;
$$ LANGUAGE plpgsql STABLE;

SELECT * FROM stats(42);   -- total | cnt

Gestion des exceptions

BEGIN ... EXCEPTION WHEN ... THEN :

BEGIN
  INSERT INTO users (email) VALUES ($1);
EXCEPTION
  WHEN unique_violation THEN
    RAISE NOTICE 'email already exists';
  WHEN OTHERS THEN
    RAISE;
END;

RAISE pour la journalisation

Niveaux : DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION :

RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';

Marqueurs de volatilité

Indiquez correctement les fonctions au planificateur :

  • IMMUTABLE — les mêmes arguments donnent toujours le même résultat (aucune E/S) ; permet l’intégration en ligne et l’utilisation avec un index
  • STABLE — les mêmes arguments donnent le même résultat au sein d’une requête
  • VOLATILE — le résultat peut varier à chaque appel (valeur par défaut ; correcte pour NOW(), RANDOM())

SECURITY DEFINER

S’exécute avec les privilèges du propriétaire de la fonction — à utiliser avec précaution :

CREATE FUNCTION sensitive_op() RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$ ... $$;

-- Always set search_path explicitly to avoid hijacking:
ALTER FUNCTION sensitive_op() SET search_path = public, pg_temp;

Récapitulatif

PL/pgSQL étend SQL avec des boucles, IF, des exceptions et des retours structurés. Utilisez-le pour une logique cohérente en plusieurs étapes qui gagne à s’exécuter près des données.

Vérification rapide

Quel marqueur de volatilité devez-vous utiliser pour une fonction qui renvoie le même résultat avec les mêmes arguments, sans effets secondaires ni E/S ?

Questions Fréquemment Posées

La leçon « Bases des fonctions PL/pgSQL » est-elle gratuite ?

Oui — le texte complet de « Bases des fonctions PL/pgSQL » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Bases des fonctions PL/pgSQL » ?

Écrivez des fonctions PL/pgSQL avec des paramètres, RETURNS TABLE, un flux de contrôle (IF, LOOP, FOREACH) et la gestion des exceptions. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Academy ?

Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Bases des fonctions PL/pgSQL » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?

Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Anatomie des déclencheurs : BEFORE/AFTER, FOR EACH ROW
  2. Bases des fonctions PL/pgSQL
  3. Blocs DO et code anonyme
  4. Auditer des tables avec des déclencheurs
← Retour à SQL Academy