Vous êtes sur la page 1sur 3

BD - 2eme semestre - Spcialit ELI3

TP5 : PL/SQL
Partie 1 : Tournoi de Tennis (exercices corrigs, 2h30)
Crer un nouveau fichier sql. Ouvrez-le avec un diteur de texte. Importation : Tlchargez le fichier http://webia.lip6.fr/~lepape/ens/bd/tennis_oracle.sql Importer dans oracle la base de donnes partir du fichier sql tlcharg. Le schma de la base que vous venez dimporter est :

JOUEUR (NUJOUEUR, NOM, PRENOM, ANNAIS, NATIONALITE) GAIN (NUJOUEUR*, LIEUTOURNOI, ANNEE, PRIME, SPONSOR) RENCONTRE (NUGAGNANT*, NUPERDANT*, LIEUTOURNOI, ANNEE)
Exercice 1 : Les triggers 1. Que fait le trigger dfini dans le script tennis_oracle.sql ? 2. Ecrire un trigger nomm trig1 qui chaque insertion dans la table Joueur transforme le champs Nom en majuscule. 3. Tester ce trigger en excutant la requte suivante : INSERT INTO Joueur (Nom, Prenom, AnNais, Nationalite) VALUES ('gasket', 'Richard', 1986, 'France') ; 4. Modifier le trigger prcdent pour pouvoir grer de la mme faon les mises jour de Nom dans Joueur. 5. Tester le trigger trig1 en excutant la requte suivante : UPDATE Joueur SET Nom='Gasquet' WHERE Nom='GASKET' ; 6. Ecrire un trigger trig2 qui se dclenche avant l'insertion d'un tuple dans la table Gain, et qui transforme la valeur de la prime en euro si la date du tournoi est antrieure 2001. Taux de conversion : 1 franc = 0,152 7. Tester ce trigger en excutant les requtes suivantes : INSERT INTO Gain VALUES (1, 'Roland Garros', 2001, 100, 'Nike') ; INSERT INTO Gain VALUES (1, 'Roland Garros', 2000, 100, 'Nike') ; !! Pensez supprimer ces insertions avant de poursuivre : DELETE FROM Gain WHERE Prime=100; DELETE FROM Gain WHERE Prime=100*0.152; Exercice 2 : PL/SQL : Requtes rsultat unique 1. Ecrire un script moyennePrime.sql permettant de : prendre en entre un lieu de tournoi et une anne (saisies utilisateur) fournir en sortie la moyenne des primes obtenues lors du tournoi pour cette anne effectuer une gestion d'exception si la moyenne des primes est null. 2. Tester le script pour : Roland Garros 1992 Wimbledon 2000 3. Ecrire un script moyennePrime2.sql similaire, mais sans utiliser d'exception.

(Aide : Il suffit pour cela d'effectuer l'affichage avec une condition if...then...else...)

BD - 2eme semestre - Spcialit ELI3 4. Tester le script pour :


Roland Garros 1992 Wimbledon 2000

Exercice 3 : PL/SQL : Requtes rsultat multiple, utilisation des curseurs 1. Ecrire un script primeJoueur.sql permettant de : prendre en entre deux anne (saisies utilisateur) fournir en sortie pour chaque joueur la plus forte prime qu'il a touche entre les deux annes saisies par l'utilisateur Tester avec : (Anne de dpart : 1989, Anne de fin : 1992) (Anne de dpart : 1974, Anne de fin : 1985) 2. Ecrire le script joueurSponsor.sql permettant de : prendre en entre le nom du sponsor (saisie utilisateur) fournir en sortie le nom des joueurs sponsoriss par le sponsor saisi par l'utilisateur Tester avec : Reebok Diadora Toto

Partie 2 : gestion des enseignants ( exercice rendre, 1h30)


Importation : Tlchargez le fichier http://webia.lip6.fr/~lepape/ens/bd/enseignant_oracle.sql et importez le en suivant la procdure donne dans la premire partie. Le schma de la base que vous venez dimporter est :

GRADE (legrade, nomgrade, hstat) ENSEIGNANT(noinsee, nomp, prenomp,legrade*, ville) TYPE(letype, nomtype) FILIERE(codef, nomf) UNITE((codef*,nunite), coef ) SERVICE(noinsee*, (codef , nunite)*,letype*, heures )

Vous placerez vos requtes SQL dans le fichier texte suivant tp5_nom1_nom2.sql, o nom1 et

nom2 sont les logins du binme. 1. (2 pts) Ecrire un script PL/SQL permettant de :
remplacer les horaires statutaires de 192h dans la table grade par 200h. afficher 'Aucune ligne modifiee' si aucun grade de 192h n'est trouv afficher le nombre de lignes modifies si des grades de 192h sont trouvs et modifis

2. (1pt) Modifier le script prcdent en procdure PL/SQL. A l'aide de cette procdure, remplacer
les horaires statutaires de 200h dans la table grade par 192h. 3. (1pt)Ecrire un script PL/SQL permettant de : prendre en entre le code de grade (saisie utilisateur)

BD - 2eme semestre - Spcialit ELI3


afficher en sortie le nom du grade et le nombre d'heures lever une exception qui affiche 'Grade inexistant' si le code grade n'est pas dans la table

4. (1pt) Ecrire un script PL/SQL permettant de :


prendre en entre un code de grade, un nom de grade et le nombre d'heures (saisies utilisateur) insrer ce tuple dans la table grade afficher 'Nouveau grade insere' en cas de succs lever une exception qui affiche 'Grade deja present' si le code grade est dj prsent dans la table

Tester ce script avec le tuple : (DP,Directeur de projet,324) saisi par lutilisateur.

5. (1pt) Ecrire un trigger de contrle permettant de :


empcher l'insertion de grades aprs 17h (Affichez un message d'erreur en cas de tentative aprs 17h!)

6. (1pt) Modifier ce trigger pour qu'il interdise galement les modifications dans la table grade aprs
21h. 7. (1pt) Ecrire un script PL/SQL permettant de : prendre en entre un nom de ville (saisie utilisateur) afficher le nom des enseignants par ville grer les cas d'afficher o la liste des noms d'enseignants est vide Tester ce script avec 'Dijon' puis 'Toulon'. 8. (2 pts) a) Crer la table suivimodif, qui contiendra les enregistrements des modifications dans grade. suivimodif est constitue de : - date_connexion, au format DATE - nomtable, au format VARCHAR2(20) - modif, au format CHAR(1) - clefligne, au format VARCHAR2(20) b) Ecrire un trigger permettant de replir la table suivimodif aprs chaque insertion ou modification de grade : Pour une insertion dans la table grade, insrer dans suivimodif le tuple (SYSDATE,'grade','I',:new.legrade) Pour une modification dans la table grade, insrer dans suivimodif le tuple (SYSDATE,'grade','U',:old.legrade)

Partie 3 : Soumission du TP
Soumettre votre fichier tp5_nom1_nom2.sql ladresse de votre charg de TP en prcisant le sujet suivant : [BD] tp5 nom1 nom2.