Théorie des graphes : Exercice championnat bda
Télécharger PDFExercice 0 : Championnat de Football
Université Cadi Ayyad
Faculté Polydisciplinaire de Safi
Filière SMIA
2019−2020 : Base de données avancées
1. Séquence pour la table équipe
Créer une séquence seqeq pour générer automatiquement les identifiants des équipes.
2. Procédure ajoutEquipe
Écrire une procédure ajoutEquipe permettant d'insérer les équipes suivantes :
- Numéro 1 : FPS
- Numéro 2 : EST
- Numéro 3 : ENSA
- Numéro 4 : ISTIA
3. Procédure ajoutMatch
Écrire une procédure pour ajouter un match à la table MATCH, en mettant à jour les statistiques des équipes (buts marqués, buts encaissés, matchs gagnés, nuls, perdus) et leurs points.
Exemple de données à insérer :
- Équipe 1 (FPS) vs Équipe 2 (EST) : Score 1-2, Journée 1
- Équipe 3 (ENSA) vs Équipe 4 (ISTIA) : Score 3-4, Journée 1
- Équipe 2 (EST) vs Équipe 4 (ISTIA) : Score 2-2, Journée 2
- Équipe 1 (FPS) vs Équipe 3 (ENSA) : Score 1-3, Journée 2
- Équipe 2 (EST) vs Équipe 3 (ENSA) : Score 2-3, Journée 3
- Équipe 1 (FPS) vs Équipe 4 (ISTIA) : Score 0-0, Journée 3
4. Procédure affichageClassement
Écrire une procédure qui affiche le classement des équipes selon :
- Nombre de points (3 pour une victoire, 1 pour un nul, 0 pour une défaite)
- Goal average (buts marqués / buts encaissés)
- Nombre de buts marqués
5. Fonction classement
Écrire une fonction classement prenant en paramètre un identifiant d'équipe et retournant sa position dans le classement.
6. Déclencheur pour l'ajout d'un match
Refaire l'exercice en utilisant un déclencheur (TRIGGER) pour automatiser la mise à jour des statistiques des équipes lors de l'ajout d'un match.
Exercice 1 : Forum de Discussion
1. Séquences pour les tables
Créer trois séquences :
sequtipour les identifiants des utilisateursseqmespour les identifiants des messagesseqsalpour les identifiants des salles
2. Procédure ajoutUtilisateur
Écrire une procédure pour ajouter un nouvel utilisateur avec les champs : nom, mail, date_inscription, nb_action.
3. Ajout d'utilisateurs
Utiliser la procédure ajoutUtilisateur pour insérer des utilisateurs fictifs (exemples : "Jean Dupont", "jdupont@example.com", etc.).
4. Procédure ajoutSalle
Écrire une procédure pour ajouter une nouvelle salle avec les champs : theme, id_mod, nb_thread.
5. Ajout de salles
Utiliser la procédure ajoutSalle pour créer des salles fictives (exemples : "Informatique", "Gestion", etc.).
6. Procédure posterMessage
Écrire une procédure pour poster un message avec les champs : id_parent, id_auteur, date_envoi, id_salle, corps, etat.
Mettre à jour automatiquement l'identifiant du modérateur si le message est le plus récent dans la salle.
7. Déclencheur pour nb_action
Créer un déclencheur (TRIGGER) qui incrémente automatiquement nb_action pour l'auteur d'un message lors de son insertion.
8. Procédure cloreSujet
Écrire une procédure pour clore un sujet, générant une erreur si l'utilisateur n'est pas modérateur de la salle.
9. Procédure bloquerReponse
Écrire une procédure pour empêcher toute réponse à un sujet déjà clos.
10. Affichage de l'arborescence des messages
Créer une procédure pour afficher la structure hiérarchique des messages (parents et fils).
11. Protection contre la suppression des messages avec réponses
Implémenter une solution (déclencheur ou contrainte) pour empêcher la suppression d'un message ayant des réponses.
Exercice 2 : Gestion de Stock
1. Déclencheur pour ACommander
Créer un déclencheur (TRIGGER) qui insère une ligne dans ACommander lorsque la quantité en stock (qte_enstock) d'un produit tombe en dessous du seuil minimum (qteminimum).
2. Déclencheur pour Commande et LigneCommande
Créer un déclencheur (TRIGGER) qui met à jour automatiquement :
- Le montant total de la commande (
montantCommande) lors de l'ajout ou modification d'une ligne de commande - La quantité en stock (
qte_enstock) du produit correspondant
Exercice 3 : Commandes de Produits
1. Traitement des commandes clients
Écrire un programme PL/SQL pour gérer les commandes clients :
- Si
QteC>QteStock, alorsEtat= "en attente" - Si
QteC≤QteStock, alorsEtat= "envoyée" et diminuerQteStockdeQteC
2. Lancement des commandes fournisseurs
Écrire un programme PL/SQL pour lancer les commandes chez les fournisseurs pour les produits à réapprovisionner, en utilisant un curseur paramétré pour trouver le meilleur prix.
Gérer le cas où aucun fournisseur ne peut proposer le produit.
Exercice 4 : Élections du BDE
Première Partie : Élection du Président du BDE
Considérer le schéma relationnel :
Filiere(#idfil, nomfil)Electeurs(#idelec, nom, pnom, ddn, nvot, nvoix, cand, idfil#)
1. Séquences pour Filiere et Electeurs
Créer deux séquences : une pour les identifiants des filières et une pour les identifiants des électeurs.
2. Procédure ajoutFiliere
Écrire une procédure pour ajouter une nouvelle filière avec les champs nomfil.
3. Procédure inscrireElecteur
Écrire une procédure pour inscrire un nouvel électeur avec les champs nom, pnom, ddn, idfil.
4. Procédure devenirCandidat
Écrire une procédure pour permettre à un électeur de devenir candidat.
5. Procédure voterPresident
Écrire une procédure pour permettre à un électeur de voter pour le président du BDE.
6. Procédure resultatPresident
Écrire une procédure pour afficher le gagnant de l'élection du président du BDE.
Seconde Partie : Élection des Représentants
Considérer le schéma relationnel :
Electeurs(#idelec, nom, pnom, ddn, nvot, nvoix, cand)
1. Séquence pour Electeurs
Créer une séquence pour générer automatiquement les identifiants des électeurs.
2. Procédure inscrireElecteur
Écrire une procédure pour inscrire un nouvel électeur avec les champs nom, pnom, ddn.
3. Procédure devenirCandidat
Écrire une procédure pour permettre à un électeur de devenir candidat.
4. Procédure voterRepresentants
Écrire une procédure pour permettre à un électeur de voter pour 3 représentants de sa filière.
5. Procédure resultatRepresentants
Écrire une procédure pour afficher les trois gagnants de l'élection des représentants par filière.
Exercice 5 : Bibliothèque
Contraintes à implémenter
Les tables suivantes sont définies :
personne(#numpers, nompers, prenompers)adherent(#numpers#, mailadherent, daterenouvellement, nb_exemplaires)ouvrage(#numouvrage, numauteur#, titreouvrage)exemplaire(#numouvrage#, #numexemplaire, empruntable, num_adherent)emprunter(#numadherent#, (#numouvrage#, #numexemplaire#), dateemprunt, dateretour)
1. Ajout d'un champ nb_exemplaires dans adherent
Ajouter un champ nb_exemplaires pour compter le nombre d'exemplaires en circulation.
2. Ajout d'un champ num_adherent dans exemplaire
Ajouter un champ num_adherent pour identifier l'adhérent en possession de l'exemplaire.
3. Déclencheurs pour les contraintes
Créer des déclencheurs (TRIGGER) pour maintenir à jour les champs nb_exemplaires et num_adherent selon les règles suivantes :
- Un exemplaire non empruntable ne peut pas être emprunté.
- Un exemplaire ne peut pas être en possession de deux adhérents à la fois.
- Un adhérent ne peut pas être en possession de deux exemplaires différents d'un même ouvrage.
- Un adhérent ne peut pas emprunter si son abonnement n'est pas à jour.
- Un adhérent ne peut pas être en possession de plus de cinq livres.
- Une même personne ne peut pas être à la fois auteur et adhérent.
- Un adhérent ne peut pas être en possession de plus de cinq ouvrages.
Exercice 6 : Arbre Généalogique
1. Fonction demi-frères
Écrire une fonction demi_freres prenant deux numéros de personnes et retournant TRUE si elles ont un parent commun.
2. Fonction cousins germains
Écrire une fonction cousins_germains prenant deux numéros de personnes et retournant TRUE si elles sont cousins germains.
3. Procédure récursive affichageAscendants
Écrire une procédure récursive affichant le nom d'une personne et de ses ascendants masculins.
4. Procédure récursive affichageAncestresMasculins
Écrire une procédure récursive affichant uniquement les ascendants masculins d'une personne.
5. Fonction récursive ascendantDirect
Écrire une fonction récursive prenant deux numéros de personnes A et B et retournant TRUE si A est un ascendant direct de B.
6. Fonction récursive nombreGenerations
Écrire une fonction récursive retournant le nombre de générations entre deux personnes si l'une est un ascendant de l'autre, ou -1 sinon.
7. Requête couplesMaxGenerations
Écrire une requête retournant les couples de personnes séparés par le plus grand nombre de générations.
FAQ
Qu'est-ce qu'une séquence en SQL ?
Une séquence est un objet de base de données qui génère automatiquement des valeurs numériques uniques, souvent utilisé pour assigner des identifiants primaires.
Comment fonctionne un déclencheur (TRIGGER) ?
Un déclencheur est un programme stocké qui s'exécute automatiquement en réponse à une action sur une table, comme une insertion, une mise à jour ou une suppression.
Quelle est la différence entre une procédure et une fonction en PL/SQL ?
Une procédure exécute une série d'instructions sans retourner de valeur, tandis qu'une fonction retourne une valeur et peut être utilisée dans une expression ou une requête.