# TD7 — Intégration des BD dans les Applications

A. Préparation SQL minimale (côté BD)

Objectif : préparer les objets que l’application appellera.

Exercice A1 – Vérification du schéma

Depuis psql :

  1. Vérifier l’existence de client, village, sejour, ArchiveSejour.
  2. Vérifier les contraintes posées dans les blocs 2 et 3 (NOT NULL, CHECK, PK/FK, exclusion des chevauchements…).
  3. Expliquer en 5 lignes comment ces contraintes impactent l’application (retours d’erreur, SQLSTATE, rollback).

Exercice A2 – Préparer l’API SQL minimale

Écrire (ou vérifier) :

  • inscrire_client(nom, age)
  • ville_offre(ville) (simple SELECT)
  • disponibilite(ville, debut, fin) (version simple, sans capacité)
  • reserver(idc, ville, debut, fin) (stub : juste un RAISE NOTICE)

C’est cette API que les programmes appelleront.

B. Appels programmés – primitives techniques

Objectif : apprendre à appeler proprement des requêtes depuis un langage.

Exercice B1 – Connexion simple

Écrire un programme minimal qui :

  1. ouvre une connexion (JDBC / PDO / psycopg) ;
  2. exécute SELECT 1;
  3. affiche le résultat ;
  4. gère proprement les erreurs de connexion.

Exercice B2 – Requête paramétrée

Écrire un programme qui prend en entrée un nom de client et affiche :

idc | nom | age

via une requête paramétrée :

SELECT idc, nom, age FROM client WHERE nom = ?

Exercice B3 – INSERT + RETURNING

Depuis un programme, appeler :

INSERT INTO client(nom, age) VALUES (?, ?) RETURNING idc;

Afficher l’idc retourné.

Exercice B4 – Appel de fonction SQL

Écrire un programme qui appelle une fonction simple (ex. compter_clients()) et affiche le résultat. Variante : lire un RECORD (résultat à plusieurs colonnes).

Exercice B5 – Appel de procédure SQL

Depuis un langage :

CALL inscrire_client(?, ?);

Afficher les messages/erreurs reçus (NOTICE, EXCEPTION).

Exercice B6 – Transactions

Écrire un programme qui :

  1. commence une transaction ;
  2. insère deux clients ;
  3. déclenche volontairement une erreur UNIQUE ;
  4. montre que tout est annulé.

C. Cas métier complets (fonctionnalités 1→5 & 6→11)

On utilise maintenant le cahier des charges comme base des enchaînements applicatifs.

Exercice C1 – Inscription client (fonctionnalité 1)

Depuis un programme :

  • demander nom + âge ;
  • appeler inscrire_client ;
  • afficher l’idc attribué.

Exercice C2 – Consulter l’offre d’une ville (fonctionnalité 2)

Programme :

  • demande une ville ;
  • exécute SELECT idv, ville, activite, prix FROM village WHERE ville = ?;
  • affiche ligne par ligne.

Exercice C3 – Disponibilités (fonctionnalité 3)

Programme :

  • demander ville + dates ;
  • appeler la fonction disponibilite(ville, debut, fin) ;
  • afficher les villages retournés.

Exercice C4 – Réservation simple (fonctionnalité 4)

Programme qui :

  1. prend idc, ville, debut, fin;
  2. sélectionne le village le plus cher dans cette ville ;
  3. insère un séjour ;
  4. retourne {ids, idv, activite}.

Cas test obligatoires :

  • aucune offre → gérer proprement l’erreur ;
  • capacité saturée → récupérer le SQLSTATE approprié ;
  • chevauchement → erreur via contrainte EXCLUDE.

Exercice C5 – Consulter ses séjours (fonctionnalité 5)

Programme :

SELECT ids, idv, ville, activite, debut, fin
FROM ...
WHERE idc = ?
ORDER BY debut desc

Afficher proprement.

Exercice C6 – Créer un village (fonctionnalité 6)

Écrire un petit outil développeur :

  • saisie ville/activité/prix/capacité ;
  • insertion ;
  • affichage de l’idv.

Exercice C7 – Modifier un village (fonctionnalité 7)

Programme qui :

  1. charge les infos du village (lecture) ;
  2. applique une mise à jour légale (seuls champs autorisés) ;
  3. affiche l’état final.

Exercice C8 – Consulter les séjours filtrés (fonctionnalité 8)

Programme paramétrable : ville | période | client. Requêtes avec filtres optionnels (construction dynamique).

Exercice C9 – Purge des séjours (fonctionnalité 9)

Programme appelant :

CALL purge_sejours(:date);

Afficher le nombre supprimé.

Exercice C10 – Annulation administrative (fonctionnalité 10)

Programme qui :

  • appelle annuler_sejour(ids, motif) ;
  • puis vérifie en SELECT qu’une ligne est apparue dans ArchiveSejour.

Exercice C11 – Archivage automatique (fonctionnalité 11)

Test programmatique de votre trigger :

  • supprimer un séjour ;
  • vérifier l’insertion dans ArchiveSejour.

D. Tests d’erreurs – SQLSTATE et rollback

Objectif : apprendre à manipuler les erreurs réelles du SGBD.

Exercice D1 – Violation UNIQUE

Tenter deux insertions identiques depuis un programme → capturer SQLSTATE = 23505.

Exercice D2 – Violation CHECK

Forcer un age < 0 → tester le rattrapage.

Exercice D3 – Violation FK

Supprimer un client utilisé dans sejour → analyser le comportement (CASCADE vs RESTRICT).

Exercice D4 – Violation exclusion (chevauchement)

Provoquer deux séjours qui se chevauchent pour le même client → SQLSTATE extrait dans l’application.

Exercice D5 – Appel de procédure qui lève EXCEPTION

Tester une procédure volontairement fautive :

RAISE EXCEPTION USING ERRCODE = 'P0001';

Afficher code + message.

E. Intégration applicative finale – pipeline complet

Travail synthèse. Tout doit tourner depuis un programme (Java/PHP/Python), pas dans psql.

Exercice E1 – Scénario “client complet”

Votre programme effectue :

  1. inscription ;
  2. consultation offre ;
  3. disponibilités ;
  4. réservation ;
  5. consultation des séjours ;
  6. suppression du séjour ;
  7. vérification archivage.

Exercice E2 – Scénario “employé complet”

  1. création d’un village ;
  2. modification ;
  3. création d’un second ;
  4. purge ;
  5. tentative d’annulation ;
  6. vérification des vues et droits (TD6).

Exercice E3 – Programme de test automatique

Créer un script/programme exécutant une batterie de tests :

  • 10 insertions / 10 suppressions ;
  • tests de capacité ;
  • tests d’annulation ;
  • tests d’erreur.

Exercice E4 – Mini-ORM artisanal

Écrire une petite classe/struct Village ou Client avec :

  • constructeur depuis ResultSet ;
  • méthode load(id) ;
  • méthode save() (INSERT/UPDATE) ;
  • méthode delete(ids).
Pierre-Henri Paris
Pierre-Henri Paris
Associate Professor in Artificial Intelligence

My research interests include Knowlegde Graphs, Information Extraction, and NLP.