126 lines
2.6 KiB
Plaintext
126 lines
2.6 KiB
Plaintext
|
|
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;
|
||
|
|
/
|