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;
/