Académique Documents
Professionnel Documents
Culture Documents
Systeme de Gestion de Base de Donnees
Systeme de Gestion de Base de Donnees
Système de Gestion
de Base de Données
2ème année Licence Fondamentale
en Informatique Appliquée à la Gestion
Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV. Les triggers
Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV. Les triggers
Clés primaires
#Clés étrangères
Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV. Les triggers
II.1. Généralités
— SQL :
LDD (Langage de Définition de Données) :
création, modification et suppression des définitions des
tables
LMD (Langage de Manipulation de Données) :
ajout, suppression, modification et interrogation des
données
LCD (Langage de Contrôle de Données) :
gestion des protections d’accès
—Fin d’instruction : ;
—Commentaires: /* … */ ou --commentaire
Modifications d’attributs
ALTER TABLE nom_table
MODIFY (attribut TYPE, …);
ex. ALTER TABLE Client
MODIFY (tel NUMBER(10));
Suppression d’attributs
ALTER TABLE nom_table
DROP COLUMN attribut,…;
ex. ALTER TABLE Client
DROP COLUMN tel;
Suppression de contrainte
ALTER TABLE nom_table
DROP CONSTRAINT nom_contrainte;
ex. ALTER TABLE Client
DROP CONSTRAINT chkVille ;
Tri du résultat
ex. Par ordre alphabétique inverse de nom
SELECT * FROM Client
ORDER BY Nom DESC;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 30
Projection
ex. Noms et Prénoms des clients, uniquement
SELECT Nom, Prenom FROM Client;
Restriction
ex. Clients qui habitent à Jendouba
SELECT * FROM Client WHERE Ville = ‘Jendouba’;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 31
COUNT(NumCli)
Résultat = 3
COUNT(DISTINCT NumCli)
Résultat = 2
SELECT Nom
FROM Client
WHERE NumCli IN (
SELECT NumCli
FROM Commande
WHERE Date = ‘28-02-2013’
);
SELECT *
FROM Client C1
WHERE [NOT] EXISTS (
SELECT *
FROM Commande C2
WHERE C1.NumCli = C2.NumCli);
Exercice d’application
Soit le schéma relationnel suivant :
Exercice d’application
Q1) Liste des clients.
SELECT *
FROM Client;
Ou
SELECT Codeclt, Nom, Adr, Tel
FROM Client;
Exercice d’application
Q1) Liste des clients.
Résultat
Codeclt Nom Adr Tel
JEN10121 Ali Jendouba
BEJ00175 Mohamed Beja 78784564
JEN10124 Karim Jendouba 78601457
KEF10167 Insaf Kef
JEN45786 Manel Jendouba 78604575
KEF24578 Walid Kef 78975463
BEJ14544 Marwa Beja
TUN14577 Abir Tunis 71245544
JEN145454 Ridha Jendouba
TUN14578 Nabiha Tunis
Exercice d’application
Q2) Liste des clients qui habitent à Jendouba.
SELECT *
FROM Client
WHERE Adr=‘Jendouba’;
Ou
SELECT Codeclt, Nom, Adr, Tel
FROM Client
WHERE Adr=‘Jendouba’;
Exercice d’application
Q2) Liste des clients qui habitent à Jendouba.
Résultat
Codeclt Nom Adr Tel
JEN10121 Ali Jendouba
JEN10124 Karim Jendouba 78601457
JEN45786 Manel Jendouba 78604575
JEN145454 Ridha Jendouba
Exercice d’application
Q3) Noms des clients qui habitent à Jendouba
ordonné par ordre alphabétique.
SELECT Nom
FROM Client
WHERE Adr=‘Jendouba’
ORDER BY Nom;
Exercice d’application
Q3) Noms des clients qui habitent à Jendouba
ordonné par ordre alphabétique.
Résultat
Nom
Ali
Karim
Manel
Ridha
Exercice d’application
Q4) Noms des clients qui habitent à Jendouba et
Beja.
SELECT Nom
FROM Client
WHERE Adr=‘Jendouba’
AND Adr =‘Beja’;
Ou
SELECT Nom
FROM Client
WHERE Adr IN (‘Jendouba’,‘Beja’);
56
Exercice d’application
Q4) Noms des clients qui habitent à Jendouba
et Beja.
Résultat
Nom
Ali
Mohamed
Karim
Manel
Marwa
Ridha
Exercice d’application
Q5) Noms et adresse des clients qui n’ont pas
de numéro de téléphone.
SELECT Nom,Adr
FROM Client
WHERE Tel IS NULL;
Exercice d’application
Q5) Noms et adresse des clients qui n’ont pas
de numéro de téléphone.
Résultat
Nom Adr
Ali Jendouba
Insaf Kef
Marwa Beja
Ridha Jendouba
Nabiha Tunis
Exercice d’application
Q6) Noms des clients qui commencent par ‘A’
et qui habitent à Tunis.
SELECT Nom
FROM Client
WHERE Nom LIKE ‘A%’
AND Adr=‘Tunis’;
Exercice d’application
Q6) Noms des clients qui commencent par ‘A’
et qui habitent à Tunis.
Résultat
Nom
Abir
Exercice d’application
Q7)Noms des clients qui ont passé des
commandes.
SELECT Distinct Nom
FROM Client CL, Commande CD
WHERE CL.Codeclt = CD.Codeclt;
Exercice d’application
Q7)Noms des clients qui ont passé des
commandes.
SELECT Nom
FROM Client
WHERE Codeclt In (SELECT Codeclt
FROM Commande);
Exercice d’application
Q7)Noms des clients qui ont passé des
commandes.
SELECT Nom
FROM Client CL
WHERE Exists
(SELECT *
FROM Commande CD
WHERE CL.Codeclt = CD.Codeclt);
Exercice d’application
Q7)Noms des clients qui ont passé des
commandes.
SELECT Nom
FROM Client CL
WHERE
(SELECT COUNT(*)
FROM Commande CD
WHERE CL.Codeclt = CD.Codeclt)>0;
Exercice d’application
Q7)Noms des clients qui ont passé des
commandes.
Résultat
Nom
Ali
Mohamed
Insaf
Manel
Walid
Abir
Exercice d’application
Q8)Noms des clients qui ont passé au plus une
commande.
Exercice d’application
Q9)Noms des clients qui n’ont pas passé des
commandes.
SELECT Nom
FROM Client
WHERE Codeclt Not In (SELECT Codeclt
FROM Commande);
Exercice d’application
Q9)Noms des clients qui n’ont pas passé des
commandes.
SELECT Nom
FROM Client CL
WHERE Not Exists
(SELECT *
FROM Commande CD
WHERE CL.Codeclt = CD.Codeclt);
Exercice d’application
Q9)Noms des clients qui n’ont pas passé des
commandes.
SELECT Nom
FROM Client CL
WHERE
(SELECT COUNT(*)
FROM Commande CD
WHERE CL.Codeclt = CD.Codeclt)=0;
Exercice d’application
Q9)Noms des clients qui ont passé des
commandes.
Résultat
Nom
Karim
Marwa
Ridha
Nabiha
Exercice d’application
Q10)Noms et adresses des clients qui ont passé
des commandes pendant l’année 2013.
SELECT DISTINCT Nom,Adr
FROM Client CL, Commande CD
WHERE CL.Codeclt = CD.Codeclt
AND (Datecmd Between ’01/01/2013’ AND ‘31/12/2013’);
Exercice d’application
Q10)Noms et adresses des clients qui ont passé
des commandes pendant l’année 2013.
SELECT Nom,Adr
FROM Client
WHERE Codeclt In
(SELECT Codeclt
FROM Commande
WHERE Datecmd Between ’01/01/2013’ AND ‘31/12/2013’
);
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 73
Exercice d’application
Q10)Noms et adresses des clients qui ont passé des
commandes pendant l’année 2013.
SELECT Nom,Adr
FROM Client CL
WHERE Exists
( SELECT *
FROM Commande CD
WHERE (Datecmd Between ’01/01/2013’ AND ‘31/12/2013’)
AND CL.Codeclt = CD.Codeclt
);
Exercice d’application
Q10)Noms et adresses des clients qui ont passé
des commandes pendant l’année 2013.
SELECT Nom,Adr
FROM Client CL
WHERE
(SELECT COUNT(*)
FROM Commande CD
WHERE (Datecmd Between ’01/01/2013’ AND ‘31/12/2013’)
AND CL.Codeclt = CD.Codeclt)>0;
Exercice d’application
Q10)Noms et adresses des clients qui ont passé
des commandes pendant l’année 2013.
Résultat
Nom Adr
Ali Jendouba
Mohamed Beja
Insaf Kef
Manel Jendouba
Walid Kef
Abir Tunis
Exercice d’application
Q11)Nombre total des commandes passé
pendant l’année 2013.
SELECT COUNT(*)
FROM Commande
WHERE Datecmd Between ’01/01/2013’ AND ‘31/12/2013’;
Exercice d’application
Q11)Nombre total des commandes passé
pendant l’année 2013.
Résultat
Expr1000
10
Exercice d’application
Q12)Nombre des clients qui ont passé des
commandes en 2013.
SELECT COUNT(Distinct Codeclt)
FROM Commande
WHERE Datecmd Between ’01/01/2013’ AND ‘31/12/2013’;
Exercice d’application
Q12)Nombre des clients qui ont passé des
commandes en 2013.
Résultat
Expr1000
6
Exercice d’application
Q13)Nombre de commandes par client
(indiqué le nom du client).
SELECT Nom,COUNT(*)
FROM Client CL, Commande CD
WHERE CL.Codeclt = CD.Codeclt
GROUP BY Nom;
81
Exercice d’application
Q13)Nombre de commandes par client
(indiqué le nom du client).
Résultat
Nom Expr1001
Abir 1
Ali 1
Insaf 3
Manel 1
Mohamed 1
Walid 3
Exercice d’application
Q14)La somme et la moyenne des prix des
produits commandés.).
Exercice d’application
Q14)La somme et la moyenne des prix des
produits commandés.
Résultat
Expr1000 Expr1001
30222.5942420959 1679.03301344977
Exercice d’application
Q15)Désignation des produits qui sont les plus
vendus.
SELECT Designation
FROM Produit P, Ligne_Commande L
WHERE P.Codeprod = L.codeprod
HAVING Count(*)= Max(
SELECT (Count(codeprod))
FROM Ligne_Commande
GROUP BY codeprod)
GROUP BY Designation;
Exercice d’application
Q15)Désignation des produits qui sont les plus
vendus.
Résultat
Designation
Chemise
Pantalon
Pull
Exercice d’application
Q16)Désignation des produits qui sont commandés en
mois de janvier 2013 par des clients de Jendouba.
SELECT Designation
FROM Produit P, Ligne_Commande L,
Commande CD, Client CL
WHERE P.Codeprod = L.Codeprod
AND L.Numcmd = CD.Numcmd
AND CD.Codeclt = CL.Codeclt
AND (Datecmd Between ’01/01/2013’ AND ‘31/01/2013’)
AND Adr = ‘Jendouba’;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 87
Exercice d’application
Q16)Désignation des produits qui sont commandés en
mois de janvier 2013 par des clients de Jendouba.
Résultat
Designation
Exercice d’application
Q17)Nom des clients qui ont commandé le même produit que Abir.
SELECT Distinct Nom
FROM Client CL, Commande CD, Ligne_commande L
WHERE CL.Codeclt = CD.Codeclt
AND CD.Numcmd = L.Numcmd
AND Codeprod =
(SELECT Codeprod
FROM Ligne_commande L,Commande CD,
Client CL
WHERE L.Numcmd = CD.Numcmd
AND CD.Codeclt = CL.Codeclt
AND Nom=‘Abir’)
AND Nom<>’Abir’;
Exercice d’application
Q17)Nom des clients qui ont commandé le même
produit que Abir.
Résultat
Nom
Insaf
Moham
ed
Walid
Exercice d’application
Q18)Les clients(Nom) de la même ville et qui ont commandé le même produit que Abir.
SELECT CL1.Nom, CL2.Nom,
FROM Client CL1, Client CL2,
Commande CD,Ligne_Commande L,Produit P
WHERE CL1.Codeclt = CD.Codeclt
AND CD.Numcmd = L.Numcmd
AND L.Codeprod = P.Codeprod
AND CL1.Adr = CL2.Adr
AND Codeprod =
(SELECT Codeprod
FROM Ligne_commande L,Commande CD,
Client CL
WHERE L.Numcmd = CD.Numcmd
AND CD.Codeclt = CL.Codeclt
AND Nom=‘Abir’)
AND CL1.Nom<>CL2.Nom
AND CL1.Nom<>’Abir’;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 91
Exercice d’application
Q18)Les clients(Nom) de la même ville et qui ont
commandé le même produit que Abir.
Résultat
CL1.Nom CL2.Nom
Insaf Walid
Mohamed Marwa
Exercice d’application
Q19)Nom des clients qui ont commandé tous les produits.
SELECT Nom
FROM Client CL
WHERE
NOT EXISTS (
SELECT *
FROM Produit P
WHERE NOT EXISTS(
SELECT *
FROM Commande CD, Ligne_Commande L
WHERE CL.Codeclt = CD.Codeclt
AND CD.Numcmd = L.Numcmd
AND L.Codeprod = P.Codeprod));
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 93
Exercice d’application
Q19)Nom des clients qui ont commandé tous les
produits.
SELECT Nom
FROM Client CL,Commande CD,Ligne_Commande L
WHERE CL.Codeclt = CD.Codeclt
AND CD.Numcmd = L.Numcmd
GROUP BY Nom
HAVING Count(Distinct Codeprod)=
(SELECT Count(*) FROM Produit);
Exercice d’application
Q19)Nom des clients qui ont commandé tous les
produits.
Résultat
Nom
Insaf
Walid
Privilèges :
SELECT : lecture
INSERT : insertion
UPDATE : mise à jour
DELETE : suppression
ALL : tous les privilèges
ALTER : destruction
INDEX : construction d’index
Suppression de privilèges
REVOKE privilège ON table|vue
FROM user|PUBLIC;
Plan du cours
I. Introduction
II. Le langage SQL
III.PL/SQL
IV. Les triggers
III.1. Généralités
PL/SQL : Langage procédural
Extension de SQL
III.1. Généralités
Avantages :
– Support de SQL, y compris en dynamique
– Support de programmation orientée-objet
– Performance (traitements par lot)
– Productivité (uniformité dans tous les outils)
– Portabilité (sur tous systèmes Oracle)
– Intégration étroite avec Oracle (mêmes types de
données que SQL, par exemple)
– Sécurité (procédures stockées, déclencheurs)
BEGIN
--Commandes/instructions
EXCEPTION
--Traitement des erreurs à l’exé.
END;
III.3. Déclarations
III.3. Déclarations
– Partie déclarative d’un bloc PL/SQL ou d’un sous-
programme
– Variables
ex. date_naissance DATE;
compteur INTEGER:=0; -- Valeur par défaut
compteur INTEGER DEFAULT 0; -- idem
id VARCHAR(5) NOT NULL:=‘AP001’;
– Constantes
ex. pi CONSTANT REAL:=3.141592;
III.3. Déclarations
IF condition1 THEN
-- Instructions
ELSEIF condition2 THEN
-- Instructions
ELSE
-- Instructions
END IF;
Boucle pour
FOR compteur IN [REVERSE] min..max LOOP
-- Instructions
END LOOP;
Boucle tant que
WHILE condition LOOP
-- Instructions
END LOOP;
Boucle "infinie"
LOOP
-- Instructions
END LOOP;
III.6. Affichage
DBMS_OUTPUT.PUT_LINE('chaîne');
DBMS_OUTPUT.PUT_LINE('Bonjour');
DBMS_OUTPUT.PUT_LINE('nom='||nom);
DBMS_OUTPUT.PUT_LINE('num='||TO_CHAR(num));
III.6. Affichage
Exemple
-- Affichage en dinars d'un salaire stocké en euros
DECLARE
euro CONSTANT REAL := 2.0125;
salaire emp.sal%TYPE;
BEGIN
-- Affectation
SELECT sal INTO salaire FROM emp
WHERE ename='BOUSLIMI';
-- Conversion
salaire := salaire * euro;
-- Affichage
DBMS_OUTPUT.PUT_LINE(TO_CHAR(salaire)||' DT');
END;
III.9. Curseurs
– Curseur : structure de données permettant de
stocker le résultat d’une requêtes qui retourne
plusieurs tuples
III.9. Curseurs
-- Exemple de parcours complet
DECLARE
CURSOR calcul IS
SELECT numprod, prixuni*1.206 prixttc
FROM produit;
tuple calcul%ROWTYPE;
BEGIN
FOR tuple IN calcul LOOP
DBMS_OUTPUT.PUT_LINE(
TO_CHAR(tuple.numprod)
||' : '||
TO_CHAR(tuple.prixttc));
END LOOP;
END;
III.9. Curseurs
-- Exemple de parcours personnalisé
DECLARE
...
BEGIN
OPEN calcul;
LOOP
FETCH calcul INTO tuple;
EXIT WHEN calcul%NOTFOUND;
...
END LOOP;
CLOSE calcul;
END;
III.9. Curseurs
– Attributs des curseurs
III.8. Exceptions
– À chaque erreur à l’exécution, une exception est
levée. Ces exceptions sont gérées par des routines
séparées.
III.8. Exceptions
– Exceptions prédéfinies
Nom Code erreur SQLCODE
CURSOR_ALREADY_OPEN ORA-06511 -6511
DUP_VAL_ON_INDEX ORA-00001 -1
INVALID_CURSOR ORA-01001 -1001
INVALID_NUMBER ORA-01722 -1722
LOGIN_DENIED ORA-01017 -1017
NO_DATA_FOUND ORA-01403 -1403
NOT_LOGGED_ON ORA-01012 -1012
PROGRAM_ERROR ORA-06501 -6501
STORAGE_ERROR ORA-06500 -6500
TIMEOUT_ON_RESOURCE ORA-00051 -51
TOO_MANY_ROWS ORA-01422 -1422
VALUE_ERROR ORA-06502 -6502
ZERO_DIVIDE ORA-01476 -1476
III.8. Exceptions
– Exceptions personnalisées
III.9. Sous-programmes
– Fonctions
III.9. Sous-programmes
– Procédures
PROCEDURE nomp (param1, param2…) IS
-- Déclarations locales
BEGIN
-- Instructions
EXCEPTION
-- Traitement des exceptions
END;
– Paramètres
nom_param [IN|OUT|IN OUT] TYPE
ex. resultat OUT REAL
IN : Paramètre en entrée
OUT : Paramètre en sortie
IN OUT : Paramètre en entrée-sortie
DECLARE
nbp NUMBER(3);
aucun_produit EXCEPTION;
CURSOR calcul IS
SELECT numprod, prixuni*1.206 prixttc
FROM produit;
tuple calcul%ROWTYPE;
-- Validation de la transaction
COMMIT;
EXCEPTION
END;
Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV.Les triggers
IV.1. Définition
– Trigger (déclencheur) : routine déclenchée
automatiquement par des événements liés à
des actions sur la base
Avant 1 2 3
Après 4 5 6
– Variables spécifiques
:OLD.nom_attribut : valeur de l’attribut avant mise à jour
:NEW.nom_attribut : valeur de l’attribut après mise à jour
DECLARE
n INTEGER;
cle_existe EXCEPTION;
cle_nulle EXCEPTION;
BEGIN
-- Existence de la clé primaire
SELECT COUNT(numcli) INTO n FROM client
WHERE numcli=:NEW.numcli;
IF n>0 THEN
RAISE cle_existe;
END IF
EXCEPTION
WHEN cle_existe THEN
RAISE_APPLICATION_ERROR(-20501,
‘Clé primaire déjà utilisée !’);
WHEN cle_nulle THEN
RAISE_APPLICATION_ERROR(-20502,
‘La clé primaire doit avoir une valeur!’);
END;
Fin du cours
142
TP n°1
Objectifs de la séance
Table Article
Colonne Type Taille Contrainte
Code_Art Chaine 20 Clé primaire
Des_Art Chaine 50 Non nulle
PU Numérique (8,3) (PU>0)
Qte_stock Numérique 5 (Valeur par défaut =0) et (Qtes_stock ≥0)
Table Client
Colonne Type Taille Contrainte
Code_client Chaine 20 Clé primaire
Nom_client Chaine 20 Non nulle
Prenom_client Chaine 30
Adr_client Chaine 20 Non nulle
Tel_client Numérique 8
Email_client Chaine 50
Chiffre_affaires_annee_en_cours Numérique (10,3)
Cumul_chiffre_affaires Numérique (12,3)
Page 1/2
Table Commande
Colonne Type Taille Contrainte
Num_comm Chaine 20 Clé primaire
Date_comm Date Date_comm≤Aujourd’hui
Code_client Chaine 20 Clé étrangère
Table Detail_commande
Colonne Type Taille Contrainte
Num_comm Chaine 20 Clé primaire + Clé étrangère
Code_art Chaine 20 Clé primaire + Clé étrangère
Qte_comm Numérique 3 Qte_comm>0
2. Ajouter les contraintes des clés primaires et étrangères des tables déjà créées.
3. Créer une copie de la table Client nommé "Clientele"
4. Renommer la table "Detail_commande" par "Ligne_commande";
5. Ajouter à la table "Ligne_Commande" le champ "PrixVente" de Type Numérique(8,3);
6. Augmenter la taille du champ "Adresse" de la table "Client" de 20 à 50 caractères;
7. Ajouter une valeur 'prénom inconnu' comme valeur par défaut au champ
"Prenom_client" de la table "Client";
8. Ajouter une contrainte du domaine sur les champs "Adr_client" de la table "Client" pour
qu'elle soit limiter aux trois régions : 'Kef', 'Jendouba' et 'Beja';
9. Modifier le type de données du champ "Tel_client" en Numérique(taille 8);
10. Supprimer le champ "Email_client" de la table Client;
11. Supprimer la table "Client".
Mise à jour de la base de données
1. Remplir les tables de la base créée par les données indiquées dans les tableaux suivants :
Table Client
Code_Client Nom_ Prenom_ Adr_client Tel_Client Email_client Chiffre... Cumul..
S0010 BRINSI Sami Jendouba 66536658 brinssi.sami@gmail.tn 15679,355 123765,540
T0122 ABIDI Nadia Tunis 66335297 abidi.nadia@topnet.tn 54987,210 339807,250
M523 HAMDI Amine Beja 54578789 hamdi.amine@orange.tn 22765,705 564700,590
Table Detail_commande
Num_comm Code_Art Qte_comm
001123/2013 CD700 5
007845/2013 AppPho 4
3. Modifier l’article dont le code ''CD700'' par le prix égal à 0.500 et par la quantité en stock 100.
4. Supprimer la commande n°003400/2013.
Page 2/2
Correction du TP n°1
Schéma relationnel d’une base de données de gestion de stock :
Article(Code_art, Des_art, PU, Qte_stock)
Client(Code_client, Nom_client, Prenom_client, Adr_client, Tel_client, email_client,
Chiffre_affaires_annee_encours, Cumul_chiffre_affaires)
Commande(Num_comm, date_comm, #code_client)
Détail_Command(#Num_comm,#Code_art,Qte_comm)
Page 1/4
2. Ajouter les contraintes des clés primaires et étrangères des tables déjà créées.
Page 2/4
7. Ajouter une valeur 'prénom inconnu' comme valeur par défaut au champ
"Prenom_client" de la table "Client";
8. Ajouter une contrainte du domaine sur les champs "Adr_client" de la table "Client"
pour qu'elle soit limiter aux trois régions : 'Kef', 'Jendouba' et 'Beja'.
--********************************************************************
Page 3/4
INSERT INTO Article (Code_art,Des_art,PU)
VALUES ('ClaBil','Clavier Bilingue',12.200);
--********************************************************************
--ou
--INSERT INTO Commande
--VALUES ('000100/2013',TO_DATE('20/02/2013', 'dd-mm-yyyy'), 'T0122');
--********************************************************************
UPDATE Article
SET PU = 0.500, Qte_stock=100
WHERE Code_art ='CD700';
Page 4/4
UNIVERSITÉ DE JENDOUBA Equipe pédagogique :
Chargé de cours : Riadh BOUSLIMI
Chargés des TPs : Houcem H. & Nada S.
Module : Système de Gestion de Base de Données
Classe : 2ème Licence Fondamentale en IAG
Faculté des Sciences Juridiques, Economiques Année Universitaire : 2012/2013
et de Gestion de Jendouba Semestre 2
TP n°2
Objectifs de la séance
Au terme de la séance, l’étudiant sera capable :
- de décrire une base de données en utilisant le langage de définition de données(LDD) ;
- d’ajouter des contraintes ;
- de valider ou annuler une transaction.
Table EMP
EMPNO ENOM FONCTION MGR DATEEMB SAL COMM DEPTNO
7369 AHMED RECEPTIONNISTE 7902 17/12/1980 800 500 20
7499 SALAH VENTESMAN 7698 20/02/1981 1600 300 30
7521 NADIA VENTESMAN 7698 22/02/1981 1250 500 30
7566 WALID MANAGER 7839 02/04/1981 2975 NULL 20
7654 SAMI VENTESMAN 7698 28/09/1981 1250 1400 30
7698 KARIM MANAGER 7839 01/05/1981 2850 NULL 30
7782 SONIA MANAGER 7839 09/06/1981 2450 NULL 10
7788 SEMIA ANALYSTE 7566 09/11/1981 3000 NULL 20
7839 NAJEH PRESIDENT NULL 17/11/1981 5000 NULL 10
7844 HOSNI VENTESMAN 7698 08/09/1981 1500 0 30
7876 NADA RECEPTIONNISTE 7788 23/09/1981 1100 NULL 20
7900 RIDHA RECEPTIONNISTE 7698 03/12/1981 950 NULL 30
7902 SABER ANALYSTE 7566 03/12/1981 3000 NULL 20
7934 RANIA RECEPTIONNISTE 7782 23/01/1982 1300 NULL 10
Table DEPT
DEPTNO DNOM LOC
10 COMPTABLE TUNIS
20 RECHERCHE BIZERT
30 VENTES SOUSSE
40 OPERATIONS SFAX
Page 1/4
empno : numéro d’employeur deptno : numéro de département
ENOM : nom de l’employeur, DNOM : nom de département
FONCTION : Type de travail loc : lieu de département
mgr : numéro de majeur de l’employeur
DATEEMB : date d’embauchement
sal : salaire
comm : commission (s’il y a lieu)
deptno : numéro de département
Page 2/4
2. Remplir la table DEPT.
3. Recopier la table EMP en créant de la table EMP par copie de l’utilisateur SCOTT.
4. Insérer le tuple (7369, ‘Bidon’, NULL, NULL, NULL, NULL, NULL, NULL)
dans la table EMP. Ça fonctionne. Est-ce normal ?
6. Ajouter les contraintes d’intégrité nécessaires à la table EMP (clé primaire et clés
étrangères) à l’aide de la commande ALTER TABLE EMP ADD CONSTRAINT…
3. Dans EMP, attribuer aux employés en poste avant le 01/01/1982 (DATEEMB) et ayant
une commission non spécifiée (NULL) une commission égale à la moyenne des
commissions.
3. Nom des vendeurs dont la commission est inférieure à 25% de leur salaire.
Page 3/4
5. Nombre d'employés ayant une commission.
13. Nom des employés ayant même manager (MGR) que SONIA.
14. Nom et fonction des employés ayant même fonction et même manager que HOSNI.
15. Nom des employés embauchés avant tous les employés du département n° 10.
16. Liste des employés en indiquant pour chacun son nom et celui de son manager.
17. Nom des employés ne travaillant pas dans le même département que leur manager.
Page 4/4
Correction
2)
INSERT INTO DEPT VALUES (10, ‘COMPTABLE’, ‘TUNIS’);
INSERT INTO DEPT VALUES (20, ‘RECHERCHE’, ‘BIZERT’);
INSERT INTO DEPT VALUES (30, ‘VENTE’, ‘SOUSSE’);
INSERT INTO DEPT VALUES (40, ‘OPERATIONS’, ‘SFAX’);
4) INSERT INTO EMP VALUES (7369, 'Bidon', NULL, NULL, NULL, NULL, NULL, NULL);
5) ROLLBACK;
10) COMMIT;
2) UPDATE EMP
SET SAL=SAL*1.1
WHERE COMM>0.5*SAL;
3) UPDATE EMP
SET COMM=(SELECT AVG(COMM)
FROM EMP)
WHERE DATEMB<'01/01/1982'
AND COMM IS NULL;
4) ROLLBACK;
Page 1/3
5) DELETE FROM DEPT
WHERE DEPTNO=20;
2) SELECT ENOM
FROM EMP
ORDER BY COMM/SAL DESC;
3) SELECT ENOM
FROM EMP
WHERE COMM<.25*SAL;
4) SELECT COUNT(EMPNO)
FROM EMP
WHERE DEPTNO=10;
5) SELECT COUNT(EMPNO)
FROM EMP
WHERE COMM IS NOT NULL;
8) SELECT SUM(SAL)
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
AND DNOM='SALES';
Page 2/3
13) SELECT ENOM
FROM EMP
WHERE MGR=(SELECT MGR
FROM EMP
WHERE ENOM='SONIA')
AND ENOM<>'SONIA';
Page 3/3
UNIVERSITE DE JENDOUBA Equipe pédagogique :
Chargé de cours : Riadh BOUSLIMI
Chargés des TPs : Houcem H. & Nada S.
Module : Système de Gestion de Base de Données
Classe : 2ème Licence Fondamentale en IAG
Faculté des Sciences Juridiques, Année Universitaire : 2012/2013
Economiques Semestre 2
et de Gestion de Jendouba
TP n°3
Objectifs de la séance
Au terme de la séance, l’étudiant sera capable d'interroger une base de données.
NUMPIL: clé de PILOTE, nombre entier LOC: ville de l'aéroport d'attache de l'avion, chaîne de caractères
NOMPIL: nom du pilote, chaîne de caractères NUMVOL: clé de VOL, nombre entier
ADR: ville de la résidence du pilote, chaîne de caractères VILLE_DEP: ville de départ du vol, chaîne de caractères
SAL: salaire du pilote, nombre entier VILLE_ARR: ville d'arrivée du vol, chaîne de caractères
NUMAV: clé de AVION, nombre entier H_DEP: heure de départ du vol, nombre entier entre 0 et 23
CAPACITE: nombre de places d'un avion, nombre entier H_ARR: heure d'arrivée du vol, nombre entier entre 0 et 23
VOL
NUMVOL NUMPIL NUMAV VILLE_DEP VILLE_ARR H_DEP H_ARR
1 1 1 Monastir Djerba 11:00 12:00
2 1 8 Tunis Djerba 17:00 19:00
3 2 1 Djerba Sousse 14:00 15:30
4 5 3 Djerba Sousse 18:00 19:30
5 9 1 Tunis Monastir 06:00 08:00
6 10 2 Sousse Monastir 11:00 11:30
7 1 4 Tunis Djerba 08:00 09:00
8 8 4 Monastir Tunis 07:00 08:00
9 1 8 Tozeur Djerba 09:00 10:00
10 8 2 Monastir Tunis 12:00 14:00
11 9 2 Tunis Tabarka 15:00 16:00
12 1 2 Monastir Tozeur 16:00 17:00
13 4 5 Monastir Tabarka 11:00 13:00
14 3 5 Tabarka Tunis 15:00 16:00
15 8 9 Tunis Djerba 17:00 19:00
16 7 5 Tunis Djerba 18:00 20:00
Page 1/2
Exprimer en SQL les requêtes suivantes :
Page 2/2
Correction du TP n°3
Schéma relationnel :
PILOTE(NUMPIL, NOMPIL, ADR, SAL)
AVION(NUMAV, NOMAV, CAPACITE, LOC)
VOL(NUMVOL, #NUMPIL, #NUMAV, VILLE_DEP, VILLE_ARR, H_DEP, H_ARR)
Page 1/2
9) Liste des vols au départ de Monastir allant à Tunis après 18 heures.
SELECT *
FROM VOL
WHERE VILLE_DEP='Monastir'
AND VILLE_ARR='Tunis'
AND H_DEP>'18:00';
2ème solution
SELECT NUMPIL
FROM PILOTE NOT IN (SELECT NUMPIL
FROM VOL);
3ème solution
SELECT NUMPIL
FROM PILOTE NOT EXISTS (SELECT NUMPIL
FROM VOL
WHERE PILOTE.NUMPIL = VOL.NUMPIL);
11) Les vols (numéro, ville de départ) effectués par les pilotes de numéro 100 et 204.
SELECT NUMVOL, VILLE_DEP
FROM VOL
WHERE NUMPIL = 100
AND NUMPIL=204;
Page 2/8
12) Numéros des vols effectués au départ de Monastir par des pilotes de Monastir.
SELECT NUMVOL, VILLE_DEP
FROM VOL
WHERE NUMPIL = 100
AND NUMPIL=204;
13) Les vols effectués par un avion qui n’est pas localisé à Monastir.
SELECT *
FROM VOL,AVION
WHERE VOL.NUMAV = AVION.NUMAV
AND LOC <> 'Monastir';
14) Les pilotes (numéro et nom) assurant au moins un vol au départ de Monastir avec un avion de
capacité supérieure à 300 places.
SELECT DISTINCT PILOTE.NUMPIL, NOMPIL
FROM PILOTE, VOL, AVION
WHERE PILOTE.NUMPIL = VOL.NUMPIL
AND VOL.NUMAV = AVION.NUMAV
AND VILLE_DEP = 'Monastir'
AND CAPACITE>300;
15) Noms des pilotes domiciliés à Tunis assurant un vol au départ de Monastir avec un Airbus.
SELECT DISTINCT NOMPIL
FROM PILOTE, VOL, AVION
WHERE PILOTE.NUMPIL = VOL.NUMPIL
AND VOL.NUMAV = AVION.NUMAV
AND ADR = 'Monastir'
AND NOMAV LIKE 'A%';
16) Numéros des vols effectués par un pilote de Monastir au départ ou à l’arrivée de Monastir avec
un avion localisé à Tunis.
SELECT NUMVOL
FROM PILOTE, VOL, AVION
WHERE PILOTE.NUMPIL = VOL.NUMPIL
AND VOL.NUMAV = AVION.NUMAV
AND ADR = 'Monastir'
AND (VILLE_DEP='Monastir' OR VILLE_ARR='Monastir')
AND LOC = 'Tunis';
Page 3/8
17) Les pilotes (numéro et nom) habitant dans la même ville que le pilote ZAGHDOUDI.
1ère solution
SELECT NUMPIL, NOMPIL
FROM PILOTE
WHERE ADR = (SELECT ADR
FROM PILOTE
WHERE NOMPIL='ZAGHDOUDI');
2ème solution
SELECT NUMPIL, NOMPIL
FROM PILOTE P1, PILOTE P2
WHERE P1.ADR = P2.ADR
AND P2.NOMPIL='ZAGHDOUDI');
2ème solution
SELECT NUMPIL
FROM PILOTE
WHERE NOMPIL <> 'BOUSLIMI'
INTERSECT
SELECT NUMPIL
FROM VOL;
3ème solution
SELECT NUMPIL
FROM PILOTE
WHERE NOMPIL <> 'BOUSLIMI'
AND NUMPIL IN (SELECT NUMPIL
FROM VOL);
Page 4/8
4ème solution
SELECT DISTINCT NUMPIL
FROM PILOTE
WHERE NOMPIL <> 'BOUSLIMI'
AND NUMPIL EXISTS (SELECT *
FROM VOL
WHERE VOL.NUMPIL=PILOTE.NUMPIL);
5ème solution
SELECT NUMPIL
FROM PILOTE
WHERE NOMPIL <> 'BOUSLIMI'
AND (SELECT COUNT(*)
FROM VOL
WHERE PILOTE.NUMPIL = VOL.NUMPIL);
19) Nom et numéro de vol des pilotes affectés à (au moins) un vol.
SELECT NOMPIL, NUMVOL
FROM PILOTE, VOL
WHERE PILOTE.NUMPIL = VOL.NUMPIL;
20) Les villes desservies (VILLE_ARR) à partir de la ville d’arrivée d’un vol au départ de Tunis.
SELECT DISTINCT VILLE_ARR
FROM VOL
WHERE VILLE_DEP='TUNIS';
21) Numéro et nom des avions affectés à des vols. Éliminer les doublons.
1ère solution
SELECT DISTINCT AVION.NUMAV, NOMAV
FROM AVION, VOL
WHERE AVION.NUMAV = VOL.NUMAV);
2ème solution
SELECT NUMAV, NOMAV
FROM AVION
AND NUMAV IN (SELECT NUMAV
FROM VOL);
Page 5/8
3ème solution
SELECT DISTINCT NUMAV, NOMAV
FROM PILOTE
AND NUMAV EXISTS (SELECT *
FROM VOL
WHERE VOL.NUMAV=AVION.NUMAV);
4ème solution
SELECT NUMAV, NOMAV
FROM AVION
AND (SELECT COUNT(*)
FROM VOL
WHERE AVION.NUMAV = VOL.NUMAV);
22) Les appareils (leur numéro) localisés dans la même ville que l’avion numéro 100.
SELECT NUMAV
FROM AVION
WHERE LOC = (SELECT LOC
FROM AVION
WHERE NUMAV = 100);
Page 6/8
27) Nombre de vols par pilote (indiquer uniquement le numéro des pilotes).
SELECT NUMPIL, COUNT(NUMVOL)
FROM VOL
GROUP BY NUMPIL;
28) Nombre total d’heures de vol par pilote (préciser le nom des pilotes).
SELECT NOMPIL, SUM(H_FIN-H_DEB)
FROM PILOTE, VOL
WHERE PILOTE.NUMPIL = VOL.NUMPIL
GROUP BY NOMPIL;
29) Numéro et nom des avions qui ne sont affectés à aucun vol.
1ère solution
SELECT NUMAV, NOMAV
FROM AVION
WHERE NUMAV NOT IN (SELECT NUMAV
FROM VOL);
2ème solution
SELECT NUMAV, NOMAV
FROM AVION A
WHERE NOT EXISTS (SELECT *
FROM VOL V
WHERE A.NUMAV + V.NUMAV);
3ème solution
SELECT NUMAV, NOMAV
FROM AVION
MINUS
SELECT NUMAV, NOMAV
FROM AVION A, VOL V
WHERE A.NUMAV = V.NUMAV
4ème solution
SELECT NUMAV, NOMAV
FROM AVION
WHERE NUMAV <> ALL (SELECT NUMAV
FROM VOL);
Page 7/8
5ème solution
SELECT NUMAV, NOMAV
FROM AVION A
WHERE (SELECT COUNT(*)
FROM VOL V
WHERE A.AVNUM = V.AVNUM) = 0;
30) Les pilotes (leur nom) de Tunis qui ont volé avec tous les avions.
1ère solution
SELECT NOMPIL
FROM PILOTE P
WHERE ADR ='TUNIS'
AND NOT EXISTS (SELECT *
FROM AVION A
WHERE NOT EXISTS (SELECT *
FROM VOL V
WHERE V.NUMPIL = P.NUMPIL
AND V.NUMAV = A.NUMAV));
2ème solution
SELECT NOMPIL
FROM PILOTE P, VOL V
WHERE ADR ='TUNIS'
AND P.NUMPL = V.NUMPL
GROUP BY NOMPIL
HAVING COUNT(DISTINCT AVNUM)= (SELECT COUNT(*) FROM AVION);
Page 8/8
UNIVERSITE DE JENDOUBA Equipe pédagogique :
Chargé de cours : Riadh BOUSLIMI
Chargés des TPs : Houcem H. & Nada S.
Module : Système de Gestion de Base de Données
Classe : 2ème Licence Fondamentale en IAG
Faculté des Sciences Juridiques, Année Universitaire : 2012/2013
Economiques Semestre 2
et de Gestion de Jendouba
TP n°4
Objectifs de la séance
Au terme de la séance, l’étudiant sera capable :
Créer et manipuler des vues ;
Gérer les droits d’accès à la base de données ;
1. Formuler à l’aide du langage SQL les requêtes suivantes (sans recopier les tables – rappel : l’accès
aux tables d’un autre utilisateur se fait en préfixant le nom de la table par le nom de l’utilisateur,
ex. bouslimi.client).
Liste des clients (nom + prénom) qui ont commandé le produit n°102.
Nom des clients qui ont commandé au moins un produit de prix supérieur ou égal à 500dt.
Nom des clients qui n’ont commandé aucun produit.
Nom des clients qui n’ont pas commandé le produit n°101.
Nom des clients qui ont commandé tous les produits.
2. Créer une vue nommée cliprod1 permettant de visualiser les caractéristiques des produits
commandés par chaque client (attributs à sélectionner : NumCli, Nom, Prenom, NumProd, Desi,
PrixUni).
Pour chaque client, prix du produit le plus cher qui a été commandé.
Page 1/2
Pour chaque client dont le prénom se termine par la lettre ‘e’, prix moyen des produits
commandés.
Maximum des totaux des prix pour tous les produits commandés par les différents clients.
6. Créer une vue nommée cliprod2 basée sur cliprod1 et permettant d’afficher seulement les
attributs Nom, Prenom, et Desi. Lister le contenu de la vue cliprod2.
Créer une table nommée TRANSACTION(TID, LIB) ou la clé primaire TID est un nombre à deux
chiffres et LIB une chaine de 20 caractères maximum.
Travailler par groupe de deux ordinateurs : vous et vos voisins (se coordonner pour avancer dans les
questions).
1. Donner à vos voisins le droit de consulter votre table TRANSACTION. Consulter la-leur.
3. Donner à vos voisions le droit d’insertion dans votre table TRANSACTION. Insérer un n-uplet
dans la-leur.
4. Afficher la liste des privilèges que vous avez accordés à l’aide de la vue système
USER_TAB_PRIVS(GRANTEE, TABLE_NAME, GRANTOR, PRIVILEGE,…).
Travailler par groupe de trois ordinateurs : vous et vos deux voisins (se coordonner pour avancer dans
les questions).
1. Donner à vos premiers voisins le droit de consulter votre table TRANSACTION, ainsi que le droit
de transmettre de privilège.
2. Transmettre à vos premiers voisins le privilège transmis par les seconds. Consulter la table
TRANSACTION de tous vos voisins. Réafficher la liste des privilèges que vous avez accordés.
3. Supprimer à vos premiers voisins le droit de consulter votre table TRANSACTION. Vos seconds
voisins peuvent-ils toujours consulter votre table ?
4. Supprimer à tous les autres utilisateurs le droit de consulter votre table TRANSACTION. Vos
seconds voisins peuvent-ils toujours consulter votre table ?
Page 2/2
Correction du TP n°4
Exercice n°1
--1.1
SELECT nom, prenom
FROM client c1,commande c2
WHERE c1.numcli = c2.numcli
AND numprod = 102;
--1.2
SELECT nom, prenom
FROM client c1,commande c2,produit p
WHERE c1.numcli = c2.numcli
AND c2.numprod = p.numprod
AND prixuni>=500;
--1.3
SELECT nom
FROM client c1
WHERE NOT EXISTS ( SELECT *
FROM commande c2
WHERE c1.numcli = c2.numcli );
--1.4
SELECT nom
FROM client c1
WHERE NOT EXISTS ( SELECT *
FROM commande c2
WHERE c1.numcli = c2.numcli );
--1.5
SELECT nom
FROM client c1
WHERE NOT EXISTS ( SELECT *
FROM produit p
WHERE NOT EXISTS ( SELECT *
FROM commande c2
WHERE c1.numcli = c2.numcli
AND c2.numprod = c2.numprod ));
Page 1/2
Ou
SELECT nom
FROM client c1, commande c2
WHERE c1.numcli = c2.numcli
GROUP BY nom
HAVING count(DISTINCT numprod)=(SELECT Count(nuprod) FROM produit);
--2
CREATE VIEW cliprod1 AS
SELECT c1.numcli, nom, prenom, p.numprod, desi, prixuni
FROM client c1, commande c2, produit p
WHERE c1.numcli = cl.numcli
AND c2.numprod = p.numprod ;
--3
SELECT * FROM cliprod1;
--4.1
SELECT nom, prenom
FROM cliprod1
WHERE numprod=102;
--4.2
SELECT DISTINCT nom
FROM cliprod1
WHERE prixuni>=500;
--5.1
SELECT nom, max(prixuni)
FROM cliprod1
GROUP BY nom;
--5.2
SELECT nom, avg(prixuni)
FROM cliprod1
WHERE prenom like '%e'
GROUP BY nom;
--5.3
SELECT max(sum(prixuni))
FROM cliprod1
GROUP BY numcli;
Page 2/4
--5.4
SELECT numprod
FROM cliprod1
GROUP BY numprod
HAVING count(*)>2;
--6.1
CREATE VIEW cliprod2 AS
SELECT nom, prenom, desi
FROM cliprod1;
--6.2
SELECT *
FROM cliprod2;
--6.3
DROP VIEW cliprod1;
--6.4
SELECT *
FROM cliprod2;
Exercice n°2
CREATE TABLE TRANSACTION(
TID NUMBER(2) PRIMARY KEY,
LIB VARCHAR(20));
GRANT SELECT
ON TRANSACTION
TO voisins1;
SELECT *
FROM voisins1.TRANSACTION;
GRANT SELECT
ON TRANSACTION
TO voisins1;
Page 3/4
SELECT grantee, table_name, grantor, privilege
FROM user_tab_privs;
GRANT SELECT
ON TRANSACTION
TO voisins1
WITH GRANT OPTION;
GRANT SELECT
ON voisin2.TRANSACTION
TO voisins1;
Page 4/4
UNIVERSITE DE JENDOUBA Equipe pédagogique :
Chargé de cours : Riadh BOUSLIMI
Chargés des TPs : Houcem H. & Nada S.
Module : Système de Gestion de Base de Données
Classe : 2ème Licence Fondamentale en IAG
Faculté des Sciences Juridiques, Année Universitaire : 2012/2013
Economiques Semestre 2
et de Gestion de Jendouba
TP n°5
Objectifs de la séance
Au terme de la séance, l’étudiant sera capable de :
savoir utiliser les curseurs pour exploiter les données ;
manipuler des collections (VARRAY, TABLE) et les enregistrements;
utiliser les sous programmes pour simplifier le traitement en PL/SQL
Rappel du PL/SQL
Page 1/2
Exercice n°1
1. Dans un Bloc PL/SQL, définir une variable entière, puis lui afficher le nombre total de pièces
enregistrés dans la table PIECE (nop,desi). Afficher le contenu de cette variable dans un message
de la forme « Nombre de pièces =XX ».
2. Dans le cas où le nombre de pièces est supérieur à 6, déclencher une exception et ne pas afficher le
nombre de pièces. Le traitement de cette exception devra donc interrompre l’exécution du
programme (erreur fatale, trop de pièces pour tenir dans l’entrepôt). Pour cela, utiliser la
procédure prédéfinie RAISE_APPLICATION_ERROR.
Exercice n°2
Une entreprise de type « faillitaire » récupère un stock ancien de produits. La base de données qui
décrit ce stock indique des prix en Dinars. Écrire un bloc PL/SQL anonyme permettant de
construire, à partir d’une table PRODUIT, une table PRODUIT2 telle que :
- la désignation des produits soit écrite en majuscules ;
- le prix unitaire en dinars des produits soit converti en euros (1€ = 2.0156 Dinars). Le
prix en euros devra être entier (arrondir au prix le plus proche).
Cas particuliers à traiter :
- Si la table PRODUIT est vide, la table PRODUIT2 devra contenir uniquement le n-
uplet (0,'Pas de produit',NULL).
- Si un prix de la table produit est NULL, son prix en euros doit être 0.
Page 2/4
Indications :
- Tester si la table PRODUIT est vide. Si ce n’est pas le cas, y accéder séquentiellement
à l’aide d’un curseur, effectuer les transformations sur les champs et stocker le résultat
dans la tables PRODUIT2.
- Utiliser les fonctions SQL, UPPER, ROUND et NVL.
Marche à suivre :
1. En SQL, créer la structure de la table PRODUIT(NumProd, Designation, Prix). Laisser
la table vide.
2. En SQL, créer la table PRODUIT2 en recopiant la structure de la table PRODUIT.
3. Saisir le bloc PL/SQL adéquat dans un fichier.
4. Exécuter ce bloc PL/SQL.
5. En SQL, peupler la table PRODUIT avec quelques n-uplets.
6. Ré-exécuter le bloc PL/SQL.
7. Afficher le contenu de la table PRODUIT2.
Exercice n°4 : Collections VARRAY
1. Dans un bloc PL/SQL anonyme, définir un type collection de réels VARRAY de taille 10
qui contiendra des notes d’examen.
2. Dans la section déclaration, définir une variable de ce type et l’initialiser avec trois notes.
3. Dans la section de code, terminer l’initialisation avec les 7 notes manquantes. Tester.
4. Calculer et afficher la moyenne des notes.
5. Ajouter encore une note dans la collection. Que se passe-t-il ?
6. Afficher la taille maxi et la taille réelle du tableau.
7. A l’aide de la méthode trim, effacer une note du tableau, puis afficher de nouveau la
taille maxi et la taille réelle du tableau.
8. A l’aide de la méthode delete, effacer le tableau, puis afficher de nouveau de la taille
maxi et la taille réelle du tableau.
Exercice n°5 : Collections TABLE
1. Dans un bloc PL/SQL anonyme, définir un type collection de réels TABLE qui contiendra
les notes de contrôle continu stockées dans la relation
NOTATION(numetu,numepreuve,note).
2. Définir une variable de ce type l’initialiser à vide.
3. Dans la section de code, charger en mémoire dans la collection les notes de contrôle
continu contenues dans la relation NOTATION à l’aide d’un curseur. Afficher les notes au
fur et à mesure. Tester. Ce traitement aurait-il-été possible avec un VARRAY ?
4. Calculer et afficher la moyenne des notes contenues dans la collection.
5. Vérifier que votre calcul est bon en affichant le résultat d’une requête SQL utilisant la
fonction d’agrégat AVG().
6. Afficher à l’écran l’indice du premier élément de la collection, l’indice du dernier élément
et le nombre d’éléments dans la collection.
7. Supprimer les éléments d’indice 1,10 et 16, puis répéter la question 6 (copier/coller).
8. Afficher tous les éléments de la collection.
Page 3/4
Exercice n°6 : Enregistrements
1. Nous allons réutiliser la relation PILOTE(NUMPIL, NOMPIL, ADR, SAL). Dans un bloc
PL/SQL anonyme, définir un type enregistrement composé des champs suivants :
- nom, du même type que l’attribut NOMPIL de PILOTE ;
- adresse, du même type que l’attribut ADR de PILOTE ;
- salaire, du même type que l’attribut SAL de PILOTE ;
2. Définir une variable de ce type
3. Dans la section de code, définir une requête paramétrée (en utilisant le caractère &)
permettant de lire le nom, l’adresse et le salaire d’un pilote de la dont le numéro de pilote
est saisi au clavier et de le stocker dans la variable enregistrement préalablement définie.
Afficher le résultat au format : NOM (Adresse) : Salaire.
Exercice n°7 : Sous-programmes et collections
1. Dans un bloc PL/SQL anonyme, définir une fonction de nom « MonMax » prenant en
paramètres d’entrée deux réels et renvoyant un réel égal au plus grand des deux
paramètres.
2. Dans le programme principal, déclarer deux variables réelles « a » et « b » et leur affecter
une valeur. Appeler la fonction « MonMax » pour « a » et « b » et afficher le résultat.
3. Dans le même bloc PL/SQL, définir un type collection de réels TABLE nommé
« TabReels ». ainsi qu’une variable « tab » de ce type. Initialiser cette variable avec
plusieurs valeurs.
4. Définir une fonction de nom « MultiMax » prenant en paramètre d’entrée un « TabReels »
et renvoyant le plus grand nombre contenu dans ce tableau. Faire appel à la fonction
« MonMax » pour effectuer le traitement. Dans le programme principal, appeler la fonction
« MultiMax » pour « tab » et afficher le résultat.
5. Ajouter à la fonction « MultiMax » un traitement d’exception déclenchant une erreur fatale
lorsque la table passée en paramètre est vide. Tester en initialisant « tab » à vide.
6. Toujours dans le même bloc PL/SQL, définir une procédure de nom « Tri » permettant de
trier par ordre croissant le contenu d’un « TabReels » passé en paramètre. On pourra
programmer un simple tri par permutation.
7. Ecrire une procédure de nom « Affiche » permettant d’afficher le contenu d’un
« TabReels ».
8. Dans le programme principal, faire appel aux procédures « Tri » et « Affiche » pour
« Tab ». Quel doit être le mode de passage de ce paramètre dans chaque cas ?
Page 4/4
Correction du TP n°5
Exercice n°1
DECLARE
nbp INTEGER;
full EXCEPTION;
designation piece.desi%TYPE;
BEGIN
SELECT COUNT(nop) INTO nbp FROM piece;
EXCEPTION
WHEN full THEN RAISE_APPLICATION_ERROR(-20500, 'Entrepôt plein !');
END;
/
Exercice n°2
DECLARE
CURSOR services IS SELECT * FROM service ORDER BY nos;
un_service services%ROWTYPE;
nbs INTEGER;
no_service EXCEPTION;
BEGIN
SELECT COUNT(*) INTO nbs FROM service;
IF nbs = 0 THEN
RAISE no_service;
END IF;
EXCEPTION
WHEN no_service THEN DBMS_OUTPUT.PUT_LINE('La table service est vide.');
END;
/
Page 1/5
Exercice n°3
DECLARE
Euro CONSTANT REAL := 2.0156;
Nbprod NUMBER(3);
aucun_produit EXCEPTION;
CURSOR produits IS SELECT numprod, designation, prix FROM produit;
un_prod produits%ROWTYPE;
BEGIN
--Compte des produits
SELECT COUNT(*) INTO nbp FROM produit;
--Validation de la transaction
COMMIT;
EXCEPTION
WHEN aucun_produit THEN
INSERT INTO produit2
VALUES(0,'Pas de produit',NULL) ;
END;
/
Exercice n°4
DECLARE
TYPE TabReels IS VARRAY(10) OF REAL;
notes TabReels := TabReels(10.5, 15, 13);
i INTEGER;
m REAL :=0;
BEGIN
notes.EXTENDS(7);
notes(4) := 8.5;
notes(5) := 18.5;
notes(6) := 16 ;
notes(7) := 4 ;
notes(8) := 9.5;
notes(9) := 12;
notes(10) := 11 ;
Page 2/5
--notes.EXTEND; NE FONCTIONNE PLUS (taille maxi = 10)
--notes(11) :=20 ;
Exercice n°5
DECLARE
TYPE TabReels IS TABLE OF REAL;
notes TabReels := TabReels();
CURSOR notes_stockees IS SELECT note FROM notation
WHERE note IS NOT NULL;
une_note notes_stockees%ROWTYPE;
i INTEGER ;
m REAL := 0;
BEGIN
FOR une_note IN notes_stockees
LOOP
notes.EXTEND;
notes(notes.COUNT) := une_note.note;
DBMS_OUTPUT.PUT_LINE('notes('||notes.COUNT||')='||une_note.note);
END LOOP;
FOR i IN 1..notes.COUNT
LOOP
m := m + notes(i);
END LOOP;
m := m / notes.COUNT;
DBMS_OUTPUT.PUT_LINE('Moyenne = ' || m );
notes.delete(1);
notes.delete(10);
notes.delete(16);
DBMS_OUTPUT.PUT_LINE('Indice premier :' || notes.FIRST);
DBMS_OUTPUT.PUT_LINE('Indice dernier :' || notes.LAST);
DBMS_OUTPUT.PUT_LINE('Indice elements :' || notes.COUNT);
i := notes.FIRST;
WHILE i<=notes.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('notes('||') = '||notes(i));
i := notes.NEXT(i);
END LOOP;
END;
/
Page 3/5
Exercice n°6
DECLARE
TYPE Personne IS RECORD (
nom pilote.nompil%TYPE,
adresse pilote.adr%TYPE,
salaire pilote.sal%TYPE);
pl Personne;
BEGIN
END;
/
Exercice n°7
DECLARE
--Déclarations du programme principal
a REAL := 4.5;
b REAL := 3.14;
TYPE TabReels IS TABLE OF REAL;
tab TabReels := TabReels(-3.25, 6.5, 10.2, 9.55, 15.2, 0.255);
tab_tri TabReels := TabReels();
m := t(1);
FOR I IN 2..t.COUNT
LOOP
m := MonMax(m, t(i));
END LOOP;
RETURN m;
EXCEPTION
WHEN vide THEN RAISE_APPLICATION_ERROR(-20500,'MultiMax error:table vide');
END;
Page 4/5
--Procédure tri d’un tableau
PROCEDURE Tri(t IN OUT TabReels) IS
--Déclarations locales
i INTEGER;
OK : BOOLEAN;
temp REAL;
BEGIN
LOOP
OK:=false;
FOR i IN 1..t.COUNT
LOOP
IF t(i)>t(i+1) THEN
temp := t(i);
t(i) := t(i+1);
t(i+1) := temps;
OK = true;
END IF;
END LOOP;
EXIT WHEN OK=false;
END LOOP;
END;
BEGIN
FOR I IN 1..t.COUNT
LOOP
Chaine := chaine || ' ' || t(i);
END LOOP;
DBMS_OUTPUT.PUT_LINE(chaine);
END;
--Programme principal
BEGIN
--Tri(tab);
--Affiche(tab);
Tri_conserve(tab,tab_tri);
Affiche(tab) –- Affichage du tableau non trié
Affiche(tab_tri) –- Affichage du tableau trié
END;
/
Page 5/5
Documents Non autorisés
Classe 2LFIAG
Nombre de Pages 8 pages
Module SGBD Enseignants R. BOUSLIMI, H. HEDHLI et N. SELLEMI
Durée 2 heures Session Principale Mai 2013
N° Inscription : ___________________________________
Groupe : _________________________N°_______________
Code de l’administration :
________________________________
EXAMEN
Exercice n°1(8pts)
On donne le schéma relationnel de la base de données d’une bibliothèque ainsi que le dictionnaire de
données de cette dernière.
Livre(Code_livre, Titre, Auteur, Editeur, Date_parution)
Abonne(Num_abonne, Nom_abonne, Prenom_abonne, Adresse, Tel)
Emprunt(Code_liv_emp#,Num_ab_emp#,Date_emprunt,Date_retour)
Table : Livre
Nom de la colonne Type de données Contrainte
Code_livre VARCHAR(10) Clé primaire
Titre VARCHAR(50) Non nulle
Auteur VARCHAR(50) Non nulle
Editeur VARCHAR(30)
Date_parution DATE Valeurs autorisées : < Date d’aujourd’hui()
Table : Abonne
Nom de la colonne Type de données Contrainte
Num_abonne VARCHAR(10) Clé primaire
Nom_abonne VARCHAR(30) Non nulle
Prenom_abonne VARCHAR(30) Non nulle
Adresse VARCHAR(50) Valeur par défaut : "Jendouba"
Tel NUMBER(8)
Table : Emprunt
Nom de la colonne Type de données Contrainte
Code_liv_emp VARCHAR(10) Clé primaire et Clé étrangère
Mise à jour en cascade et Suppression en cascade
Num_ab_emp VARCHAR(10) Clé primaire et Clé étrangère
Mise à jour en cascade et Suppression en cascade
Date_emprunt Date Clé primaire
Valeur par défaut : Date d’aujourd’hui()
Valeurs autorisées : ≤ Date d’aujourd’hui()
Date_retour Date Valeurs autorisées : ≥ Date_emprunt
Page 1 / 8
1) Créer la structure des tables de la base de données.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 2 / 8
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
3) Ajouter à la colonne "Adresse" une contrainte de domaine dont les valeurs autorisées sont : "Jendouba",
"Beja","Kef" et "Tunis".
_______________________________________________________________________________
_______________________________________________________________________________
Page 3 / 8
4) Supprimer la colonne "Tel".
_______________________________________________________________________________
_______________________________________________________________________________
5) Peut-on insérer le n-uplet ci-dessous dans la table "Livre"? Justifier votre réponse.
Code_livre Titre Auteur Editeur Date_parution
FT14578454 Base de données relationnelle 15/05/2013
_______________________________________________________________________________
_______________________________________________________________________________
Exercice n°2(6pts)
On donne le schéma relationnel de la base de données du calendrier des examens.
Groupe(CodeG,lblGroupe)
Etudiant(cin, nom, prénom, adresse, tel, #CodeG)
Module(CodeM, lblModule, coef)
Elimine(#cin, #codeM)
Dates(NJ, DateExam)
Horaire(NH, HeureD, HeureF)
Examen(NJ#,NH#,CodeM#,CodeG#,Salle)
1) Nom, prénom et adresse des étudiants qui sont éliminés. Sans doublons.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 4 / 8
2) Nom et prénom des étudiants qui ne sont pas éliminés dans le module « Système de Gestion de Base de
Données ».
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 5 / 8
5) Les étudiants qui sont éliminés dans tous les modules. Proposer deux solutions.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 6 / 8
Exercice n°3(6pts)
On donne le schéma relationnel de la base de données de la gestion des employés.
DEPT (DEPTNO, DNOM, LOC)
EMP (EMPNO, ENOM, FONCTION, MGR#, DATEEMB, SAL, COMM, DEPTNO#)
1. Ecrire un script PL/SQL qui utilise un curseur pour augmenter tous les salaires de la table EMP de
la façon suivante :
De 4% pour le premier quart des plus hauts salaires ;
De 6% pour le second quart des plus hauts salaires ;
De 8% pour le reste des employés
Le script doit afficher le nom et le salaire de chaque employé avant et après l’augmentation, ainsi
que le montant total mensuel de cette augmentation.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 7 / 8
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
2. On dispose d’une table LOG, qui stockera la trace des modifications apportées à la table EMP : la
date et le type (insertion, suppression, mise à jour) pour chaque modification. Ecrire un trigger qui
enregistre dans la table LOG toute modification de EMP.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Bonne chance
Page 8 / 8
CPRRECTION D’EXAMEN
Exercice n°1(8pts)
On donne le schéma relationnel de la base de données d’une bibliothèque ainsi que le dictionnaire de
données de cette dernière.
Livre(Code_livre, Titre, Auteur, Editeur, Date_parution)
Abonne(Num_abonne, Nom_abonne, Prenom_abonne, Adresse, Tel)
Emprunt(Code_liv_emp#,Num_ab_emp#,Date_emprunt,Date_retour)
Table : Livre
Nom de la colonne Type de données Contrainte
Code_livre VARCHAR(10) Clé primaire
Titre VARCHAR(50) Non nulle
Auteur VARCHAR(50) Non nulle
Editeur VARCHAR(30)
Date_parution DATE Valeurs autorisées : < Date d’aujourd’hui()
Table : Abonne
Nom de la colonne Type de données Contrainte
Num_abonne VARCHAR(10) Clé primaire
Nom_abonne VARCHAR(30) Non nulle
Prenom_abonne VARCHAR(30) Non nulle
Adresse VARCHAR(50) Valeur par défaut : "Jendouba"
Tel NUMBER(8)
Table : Emprunt
Nom de la colonne Type de données Contrainte
Code_liv_emp VARCHAR(10) Clé primaire et Clé étrangère
Mise à jour en cascade et Suppression en cascade
Num_ab_emp VARCHAR(10) Clé primaire et Clé étrangère
Mise à jour en cascade et Suppression en cascade
Date_emprunt Date Clé primaire
Valeur par défaut : Date d’aujourd’hui()
Valeurs autorisées : ≤ Date d’aujourd’hui()
Date_retour Date Valeurs autorisées : ≥ Date_emprunt
Page 1 / 6
CREATE TABLE Emprunt
(
Code_liv_emp VARCHAR(10),
Num_ab_emp VARCHAR(10) ,
Date_emprunt DATE DEFAULT SYSDATE,
Date_retour DATE,
CONSTRAINT chkdateemp CHECK Date_emprunt<= SYSDATE, (2pts)
CONSTRAINT chkdateemp CHECK Date_retour>= Date_emprunt,
CONSTRAINT pkEmprunt Primary key(Code_liv_emp, Num_ab_emp, Date_emprunt),
CONSTRAINT fklivre Foreign key(Code_liv_emp) REFERENCES Livre(Code_livre),
CONSTRAINT fkabonne Foreign key(Num_ab_emp) REFERENCES Livre(Code_livre)
ON UPDATE CASCADE
ON DELETE CASCADE
);
3) Ajouter à la colonne "Adresse" une contrainte de domaine dont les valeurs autorisées sont : "Jendouba",
"Beja","Kef" et "Tunis".
5) Peut-on insérer le n-uplet ci-dessous dans la table "Livre"? Justifier votre réponse.
Non , on ne peut pas inserer le n-uplet parceque l’attribut Auteur est définit
comme étant non null et dans notre cas on a une valeur qui est égale à nulle.
(1pt)
Exercice n°2(6pts)
On donne le schéma relationnel de la base de données du calendrier des examens.
Groupe(CodeG,lblGroupe)
Etudiant(cin, nom, prénom, adresse, tel, #CodeG)
Module(CodeM, lblModule, coef)
Elimine(#cin, #codeM)
Dates(NJ, DateExam)
Horaire(NH, HeureD, HeureF)
Examen(NJ#,NH#,CodeM#,CodeG#,Salle)
Page 2 / 6
Exprimer en SQL les requêtes suivantes :
1) Nom, prénom et adresse des étudiants qui sont éliminés. Sans doublons.
1ère solution
SELECT nom, prénom,adresse
FROM Etudiant
INTERSECT
SELECT nom,prénom,adresse
FROM Etudiant,Elimine
WHERE Etudiant.cin = Elimine.cin ;
2ème solution
SELECT DISTINCT nom,prénom,adresse
(1pt)
FROM Etudiant,Elimine
WHERE Etudiant.cin = Elimine.cin ;
3ème solution
SELECT nom,prénom,adresse
FROM Etudiant
WHERE cin IN (SELECT cin
FROM Elimine);
2) Nom et prénom des étudiants qui ne sont pas éliminés dans le module « Système de Gestion de Base de
Données ».
1ère solution
SELECT nom, prénom
FROM Etudiant
MINUS
SELECT nom,prénom
FROM Etudiant,Elimine,Module
WHERE Etudiant.cin = Elimine.cin
AND Elimine.CodeM=Module.CodeM
AND lblModule =' Système de Gestion de Base de Données';
2ème solution
SELECT nom,prénom
FROM Etudiant
(1pt)
WHERE cin NOT IN (SELECT cin
FROM Module, Elimine
WHERE Module.CodeM=Elimine.CodeM
AND lblModule =' Système de Gestion de Base de Données');
3ème solution
SELECT nom,prénom
FROM Etudiant
WHERE NOT EXISTS (SELECT *
FROM Module, Elimine
WHERE Module.CodeM=Elimine.CodeM
AND Etudiant.cin=Elimine.cin
AND lblModule =' Système de Gestion de Base de Données');
Page 3 / 6
3) La date d’examen du module « Système de Gestion de Base de Données».
SELECT DateExam
FROM Examen,Module,Dates
WHERE Examen.CodeM = Module.CodeM (1pt)
AND Examen.NJ = Dates.NJ
AND lblModule =' Système de Gestion de Base de Données';
5) Les étudiants qui sont éliminés dans tous les modules. Proposer deux solutions.
1ère solution
SELECT Nom,Prénom
FROM Etudiant,Elimine
WHERE Etudiant.cin = Elimine.cin (1pt)
GROUP BY Nom,Prénom
HAVING COUNT(DISTINCT CodeM) = SELECT COUNT(*) FROM MODULE;
2ème solution
SELECT Nom,Prénom
FROM Etudiant ET
WHERE NOT EXISTS (SELECT *
FROM Module M
WHERE NOT EXISTS (SELECT *
FROM Elimine EL (1pt)
WHERE ET.cin = EL.cin
AND EL.CodeM=M.CodeM));
Page 4 / 6
Exercice n°3(6pts)
On donne le schéma relationnel de la base de données de la gestion des employés.
DEPT (DEPTNO, DNOM, LOC)
EMP (EMPNO, ENOM, FONCTION, MGR#, DATEEMB, SAL, COMM, DEPTNO#)
1. Ecrire un script PL/SQL qui utilise un curseur pour augmenter tous les salaires de la table EMP de
la façon suivante :
De 4% pour le premier quart des plus hauts salaires ;
De 6% pour le second quart des plus hauts salaires ;
De 8% pour le reste des employés
Le script doit afficher le nom et le salaire de chaque employé avant et après l’augmentation, ainsi
que le montant total mensuel de cette augmentation.
DECLARE
BEGIN
--Nombre des employes
SELECT COUNT(*) INTO n FROM EMP; (0.25pt)
--Affichage des employés avant l’augmentation
DBMS_OUTPUT.PUT_LINE('----Affichage des employés avant l’augmentation ---- ') ;
FOR Employes INTO UnEmp LOOP
BMS_OUTPUT.PUT_LINE(UnEmp.ENOM || ' ' || UnEmp.SAL; (0.25pt)
END LOOP;
Page 5 / 6
2. On dispose d’une table LOG, qui stockera la trace des modifications apportées à la table EMP : la
date et le type (insertion, suppression, mise à jour) pour chaque modification. Ecrire un trigger qui
enregistre dans la table LOG toute modification de EMP.
CREATE OR REPLACE TRIGGER trig_trace
AFTER INSERT OR UPDATE OR DELETE ON EMP
FOR EACH ROW (0.5pt)
DECLARE
BEGIN
IF INSERTING THEN
INSERT INTO LOG(SYSDATE,'insertion');
END IF ;
IF UPDATING THEN
INSERT INTO LOG(SYSDATE,'mise à jour'); (1.5pts)
END IF ;
IF DELETING THEN
INSERT INTO LOG(SYSDATE,'suppression');
END IF;
END;
/
Page 6 / 6
Documents Non autorisés
Classe 2LFIAG
Nombre de Pages 8 pages
Module SGBD Enseignants R. BOUSLIMI, H. HEDHLI et N. SELLEMI
Durée 2 heures Session Contrôle Juin 2013
N° Inscription : ___________________________________
Groupe : _________________________N°_______________
Code de l’administration :
________________________________
EXAMEN
Exercice n°1(8pts)
On donne le schéma relationnel de la base de données de gestion de stock ainsi que le dictionnaire de
données de cette dernière.
Article(RefArt, Designation, PrixUn, QteStock)
Client(NumClt,Nom,Adresse,Telephone)
Commande(NumCmd, NumClt#, DateCmd)
LigneCmd(NumCmd #, RefArt#, QteCom)
Table : Article
Nom de la colonne Type de données Contrainte
RefArt VARCHAR(8) Clé primaire
Designation VARCHAR(50) Non nulle
PrixUn NUMBER(7,3) Non nulle ; Valeurs autorisées : > 0
QteStock NUMBER(5) Non nulle ; Valeurs autorisées : > 0
Table : Client
Nom de la colonne Type de données Contrainte
NumClt NUMBER(10) Clé primaire
Nom VARCHAR(50) Non nulle
Adresse VARCHAR(100) Non nulle ; Valeur par défaut : "Jendouba"
Telephone VARCHAR(50)
Table : Commande
NumCmd NUMBER(10) Clé primaire
NumClt NUMBER(10) Clé étrangère
DateCmd DATE Valeurs autorisées : ≥ Aujourd’hui
Valeur par défaut : Aujourd’hui
Table : LigneCmd
Nom de la colonne Type de données Contrainte
NumCmd NUMBER(10) Clé primaire et Clé étrangère
Mise à jour en cascade et Suppression en cascade
NumClt NUMBER(10) Clé primaire et Clé étrangère
Mise à jour en cascade et Suppression en cascade
QteCom NUMBER(5) Valeurs autorisées : ≤ Article.QteStock
Page 1 / 8
NE RIEN ÉCRIRE ICI
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 2 / 8
NE RIEN ÉCRIRE ICI
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
3) Ajouter à la colonne "Adresse" une contrainte de domaine dont les valeurs autorisées sont : "Jendouba", "Ben
Arous", "Manouba".
_______________________________________________________________________________
_______________________________________________________________________________
Page 3 / 8
NE RIEN ÉCRIRE ICI
_______________________________________________________________________________
_______________________________________________________________________________
5) Peut-on insérer le n-uplet ci-dessous dans la table "Article"? Justifier votre réponse.
RefArt Designation PrixUn QtesStock
ABX123456 Salle à manger 2900 0
_______________________________________________________________________________
_______________________________________________________________________________
Exercice n°2(6pts)
On donne le schéma relationnel de la base de données d’emploi du temps.
Groupe(CodeG,lblGroupe)
Etudiant(Cin, NomEtud, PrenomEtud, Adresse, Tel, CodeG#)
Module(CodeM, lblModule, Coef)
Enseignant(CodeEns, Nom, Prenom, Adresse, Email)
Jour(NJ, lblJour)
Horaire(NH, HeureD, HeureF)
Salle(NSalle, Capacite, TypeSalle)
Seance(NJ#,NH#,CodeM#,CodeG#,NSalle#,CodeEns#,TypeDeCours)
1) Liste des groupes (lblGroupe) qui ont des séances de cours le lundi de 8h10 à 9h40.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 4 / 8
NE RIEN ÉCRIRE ICI
2) Nom et prénom des enseignants qui enseignent le module « Système de Gestion de Base de Données ».
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
4) Les enseignants qui habitent à Manouba qui enseignent le lundi et mardi, et qui terminent avant 16h.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 5 / 8
NE RIEN ÉCRIRE ICI
5) Les enseignants qui enseignent tous les groupes du 2LFIAG (2LFIAG01, 2LFIAG02, 2LFIAG03 et
2LFIAG04). Proposer deux solutions.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 6 / 8
NE RIEN ÉCRIRE ICI
Exercice n°3(6pts)
On donne le schéma relationnel de la base de données de la gestion des employés.
EMP (EMPNO, ENOM, FONCTION, DATEEMB, SAL, COMM, DEPTNO)
EMPNO ENOM FONCTION DATEEMB SAL COMM DEPTNO
7839 HEDHLI Sadek PRESIDENT 17-NOV-91 5000 10
7698 BOUSLIMI Salah MANAGER 01-MAY-91 2850 30
7780 ZAGHDOUDI Mohamed ANALYST 17-DEC-90 3000 500 20
7934 ABIDI Nadia ANALYST 23-JAN-92 1300 10
1. Ecrire un bloc PL/SQL qui calcule le montant de la commission d’un employé donné, en fonction
de son salaire.
Les commissions sont calculées selon le barème suivant:
Si le salaire est inférieur à 1000, la commission vaut 10% du salaire.
Si le salaire est compris entre 1000 et 1500, la commission vaut 15% du salaire.
Si le salaire est supérieur à 1500 la commission est 20% du salaire.
Pour les salaires nuls, la commission est 0.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Page 7 / 8
NE RIEN ÉCRIRE ICI
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
2. On dispose d’une table LOG, qui stockera la trace des modifications apportées à la table EMP : la
date et le type (insertion, suppression, mise à jour) pour chaque modification. Ecrire un trigger qui
enregistre dans la table LOG toute modification de EMP.
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
Bon travail
Page 8 / 8