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 :
- Les variables : Déclaration, typage strict, affectation directe et extraction de résultats SQL avec
SELECT ... INTO. - Les conditions : Maîtrise de la structure
IF ... ELSIF ... ELSE ... END IFet comparaison avec leCASE WHENSQL. - Les boucles : Boucles inconditionnelles
LOOP, bornéesFOR ... IN 1..N, et itération sur les tables de donnéesFOR record IN SELECT ... LOOP. - 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 :
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