Exercice 1 : 4 points 1. Liste des emprunts en cours (date_retour = NULL) SELECT Livres.titre AS Titre_Livre, Auteurs.nom AS Nom_Auteur, Auteurs.prenom AS Prenom_Auteur, Emprunts.membre_id AS Membre_ID FROM Emprunts JOIN Livres ON Emprunts.livre_id = Livres.livre_id JOIN Auteurs ON Livres.auteur_id = Auteurs.auteur_id WHERE Emprunts.date_retour IS NULL; 2. Liste des livres empruntés pour une durée > 25 jours SELECT Livres.titre AS Titre_Livre, Emprunts.date_emprunt, Emprunts.date_retour, DATEDIFF(Emprunts.date_retour, Emprunts.date_emprunt) AS Duree_Emprunt FROM Emprunts JOIN Livres ON Emprunts.livre_id = Livres.livre_id WHERE DATEDIFF(Emprunts.date_retour, Emprunts.date_emprunt) > 25; Exercice 2 : 2 points Création de la séquence Livres_seq CREATE SEQUENCE Livres_seq START WITH 12 INCREMENT BY 1; Exercice 3 : 5 points Procédure AjouterLivre CREATE OR REPLACE PROCEDURE AjouterLivre( p_titre VARCHAR2, p_auteur_id INT, p_annee_publication INT, p_genre VARCHAR2, p_stock INT ) AS BEGIN -- Vérification de l'existence de l'auteur IF NOT EXISTS ( SELECT 1 FROM Auteurs WHERE auteur_id = p_auteur_id ) THEN RAISE_APPLICATION_ERROR(-20001, 'Auteur inexistant.'); END IF; -- Insertion du nouveau livre INSERT INTO Livres (livre_id, titre, auteur_id, annee_publication, genre, stock) VALUES (Livres_seq.NEXTVAL, p_titre, p_auteur_id, p_annee_publication, p_genre, p_stock); END; / Exercice 4 : 3 points Fonction fn_nombre_livres_empruntes CREATE OR REPLACE FUNCTION fn_nombre_livres_empruntes(p_membre_id INT) RETURN INT AS nombre_emprunts INT; BEGIN SELECT COUNT(*) INTO nombre_emprunts FROM Emprunts WHERE membre_id = p_membre_id; RETURN nombre_emprunts; END; / Exercice 5 : 5 points Trigger trg_decrementer_stock_emprunt CREATE OR REPLACE TRIGGER trg_decrementer_stock_emprunt BEFORE INSERT ON Emprunts FOR EACH ROW DECLARE stock_actuel INT; BEGIN -- Vérification du stock SELECT stock INTO stock_actuel FROM Livres WHERE livre_id = :NEW.livre_id; IF stock_actuel > 0 THEN -- Décrémenter le stock UPDATE Livres SET stock = stock - 1 WHERE livre_id = :NEW.livre_id; ELSE -- Empêcher l'emprunt RAISE_APPLICATION_ERROR(-20002, 'Stock insuffisant pour emprunter ce livre.'); END IF; END; /