Introduction à la Programmation Procédurale en SQL (PL/pgSQL)

@joekakone

Joseph Konka @joekakone

03/03/2026 · 5 min

Dépassez le SQL déclaratif classique grâce à la programmation procédurale avec PL/pgSQL sous PostgreSQL : structure des blocs anonymes DO, dollar-quoting, journalisation RAISE et automatisation de traitements de données.

Le langage SQL standard est par essence un langage déclaratif : vous décrivez ce que vous souhaitez obtenir (SELECT ... FROM ... WHERE ...), et le moteur de base de données détermine le plan d'exécution optimal pour vous renvoyer le jeu d'enregistrements.

Cependant, dans les architectures modernes de données (Data Warehouses, pipelines ETL, maintenance d'entrepôts de données), le simple SQL déclaratif ne suffit plus. Il devient indispensable d'exécuter des calculs séquentiels, de tester des conditions d'exécution, d'itérer sur des partitions ou de gérer des exceptions. C'est ici qu'intervient la programmation procédurale.


1. Déclaratif vs Procédural : le changement de paradigme#

Caractéristique SQL Déclaratif (SELECT / INSERT / UPDATE) SQL Procédural (PL/pgSQL, T-SQL)
Philosophie Spécifie le résultat attendu (Quoi) Spécifie l'enchaînement des étapes (Comment)
Structures de contrôle Limitées à des expressions en ligne (CASE WHEN) Boucles (LOOP, FOR, WHILE), conditions (IF / THEN / ELSE)
Variables locales Non supportées nativement Déclaration de types scalaires, records et curseurs
Gestion des erreurs La requête échoue brutalement Blocs de capture d'exceptions (BEGIN ... EXCEPTION ... END)
Cas d'usage type Requêtes ad hoc, rapports BI Pipelines ETL, rafraîchissement incrémental, archivage de données

Chaque grand SGBDR dispose de son extension procédurale : * PostgreSQL : PL/pgSQL (Procedural Language / PostgreSQL) * Microsoft SQL Server : T-SQL (Transact-SQL) * Oracle Database : PL/SQL

Dans ce module, nous étudions en profondeur PL/pgSQL, qui est aujourd'hui le dialecte open-source de référence dans l'écosystème de données cloud et on-premise.


2. Anatomie d'un bloc procédural en PL/pgSQL#

En PL/pgSQL, le code s'écrit sous forme de blocs structurés. Lorsque l'on souhaite exécuter un script sans créer de fonction permanente dans la base, on utilise un bloc anonyme initié par la commande DO.

DO
$$
DECLARE
    -- 1. Zone de déclaration des variables locales
    v_message VARCHAR(100) := 'Bienvenue dans le moteur PL/pgSQL';
BEGIN
    -- 2. Corps du programme (instructions impératives)
    RAISE NOTICE '%', v_message;

EXCEPTION
    -- 3. Gestion facultative des erreurs
    WHEN OTHERS THEN
        RAISE WARNING 'Une erreur inattendue est survenue : %', SQLERRM;
END;
$$ LANGUAGE plpgsql;

Le mécanisme du Dollar-Quoting ($$)#

Remarquez les symboles $$ encadrant le code. En SQL traditionnel, une chaîne de caractères s'écrit entre apostrophes '...'. Mais si votre code procédural contient lui-même des apostrophes ou des requêtes dynamiques, vous seriez contraint de doubler chaque guillemet ('''').

La syntaxe de dollar-quoting ($$ ... $$) permet d'encapsuler tout le bloc de code comme un littéral textuel sans échappement fastidieux.


3. Journaliser avec RAISE NOTICE#

En programmation SQL, vous ne disposez pas d'un print() ou d'un console.log() standard. L'instruction RAISE permet d'émettre des messages d'information, des avertissements ou d'interrompre l'exécution :

-- Message informatif (visible dans la console DBeaver ou psql)
RAISE NOTICE 'Traitement terminé avec succès pour la partition %', '2024-03-01';

-- Signalement d'un avertissement
RAISE WARNING 'Attention : la table source comporte des enregistrements orphelins.';

-- Levée d'une exception bloquante (annule la transaction en cours)
RAISE EXCEPTION 'Arrêt critique : le contrôle qualité a échoué.';

Le caractère % agit comme un espace réservé (placeholder), remplacé séquentiellement par les arguments qui suivent la chaîne de format.


4. Programme pédagogique du module#

Dans les leçons suivantes, nous explorerons les piliers indispensables à tout Data Engineer :

  1. Les variables : Déclaration, typage strict, affectation directe et extraction de résultats SQL avec SELECT ... INTO.
  2. Les conditions : Maîtrise de la structure IF ... ELSIF ... ELSE ... END IF et comparaison avec le CASE WHEN SQL.
  3. Les boucles : Boucles inconditionnelles LOOP, bornées FOR ... IN 1..N, et itération sur les tables de données FOR record IN SELECT ... LOOP.
  4. Les procédures et fonctions : Création de sous-programmes réutilisables, gestion des paramètres IN/OUT, transactions et automatisation ETL.

5. Mise en pratique : Votre premier script de diagnostic#

Ouvrez votre client SQL (DBeaver ou pgAdmin connecté à votre instance PostgreSQL) et exécutez ce premier script :

Premier diagnostic serveur PL/pgSQL
DO
$$
DECLARE
    v_version TEXT;
    v_current_user TEXT;
    v_now TIMESTAMP;
BEGIN
    -- Récupération dynamique des métadonnées du serveur
    SELECT version(), current_user, clock_timestamp()
    INTO v_version, v_current_user, v_now;

    RAISE NOTICE '==================================================';
    RAISE NOTICE 'Connecté en tant que : %', v_current_user;
    RAISE NOTICE 'Horodatage serveur   : %', v_now;
    RAISE NOTICE 'Moteur PostgreSQL    : %', split_part(v_version, ' ', 2);
    RAISE NOTICE '==================================================';
END;
$$ LANGUAGE plpgsql;

Ce premier test valide que le moteur PL/pgSQL est actif sur votre serveur. Dans la prochaine leçon, nous entrerons dans le vif du sujet avec la manipulation des Variables et des types de données.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue