BUT2FA BD
This commit is contained in:
126
CM_I_25/CG_CM_I_25.txt
Normal file
126
CM_I_25/CG_CM_I_25.txt
Normal file
@@ -0,0 +1,126 @@
|
||||
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;
|
||||
/
|
||||
BIN
CM_I_25/CM_I_25.jpg
Normal file
BIN
CM_I_25/CM_I_25.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 146 KiB |
165
CM_I_25/DS_CM_I_25.txt
Normal file
165
CM_I_25/DS_CM_I_25.txt
Normal file
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
A
|
||||
Nom et prénom : [Votre nom]
|
||||
Groupe : [Votre groupe]
|
||||
Salle TP : [Votre salle]
|
||||
Nom du voisin de gauche : [Nom]
|
||||
Nom du voisin de droite : [Nom]
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 1 : 4pts
|
||||
|
||||
1- Lister tous les emprunts en cours une date_retour qui a une valeur nulle. Vous devez afficher le titre du livre, le nom et le prenom de l'auteur et le membre_id.
|
||||
2- Afficher tous les livres qui ont été empruntés pour une durée supérieure à 25 jours
|
||||
|
||||
|
||||
-- 1. Liste des emprunts en cours (date_retour NULL)
|
||||
|
||||
SELECT l.titre, a.nom, a.prenom, e.membre_id
|
||||
FROM Emprunts e
|
||||
JOIN Livres l ON e.livre_id = l.livre_id
|
||||
JOIN Auteurs a ON l.auteur_id = a.auteur_id
|
||||
WHERE e.date_retour IS NULL;
|
||||
|
||||
|
||||
-- 2. Livres empruntés >25 jours (supposant date_retour renseignée)
|
||||
|
||||
SELECT l.titre, a.nom, a.prenom
|
||||
FROM Emprunts e
|
||||
JOIN Livres l ON e.livre_id = l.livre_id
|
||||
JOIN Auteurs a ON l.auteur_id = a.auteur_id
|
||||
WHERE (e.date_retour - e.date_emprunt) > 25;
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 2 : 2pts
|
||||
|
||||
Créer une séquence Livres_seq qui a pour première valeur 12 et s'incrémente de 1.
|
||||
|
||||
|
||||
CREATE SEQUENCE Livres_seq START WITH 12 INCREMENT BY 1;
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 3 : 5pts
|
||||
|
||||
Créer une procédure AjouterLivre(p_titre VARCHAR2, p_auteur_id INT, p_annee_publication INT, p_genre VACHAR2. p_stock INT) qui permet d'ajouter un nouveau livre à la bibliothèque.
|
||||
- Servez-vous de la séquence précédemment créée pour l'insertion de Livre_id.
|
||||
- Traitez le cas où l'auteur du livre à insérer n'existe pas dans la table Auteurs.
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE AjouterLivre(
|
||||
p_titre VARCHAR2,
|
||||
p_auteur_id INT,
|
||||
p_année_publication INT,
|
||||
p_genre VARCHAR2,
|
||||
p_stock INT
|
||||
) IS
|
||||
v_auteur_count INT;
|
||||
BEGIN
|
||||
-- Vérifier si l'auteur existe
|
||||
SELECT COUNT(*) INTO v_auteur_count FROM Auteurs WHERE auteur_id = p_auteur_id;
|
||||
IF v_auteur_count = 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'L''auteur n''existe pas.');
|
||||
END IF;
|
||||
|
||||
-- Insertion avec la séquence
|
||||
INSERT INTO Livres (livre_id, titre, auteur_id, année_publication, genre, stock)
|
||||
VALUES (Livres_seq.NEXTVAL, p_titre, p_auteur_id, p_année_publication, p_genre, p_stock);
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 4 : 4pts
|
||||
|
||||
Créer une fonction fn_nombre_livres_empruntes(p_membre_id INT) qui retourne le nombre de livres empruntés par un membre.
|
||||
Pour chaque membre présent dans la table Emprunt, afficher le nombre de livres empreintés.
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION fn_nombre_livres_empruntes(p_membre_id INT)
|
||||
RETURN INT IS
|
||||
v_count INT;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO v_count
|
||||
FROM Emprunts
|
||||
WHERE membre_id = p_membre_id AND date_retour IS NULL;
|
||||
RETURN v_count;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Afficher pour chaque membre dans Emprunts
|
||||
SELECT DISTINCT membre_id, fn_nombre_livres_empruntes(membre_id) AS nombre_emprunts
|
||||
FROM Emprunts;
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 5 : 5pts
|
||||
|
||||
Créer un trigger trg_decremente_stock_emprunt qui permettra de gérer le stock des livres ; il s'exécutera avant l'insertion d'un nouvel emprunt et devra faire les vérifications ci-dessous:
|
||||
- Il vérifie que le stock est supérieur à 0: si c'est le cas, il décrémente de 1.
|
||||
- Une personne ne peut pas empreinte plus de 2 livres.
|
||||
- Si le stock est égal à 0, le trigger lève une erreur et empêche l'emprunt.
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_decremente_stock_emprunt
|
||||
BEFORE INSERT ON Emprunts
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
v_stock INT;
|
||||
v_emprunts_count INT;
|
||||
BEGIN
|
||||
-- Vérifier le stock
|
||||
SELECT stock INTO v_stock
|
||||
FROM Livres
|
||||
WHERE livre_id = :NEW.livre_id;
|
||||
|
||||
IF v_stock <= 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20002, 'Stock épuisé.');
|
||||
END IF;
|
||||
|
||||
-- Vérifier le nombre d'emprunts du membre
|
||||
SELECT COUNT(*) INTO v_emprunts_count
|
||||
FROM Emprunts
|
||||
WHERE membre_id = :NEW.membre_id AND date_retour IS NULL;
|
||||
|
||||
IF v_emprunts_count >= 2 THEN
|
||||
RAISE_APPLICATION_ERROR(-20003, 'Limite de 2 emprunts atteinte.');
|
||||
END IF;
|
||||
|
||||
-- Décrémenter le stock
|
||||
UPDATE Livres
|
||||
SET stock = stock - 1
|
||||
WHERE livre_id = :NEW.livre_id;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
-- Cas de tests
|
||||
|
||||
|
||||
-- Test Exercice 1.1 :
|
||||
-- INSERT INTO Emprunts (emprunt_id, livre_id, membre_id, date_emprunt, date_retour) VALUES (1, 101, 1, SYSDATE - 10, NULL);
|
||||
-- Résultat attendu : L'emprunt apparaît dans la liste.
|
||||
|
||||
|
||||
-- Test Exercice 1.2 :
|
||||
-- INSERT INTO Emprunts (emprunt_id, livre_id, membre_id, date_emprunt, date_retour) VALUES (2, 102, 2, SYSDATE - 30, SYSDATE);
|
||||
-- Résultat attendu : Le livre apparaît dans la liste.
|
||||
|
||||
|
||||
-- Test Exercice 3 :
|
||||
-- EXEC AjouterLivre('Nouveau Livre', 999, 2024, 'Roman', 5); -- Doit échouer si l'auteur 999 n'existe pas.
|
||||
|
||||
|
||||
-- Test Exercice 5 :
|
||||
-- INSERT INTO Emprunts (emprunt_id, livre_id, membre_id, date_emprunt) VALUES (3, 103, 3, SYSDATE); -- Doit échouer si stock = 0 ou si le membre a déjà 2 emprunts.
|
||||
Reference in New Issue
Block a user