Vous êtes sur la page 1sur 133

SUPPORT DE COURS ET TRAVAUX PRATIQUES

Système de Gestion
de Base de Données
2ème année Licence Fondamentale
en Informatique Appliquée à la Gestion

Auteur : Riadh BOUSLIMI


Date d’édition : 26/07/2013
30/04/2013

Faculté de Sciences Juridiques, Économiques et de


Gestion de Jendouba

Système de Gestion de Base de Données


2ème année LF IAG
2012-2013
Riadh BOUSLIMI

Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV. Les triggers

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 2

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 1
30/04/2013

Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV. Les triggers

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 3

I.1. Qu’est ce qu’un SGBD?


—Un SGBD est un logiciel qui permet de décrire,
de modifier, de manipuler, d’interroger et
administrer une base de données.
—Exemples de SGBD :
 Oracle, DB2, MySQL, MS Access, FoxPro,
PostgreSQL, Informix, etc.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 4

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 2
30/04/2013

I.2. Qu’est-ce qu’Oracle ?


— Oracle : Système de Gestion de Bases de
Données (SGBD) relationnel (SGBDR) édité par
Oracle Corporation (http://www.oracle.com/)
—Basé sur SQL (Structured Query Language),
langage de définition, de manipulation et de
contrôle de bases de données relationnelles
(standard ANSI depuis 1986)
—Première version d’Oracle : 1981
Version actuelle du 2013: Oracle 11g
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 5

I.3. Architecture d’Oracle

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 6

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 3
30/04/2013

I.4. Base de données exemple


CLIENT(NumCli, Nom, Prénom, DateNaiss, Rue, CP, Ville)
PRODUIT(NumProd, Dési, PrixUni, #NumFour)
FOURNISSEUR(NumFour, RaisonSoc)
COMMANDE(#NumCli, #NumProd, Date, Quantité)

Clés primaires
#Clés étrangères

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 7

Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV. Les triggers

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 8

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 4
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 9

II.2. Définition des données


Définitions d’une base de données

CREATE DATABASE nom_base_de_données;

ex. CREATE DATABASE scolarite;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 10

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 5
30/04/2013

II.2. Définition des données


Définitions des tables
CREATE TABLE
(
Attribut1 TYPE, Attribut2 TYPE, …,
contrainte_integrité1, contrainte_integrité2, …
);

Type des données :


 NUMBER(n) : Entier à n chiffres
 NUMBER(n, m) : Réel à n chiffres au total
(virgule comprise), m après la virgule
 VARCHAR(n) : Chaîne de n caractères (entre ' ')
 VARCHAR2(n) : Chaîne de taille maximale n caractères (entre ' ')
 DATE : Date au format ' JJ-MM-AAAA'

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 11

II.2. Définition des données


Définitions des contraintes d’intégrité
— Clé primaire :
 CONSTRAINT nom_contrainte
PRIMARY KEY (attribut_clé [, attribut_clé2, …])
— Clé étrangère :
 CONSTRAINT nom_contrainte
FOREIGN KEY(attribut_clé_ét)
REFERENCES TableMère(attribut)
— Contrainte de domaine :
 CONSTRAINT nom_contrainte CHECK (condition)

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 12

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 6
30/04/2013

II.2. Définition des données


Les autres propriétés possibles
 NOT NULL : Indique qu'on est obligé de mettre une
valeur dans la colonne
 UNIQUE : Indique que les valeurs dans la colonne doivent
être toutes différentes (comme pour les clés, sauf que ce
n'est pas une clé)
 DEFAULT : Permet d'indiquer une valeur par défaut à la
création d'une nouvelle ligne

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 13

II.2. Définition des données


Options des contraintes d'intégrité référentielles
 Effacer en cascade ON DELETE CASCADE
 Mise à jour en cascade ON UPDATE CASCADE
CREATE TABLE FACTURE
(
code_fact NUMBER(7) PRIMARY KEY,
id_client NUMBER(3),
….
CONSTRAINT FK_FACT FOREIGN KEY (id_client)
REFERENCES CLIENT(id_client)
ON DELETE CASCADE
ON UPDATE CASCADE
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 14

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 7
30/04/2013

II.2. Définition des données


Exemple :
CREATE TABLE Employe
(
NumEmp NUMBER(3),
Nom VARCHAR(30),
Prenom VARCHAR(30),
DateNaiss DATE,
Salaire NUMBER(8,2),
NumFonc NUMBER(3),
CONSTRAINT cle_pri PRIMARY KEY (NumEmp),
CONSTRAINT cle_etr FOREIGN KEY (NumFonc)
REFERENCES Fonction(NumFonc),
CONSTRAINT date_ok CHECK (DateNaiss < SYSDATE)
ON DELETE CASCADE
ON UPDATE CASCADE
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 15

II.2. Définition des données


Ajout d’attributs
ALTER TABLE nom_table
ADD (attribut TYPE, …);
ex. ALTER TABLE Client
ADD (tel NUMBER(8));

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 16

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 8
30/04/2013

II.2. Définition des données


Ajout de contrainte
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte définition_contrainte;

ex1. ALTER TABLE Client


ADD CONSTRAINT chkVille CHECK (Ville IN (‘Jendouba’,’Kef’,’Beja’));

ex2. ALTER TABLE Notation


ADD CONSTRAINT chkNote CHECK (note BETWEEN 0 AND 20);

Suppression de contrainte
ALTER TABLE nom_table
DROP CONSTRAINT nom_contrainte;
ex. ALTER TABLE Client
DROP CONSTRAINT chkVille ;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 17

II.2. Définition des données


Renommer une table
ALTER TABLE nom_table RENAME TO nouv_nom_table;
RENAME nom_table TO nouv_nom_table;
ex. RENAME Etudiant TO Dossier_Etudiant ;

Destruction d’une table


DROP TABLE nom_table;
ex. DROP TABLE Client;

Copie d’une table


CREATE TABLE copie AS requête;
ex. CREATE TABLE Client_copie AS
SELECT * FROM Client;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 18

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 9
30/04/2013

II.2. Définition des données


Exemple

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 19

II.2. Définition des données


Contraintes
 L’attribut nom du client et designation sont obligatoires;
 Le chiffre d’affaire (CA) admet comme valeur par défaut
1000;
 La valeur par défaut de la date de commande est la date
système;
 La date de commande doit être inférieur ou égale à la date
d’aujourd’hui;
 La quantité commandée doit être inférieur ou égale à la
quantité en stock;
 La modification et la surpression doivent être en cascade.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 20

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 10
30/04/2013

II.2. Définition des données


 Table Client
1ère solution
CREATE TABLE Client (
NumCl NUMBER(10) PRIMARY KEY,
Nom VARCHAR(100) NOT NULL,
Adresse VARCHAR(200),
Telephone NUMBER(8),
CA NUMBER(7,3) DEFAULT 1000
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 21

II.2. Définition des données


 Table Client
2ème solution
CREATE TABLE Client (
NumCl NUMBER(10),
Nom VARCHAR(100) NOT NULL,
Adresse VARCHAR(200),
Telephone NUMBER(8),
CA NUMBER(7,3) DEFAULT 1000,
CONSTRAINT PRIMARY KEY PKClient (NumCl)
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 22

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 11
30/04/2013

II.2. Définition des données


 Table Commande
CREATE TABLE Commande(
NumCmd NUMBER(10) Primary Key,
DateCmd DATE Default SYSDATE,
NumCl NUMBER(8),
CONSTRAINT CHKDate CHECK DateCmd<= SYSDATE,
CONSTRAINT FKCmdCl FOREIGN KEY NumCl
REFERENCES Client(NumCl)
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 23

II.2. Définition des données


 Table Article
CREATE TABLE Article(
NumAr NUMBER(10) Primary Key,
Designation VARCHAR(50) NOT NULL,
PrixUnitaire NUMBER(5,3),
QuantiteEnStock NUMBER(3)
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 24

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 12
30/04/2013

II.2. Définition des données


 Table Commande
CREATE TABLE Commande(
NumCmd NUMBER(10) Primary Key,
DateCmd DATE Default SYSDATE,
NumCl NUMBER(8),
CONSTRAINT FKCmdCl FOREIGN KEY NumCl
REFERENCES Client(NumCl)
ON DELETE CASCADE
ON UPDATE CASCADE
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 25

II.2. Définition des données


 Table Ligne_Commande
CREATE TABLE Ligne_Commande(
NumCmd NUMBER(10) Primary Key,
NumAr NUMBER(8) Primary Key,
QuantiteCmd NUMBER(3),
CONSTRAINT CHKQte CHECK
(QuantiteCmd<=Article.QuantiteEnStock),
CONSTRAINT FKLgCmdCl FOREIGN KEY NumCmd
REFERENCES Commande(NumCmd),
CONSTRAINT FKLgCmdAr FOREIGN KEY NumAr
REFERENCES Article(NumAr)
ON DELETE CASCADE
ON UPDATE CASCADE
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 26

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 13
30/04/2013

II.2. Définition des données


 Table Ligne_Commande
CREATE TABLE Ligne_Commande(
NumCmd NUMBER(10),
NumAr NUMBER(8),
QuantiteCmd NUMBER(3),
CONSTRAINT CHKQte CHECK
(QuantiteCmd<=Article.QuantiteEnStock),
CONSTRAINT PKLg PRIMARY KEY (NumCmd,NumAr),
CONSTRAINT FKLgCmdCl FOREIGN KEY NumCmd
REFERENCES Commande(NumCmd),
CONSTRAINT FKLgCmdAr FOREIGN KEY NumAr
REFERENCES Article(NumAr)
ON DELETE CASCADE
ON UPDATE CASCADE
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 27

II.3. Mise à jour des données


Ajout d’un tuple
INSERT INTO nom_table
VALUES (val_att1, val_att2, …);

ex. INSERT INTO Produit


VALUES (400, 'Nouveau produit', 78.90);

Mise à jour d’un attribut


UPDATE nom_table SET attribut=valeur
[WHERE condition];

ex. UPDATE Client SET Nom=‘BOUSLIMI’ WHERE NumCli = 3;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 28

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 14
30/04/2013

II.3. Mise à jour des données


Suppression de tuples
DELETE FROM nom_table
[WHERE condition];

ex. DELETE FROM Produit;

DELETE FROM Client


WHERE Ville = ‘Jendouba’;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 29

II.4. Interrogation des données


SELECT [ALL|DISTINCT] attribut(s) FROM table(s)
[WHERE condition]
[GROUP BY attribut(s) [HAVING condition]]
[ORDER BY attribut(s) [ASC|DESC]];

Tous les tuples d’une table Ou par


exemple
ex. SELECT * FROM Client;

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

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 15
30/04/2013

II.4. Interrogation des données


Calculs
ex. Calcul de prix TTC
SELECT PrixUni+PrixUni*0.206 FROM Produit;

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

II.4. Interrogation des données


ex. Commandes en quantité au moins égale à 3
SELECT * FROM Commande
WHERE Quantite >= 3;

ex. Produits dont le prix est compris entre 50 et 100 DT


SELECT * FROM Produit
WHERE PrixUni BETWEEN 50 AND 100;
ex. Commandes en quantité indéterminée
SELECT * FROM Commande
WHERE Quantite IS NULL;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 32

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 16
30/04/2013

II.4. Interrogation des données


ex. Clients habitant une ville dont le nom se termine par
ouba.

SELECT * FROM Client


WHERE Ville LIKE ‘%ouba’;

‘je%’  commence par je


‘%ou%’  contient le mot ou
‘%ba  termine par ba
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 33

II.4. Interrogation des données


ex. Prénoms des clients dont le nom est Abidi, Zaghdoudi
ou Bouslimi.

SELECT Prenom FROM Client


WHERE Nom IN (‘Abidi’, ‘Zaghdoudi’, ‘Bouslimi’);

NB : Possibilité d’utiliser la négation pour tous ces


prédicats : NOT BETWEEN, NOT NULL, NOT LIKE,
NOT IN.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 34

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 17
30/04/2013

II.4. Interrogation des données


Fonctions d’agrégat
Elles opèrent sur un ensemble de valeurs.

– AVG(), VARIANCE(), STDDEV() : moyenne, variance et écart-type


des valeurs
– SUM() : somme des valeurs
– MIN(), MAX() : valeur minimum, valeur maximum
– COUNT() : nombre de valeurs

ex. Moyenne des prix des produits


SELECT AVG(PrixUni) FROM Produit;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 35

II.4. Interrogation des données


Opérateur DISTINCT

ex. Nombre total de commandes


SELECT COUNT(*) FROM Commande;
SELECT COUNT(NumCli) FROM Commande;

ex. Nombre de clients ayant passé commande


SELECT COUNT( DISTINCT NumCli) FROM Commande;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 36

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 18
30/04/2013

II.4. Interrogation des données


Table COMMANDE (simplifiée)
NumCli Date Quantité
1 28/02/2013 1
3 28/02/2013 5
3 28/02/2013 2

COUNT(NumCli)
 Résultat = 3

COUNT(DISTINCT NumCli)
 Résultat = 2

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 37

II.4. Interrogation des données


Jointure

ex. Liste des commandes avec le nom des clients

SELECT Nom, Date, Quantite


FROM Client, Commande
WHERE Client.NumCli =Commande.NumCli;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 38

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 19
30/04/2013

II.4. Interrogation des données


ex. Idem avec le numéro de client en plus

SELECT C1.NumCli, Nom, Date, Quantite


FROM Client C1, Commande C2
WHERE C1.NumCli = C2.NumCli
ORDER BY Nom;

NB : Utilisation d’alias (C1 et C2) pour alléger l’écriture


+ tri par nom.
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 39

II.4. Interrogation des données


Jointure exprimée avec le prédicat IN
ex. Nom des clients qui ont commandé le 28/02/2013

SELECT Nom
FROM Client
WHERE NumCli IN (
SELECT NumCli
FROM Commande
WHERE Date = ‘28-02-2013’
);

NB : Il est possible d’imbriquer des requêtes.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 40

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 20
30/04/2013

II.4. Interrogation des données


Prédicats EXISTS / NOT EXISTS

ex. Clients qui ont passé au moins une commande


[n’ont passé aucune commande]

SELECT *
FROM Client C1
WHERE [NOT] EXISTS (
SELECT *
FROM Commande C2
WHERE C1.NumCli = C2.NumCli);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 41

II.4. Interrogation des données


Prédicats ALL / ANY

ex. Numéros des clients qui ont commandé au moins un produit en


quantité supérieure à chacune [à au moins une] des quantités
commandées par le client n° 1.

SELECT DISTINCT NumCli


FROM Commande
WHERE Quantite > ALL [ANY] (
SELECT Quantite
FROM Commande
WHERE NumCli = 1);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 42

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 21
30/04/2013

II.4. Interrogation des données


Groupement

ex. Quantité totale commandée par chaque client


SELECT NumCli, SUM(Quantite)
FROM Commande
GROUP BY NumCli;

ex. Nombre de produits différents commandés...


SELECT NumCli, COUNT(DISTINCT NumProd)
FROM Commande
GROUP BY NumCli;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 43

II.4. Interrogation des données

ex. Quantité moyenne commandée pour les produits


faisant l’objet de plus de 3 commandes

SELECT NumProd, AVG(Quantite)


FROM Commande
GROUP BY NumProd
HAVING COUNT(*)>3;

Attention : La clause HAVING ne s’utilise qu’avec


GROUP BY.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 44

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 22
30/04/2013

II.4. Interrogation des données


Opérations ensemblistes
INTERSECT, MINUS, UNION

ex. Numéro des produits qui soit ont un prix


inférieur à 100 DT, soit ont été commandés
par le client n° 2

SELECT NumProd FROM Produit WHERE PrixUni<100


UNION
SELECT NumProd FROM Commande WHERE NumCLi=2;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 45

II.4. Interrogation des données


Fonctions SQL*Plus
– ABS(n) : Valeur absolue de n – LOWER(ch) : c en minuscules
– CEIL(n) : Plus petit entier ≥ n – UPPER(ch) : c en majuscules
– FLOOR(n) : Plus grand entier ≤ n – LTRIM(ch, n) : Troncature à gauche
– MOD(m, n) : Reste de m/n – RTRIM(ch, n) : Troncature à droite
– POWER(m, n) : mn – REPLACE(ch, car) : Remplacement
de caractère
– SIGN(n) : Signe de n
– SUBSTR(ch, pos, lg) : Extraction de
– SQRT(n) : Racine carrée de n chaîne
– ROUND(n, m) : Arrondi à 10-m – SOUNDEX(ch) : Cp. Phonétique
– TRUNC(n, m) : Troncature à 10-m – LPAD(ch, lg, car) : Compléter à
– CHR(n) : Caractère ASCII n° n gauche
– INITCAP(ch) : 1ère lettre en maj. – RPAD(ch, lg, car) : Compléter à droite

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 46

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 23
30/04/2013

II.4. Interrogation des données


Fonctions SQL*Plus
– ASCII(ch) : Valeur ASCII de ch – TO_NUMBER(ch) : Conversion de
– INSTR(ch, ssch) : Recherche de ch en nombre
ssch dans ch – TO_CHAR(x) : Conversion de x en
– LENGTH(ch) : Longueur de ch chaîne
– ADD_MONTHS(dte, n) : Ajout de – TO_DATE(ch) : Conversion de ch
n mois à dte en date
– LAST_DAY(dte) : Dernier jour du – NVL(x, val) : Remplace par val si x
mois a la valeur NULL
– MONTHS_BETWEEN(dt1, dt2) : – GREATEST(n1, n2…) : + grand
Nombre de mois entre dt1 et dt2 – LEAST (n1, n2…) : + petit
– NEXT_DAY(dte) : Date du – UID : Identifiant numérique de
lendemain l’utilisateur
– SYSDATE : Date/heure système – USER : Nom de l’utilisateur
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 47

II.5. Gestion des transactions


– Transaction : ensemble de modifications de la base

– Début de transaction : début de la session de travail


ou fin de la transaction précédente

– Validation (et fin) d’une transaction : COMMIT;

– Annulation (et fin) d’une transaction : ROLLBACK;



– Fin de session de travail  validation automatique
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 48

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 24
30/04/2013

Exercice d’application
Soit le schéma relationnel suivant :

Client(Codeclt, Nom, Adr, Tel)


Commande(Numcmd, Datecmd, #Codeclt)
Ligne_Commande(#Numcmd, #Codeprd, Qtec)
Produit(Codeprd, Designation, Pu, Qtes)

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 49

Exercice d’application
Q1) Liste des clients.

SELECT *
FROM Client;
Ou
SELECT Codeclt, Nom, Adr, Tel
FROM Client;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 50

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 25
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 51

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’;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 52

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 26
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 53

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 54

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 27
30/04/2013

Exercice d’application
Q3) Noms des clients qui habitent à Jendouba
ordonné par ordre alphabétique.
Résultat
Nom
Ali
Karim
Manel
Ridha

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 55

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

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 28
30/04/2013

Exercice d’application
Q4) Noms des clients qui habitent à Jendouba
et Beja.
Résultat
Nom
Ali
Mohamed
Karim
Manel
Marwa
Ridha

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 57

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 58

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 29
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 59

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’;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 60

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 30
30/04/2013

Exercice d’application
Q6) Noms des clients qui commencent par ‘A’
et qui habitent à Tunis.
Résultat
Nom
Abir

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 61

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 62

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 31
30/04/2013

Exercice d’application
Q7)Noms des clients qui ont passé des
commandes.
SELECT Nom
FROM Client
WHERE Codeclt In (SELECT Codeclt
FROM Commande);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 63

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);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 64

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 32
30/04/2013

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 65

Exercice d’application
Q7)Noms des clients qui ont passé des
commandes.
Résultat
Nom
Ali
Mohamed
Insaf
Manel
Walid
Abir

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 66

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 33
30/04/2013

Exercice d’application
Q8)Noms des clients qui ont passé au plus une
commande.

Même réponse que Q7

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 67

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);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 68

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 34
30/04/2013

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);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 69

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 70

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 35
30/04/2013

Exercice d’application
Q9)Noms des clients qui ont passé des
commandes.
Résultat
Nom
Karim
Marwa
Ridha
Nabiha

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 71

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’);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 72

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 36
30/04/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
);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 74

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 37
30/04/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 CL
WHERE
(SELECT COUNT(*)
FROM Commande CD
WHERE (Datecmd Between ’01/01/2013’ AND ‘31/12/2013’)
AND CL.Codeclt = CD.Codeclt)>0;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 75

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 76

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 38
30/04/2013

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’;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 77

Exercice d’application
Q11)Nombre total des commandes passé
pendant l’année 2013.
Résultat
Expr1000
10

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 78

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 39
30/04/2013

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’;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 79

Exercice d’application
Q12)Nombre des clients qui ont passé des
commandes en 2013.
Résultat
Expr1000
6

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 80

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 40
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 82

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 41
30/04/2013

Exercice d’application
Q14)La somme et la moyenne des prix des
produits commandés.).

SELECT SUM(PU*Qtec), AVG(PU*Qtec)


FROM Produit P, Ligne_Commande L
WHERE P.Codeprod = L.codeprod;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 83

Exercice d’application
Q14)La somme et la moyenne des prix des
produits commandés.
Résultat
Expr1000 Expr1001
30222.5942420959 1679.03301344977

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 84

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 42
30/04/2013

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 85

Exercice d’application
Q15)Désignation des produits qui sont les plus
vendus.
Résultat
Designation
Chemise
Pantalon
Pull

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 86

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 43
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 88

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 44
30/04/2013

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’;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 89

Exercice d’application
Q17)Nom des clients qui ont commandé le même
produit que Abir.
Résultat
Nom
Insaf
Moham
ed
Walid

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 90

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 45
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 92

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 46
30/04/2013

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);

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 94

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 47
30/04/2013

Exercice d’application
Q19)Nom des clients qui ont commandé tous les
produits.
Résultat
Nom
Insaf
Walid

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 95

II.6. Les vues


– Vue : table virtuelle calculée à partir d’autres tables
grâce à une requête

– Définition d’une vue


CREATE VIEW nom_vue AS requête;

ex. CREATE VIEW Noms AS


SELECT Nom, Prenom FROM Client;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 96

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 48
30/04/2013

II.6. Les vues


Intérêt des vues
Simplification de l’accès aux données en masquant les
opérations de jointure

ex. CREATE VIEW Prod_com AS


SELECT P.NumProd, Dési, PrixUni, Date, Quantite
FROM Produit P, Commande C
WHERE P.NumProd=C.NumProd;

SELECT NumProd, Dési FROM Prod_com


WHERE Quantite>10;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 97

II.6. Les vues


Intérêt des vues
– Sauvegarde indirecte de requêtes complexes

– Présentation de mêmes données sous différentes formes


adaptées aux différents usagers particuliers

– Support de l’indépendance logique


ex. Si la table Produit est remaniée, la vue Prod_com
doit être refaite, mais les requêtes qui utilisent cette vue
n’ont pas à être remaniées.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 98

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 49
30/04/2013

II.6. Les vues


Intérêt des vues

Renforcement de la sécurité des données par masquage des


lignes et des colonnes sensibles aux usagers non habilités

Problèmes de mise à jour, restrictions

La mise à jour de données via une vue pose


des problèmes et la plupart des systèmes impose d’importantes
restrictions.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 99

II.6. Les vues


Problèmes de mise à jour, restrictions
– Le mot clé DISTINCT doit être absent.

– La clause FROM doit faire référence à une seule table.

– La clause SELECT doit faire référence directement aux


attributs de la table concernée (pas d’attribut dérivé).

– Les clauses GROUP BY et HAVING sont interdites.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 100

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 50
30/04/2013

II.7. Sécurité et autorisation


Transmission de privilèges
GRANT privilège ON table|vue
TO user|PUBLIC [WITH GRANT OPTION];

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 101

Plan du cours
I. Introduction
II. Le langage SQL
III.PL/SQL
IV. Les triggers

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 102

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 51
30/04/2013

III.1. Généralités
PL/SQL : Langage procédural
Extension de SQL

 Déclaration de variables et de constantes


 Définition de sous-programmes
 Gestion des erreurs à l’exécution (exceptions)
 Manipulation de données avec SQL

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 103

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)

Support de cours : SGBD


104
Enseignant : Riadh BOUSLIMI

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 52
30/04/2013

III.2. Bloc PL/SQL


DECLARE
--Déclaration constantes/variables

BEGIN
--Commandes/instructions

EXCEPTION
--Traitement des erreurs à l’exé.

END;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 105

III.3. Déclarations

Support de cours : SGBD


106
Enseignant : Riadh BOUSLIMI

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 53
30/04/2013

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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 107

III.3. Déclarations

– Type d’une autre variable


ex. credit REAL;
debit credit%TYPE;

– Type d'un attribut d'une table


ex. num_emp EMP.EMPNO%TYPE;

– Type d’un tuple d’une table


ex. un_client client%ROWTYPE;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 108

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 54
30/04/2013

III.4. Instructions de base


– Affectation simple
ex. numero:=0;
numero:=numero+1;
– Affectation des Valeurs issues d'une base de données
SELECT numcli INTO numero
FROM client WHERE numcli=10;

SELECT empno, ename INTO num, nom


FROM emp WHERE ename=‘BOUSLIMI';

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 109

III.4. Instructions de base


– Expressions et comparaisons
 Opérateurs arithmétiques : + - / * **
 Opérateur de concaténation : ||
 Opérateurs de comparaison :
= < > <= >= < >
IS NULL, LIKE, BETWEEN, IN
 Opérateurs logiques : AND, OR, NOT

Support de cours : SGBD


110
Enseignant : Riadh BOUSLIMI

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 55
30/04/2013

III.5. Structures de contrôle


– Instruction sélective
IF-THEN, IF-THEN-ELSE ou IF-THEN-ELSIF

IF condition1 THEN
-- Instructions
ELSEIF condition2 THEN
-- Instructions
ELSE
-- Instructions
END IF;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 111

III.5. Structures de contrôle


– Instructions itératives

 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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 112

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 56
30/04/2013

III.5. Structures de contrôle


– Branchement inconditionnel
GOTO étiquette;
Formellement interdit

– Branchement de sortie de boucle
EXIT WHEN condition;
Uniquement autorisé pour

sortir d'une boucle infinie

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 113

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));

Support de cours : SGBD


114
Enseignant : Riadh BOUSLIMI

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 57
30/04/2013

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;

Support de cours : SGBD


115
Enseignant : Riadh BOUSLIMI

III.7. Les collections


– Collection : Ensemble ordonné d'éléments du
même type. Chaque élément possède un indice
qui détermine sa position dans la collection.
– Deux types de collections :
 Tableau (VARRAY) : taille maximum, dense
 Table (TABLE) : extensible, non-dense

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 116

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 58
30/04/2013

III.7. Les collections


1. Déclaration d'un type collection
ex. TYPE TableChar TABLE OF VARCHAR(20);
TYPE TableauInt VARRAY(10) OF INTEGER;
2. Déclaration d'une variable collection
ex. ma_table TableChar :=
TableChar('Aa', 'Bb', 'Cc');
mon_tableau TableauInt := TableauInt();
NB : Une collection peut être initialisée à vide.
Il n'est pas nécessaire d'initialiser tous les éléments d'un tableau.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 117

III.7. Les collections


– Affectation de collections entières
ex. DECLARE
T1 TABLE OF INTEGER;
T2 TABLE OF INTEGER;
et11 T1 := T1(1, 2, 3, 4);
et12 T1 := T1(5, 6);
et2 T2 := T2();
BEGIN
et12 := et11; -- Légal
et2 := et11; -- Illégal
– Affectation d'éléments de collection
ex. et11(1) := 10;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 118

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 59
30/04/2013

III.7. Les collections


– Méthodes (≈ procédures) prédéfinies
Utilisation : nom_col.nom_méth[(param)]
– EXISTS(i) retourne TRUE si le ième élément de la
collection existe.
– COUNT retourne le nombre d'éléments dans la collection.
– LIMIT retourne la taille maximum de la collection (ou NULL
pour les tables).
– EXTEND(n) augmente la taille de la collection de n
éléments. EXTEND est équivalent à EXTEND(1).

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 119

III.7. Les collections


– TRIM(n) supprime n éléments en fin de collection (la taille
de la collection est diminuée). TRIM est équivalent à
TRIM(1).
– DELETE(i), DELETE(i,j), DELETE effacent le ième
élément, les éléments d'indice i à j et tous les éléments de la
collection, respectivement (tables uniquement).
– FIRST et LAST retournent l'indice du premier et du dernier
élément de la collection, resp.
NB : FIRST=1 et LAST=COUNT pour un tableau.
– PRIOR(n) et NEXT(n) retournent l'indice de l'élément
précédent et suivant de l'élément d'indice n, resp.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 120

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 60
30/04/2013

III.7. Les collections


Exemple
DECLARE
TYPE Liste_Entiers TABLE OF INTEGER;
pile Liste_Entiers := Liste_Entiers();
element INTEGER;
BEGIN
-- Ajouts au sommet de la pile (empiler)
pile.EXTEND;
pile(pile.COUNT) := 1;
pile.EXTEND;
pile(pile.COUNT) := 11;
-- Suppression du sommet (dépiler)
element := pile(pile.COUNT); -- element=11
pile.TRIM;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 121

III.8. Les enregistrements


– Enregistrement : Ensemble de données
logiquement liées stockées dans des champs.
1. Déclaration d'un type enregistrement
ex. TYPE Etudiant IS RECORD(
num_etu INTEGER,
nom VARCHAR(50),
age INTEGER);
2. Déclaration d'une variable enregistrement
ex. un_etudiant Etudiant;
Support de cours : SGBD Enseignant : Riadh BOUSLIMI 122

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 61
30/04/2013

III.8. Les enregistrements


– Référencement direct
ex. un_etudiant.num_etu := 3201;
un_etudiant.nom := BOUSLIMI';
un_etudiant.age := 6;
– Résultat de requête
ex. SELECT num_etu, nom, age
INTO un_etudiant
FROM ETUDIANT
WHERE num_etu = 3201;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 123

III.9. Curseurs
– Curseur : structure de données permettant de
stocker le résultat d’une requêtes qui retourne
plusieurs tuples

– Déclaration : CURSOR nom_curs IS requête;


ex. CURSOR calcul IS
SELECT numprod, prixuni*1.206 prixttc
FROM produit;

NB : Un tuple du curseur sera de type calcul%ROWTYPE.

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 124

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 62
30/04/2013

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;

Support de cours : SGBD


125
Enseignant : Riadh BOUSLIMI

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;

Support de cours : SGBD


126
Enseignant : Riadh BOUSLIMI

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 63
30/04/2013

III.9. Curseurs
– Attributs des curseurs

%NOTFOUND : FALSE si FETCH retourne un


résultat
%FOUND : opposé logique de %NOTFOUND
%ROWCOUNT : Nombre de lignes lues
%ISOPEN : TRUE si le curseur est ouvert

– Fermeture d’un curseur : CLOSE nom_curs;


Support de cours : SGBD Enseignant : Riadh BOUSLIMI 127

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.

– Fonctions PL/SQL pour la gestion d’erreurs

SQLCODE : Code de la dernière exception levée


SQLERRM : Message d’erreur associé

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 128

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 64
30/04/2013

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 129

III.8. Exceptions
– Exceptions personnalisées

 Déclaration : nom_exc EXCEPTION;


 Lever l’exception : IF condition THEN
RAISE nom_exc;
END IF;

– Traitement des exceptions


WHEN nom_exc THEN -- Instruction
ex. WHEN probleme THEN
RAISE_APPLICATION_ERROR(-20501,’Erreur !’);

NB : -20999 ≤ no d’erreur ≤ -20001

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 130

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 65
30/04/2013

III.9. Sous-programmes
– Fonctions

FUNCTION nomf (param1, param2…)


RETURN type_valeur_de_retour IS
-- Déclarations locales
BEGIN
-- Instructions
RETURN valeur_de_retour;
EXCEPTION
-- Traitement des exceptions
END;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 131

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 132

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 66
30/04/2013

III.10. Exemple de programme PL/SQL


-- Calcul du prix TTC des produits
-- et recopie dans la table PRODTTC

DECLARE

nbp NUMBER(3);
aucun_produit EXCEPTION;

CURSOR calcul IS
SELECT numprod, prixuni*1.206 prixttc
FROM produit;

tuple calcul%ROWTYPE;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 133

III.10. Exemple de programme PL/SQL


BEGIN

-- Comptage des produits


SELECT COUNT(*) INTO nbp FROM produit;

-- Test « il existe des produits » ou pas ?


IF nbp = 0 THEN
RAISE aucun_produit;
END IF;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 134

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 67
30/04/2013

III.10. Exemple de programme PL/SQL


-- Recopie des valeurs dans la table prodttc

FOR tuple IN calcul LOOP


INSERT INTO prodttc VALUES (tuple.numprod, tuple.prixttc);
END LOOP;

-- Validation de la transaction
COMMIT;

EXCEPTION

WHEN aucun_produit THEN RAISE_APPLICATION_ERROR(-20501,


‘Erreur : table produit vide’);

END;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 135

Plan du cours
I. Introduction
II. Le langage SQL
III. PL/SQL
IV.Les triggers

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 136

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 68
30/04/2013

IV.1. Définition
– Trigger (déclencheur) : routine déclenchée
automatiquement par des événements liés à
des actions sur la base

– Les triggers complètent les contraintes d’intégrité


en permettant des contrôles et des traitements plus
complexes.

Support de cours : SGBD


137
Enseignant : Riadh BOUSLIMI

IV.2. Types de triggers

Insertion Suppression Mise à jour

Avant 1 2 3

Après 4 5 6

…d’une table de la base


Support de cours : SGBD Enseignant : Riadh BOUSLIMI 138

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 69
30/04/2013

IV.3. Création d’un trigger


– En SQL*Plus :

CREATE [OR REPLACE] TRIGGER nom_trig


BEFORE|AFTER
INSERT|DELETE|UPDATE
ON nom_table
FOR EACH ROW
-- Bloc PL/SQL contenant le
-- traitement à effectuer

– Variables spécifiques
:OLD.nom_attribut : valeur de l’attribut avant mise à jour
:NEW.nom_attribut : valeur de l’attribut après mise à jour

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 139

IV.4. Exemple de trigger


-- Test de clé primaire sur la table client

CREATE OR REPLACE TRIGGER trig_clep


BEFORE INSERT ON client
FOR EACH ROW

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

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 140

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 70
30/04/2013

IV.4. Exemple de trigger


-- Valeur nulle
IF :NEW.numcli IS NULL THEN
RAISE cle_nulle;
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;

Support de cours : SGBD Enseignant : Riadh BOUSLIMI 141

Fin du cours

142

Support de cours : SGBD


Enseignant : Riadh BOUSLIMI 71
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, Economiques Année Universitaire : 2012/2013
et de Gestion de Jendouba Semestre 2

TP n°1

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) ;


- de manipuler les données (Ajouter, modifier et supprimer) de la base de données en utilisant le
langage de manipulation de données(LMD).
- d’afficher la structure des tables sous le SGBD oracle.

On donne le 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)

Création d’une base de données


1. En utilisant le langage SQL, créer la base de données sans la création des contraintes des clés
primaires et des clés étrangères dont la structure est présentée ci-dessous :

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 Commande Table Article


Num_comm Date_comm Code_client Code_art Des_art PU Qte_stock
000100/2013 20/02/2013 T0122 Dis312 Disquette 3-1/2 1.200 0
002087/2013 01/03/2013 S0010 CD700 CDROM Vierge 700 Mo 15
001123/2013 15/03/2013 M5423 ClaBil Clavier Bilingue 12.200 0
003400/2013 24/03/2013 T0122 SouPS2 Souris 5.500 0
AppPho Appareil Photo Numérique 20
LanCard Carte Réseau 0

2. Ajouter les enregistrements suivants à la table Detail_commande. Remarques ?

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)

Création d’une base de données

1. Structure de la base de données

-- Création de la base de données


CREATE DATABASE Stock;

--Création de la table “Article”


CREATE TABLE Article
(
Code_art VARCHAR(20),
Des_art VARCHAR(50) NOT NULL,
PU NUMBER(8,3),
Qte_stock NUMBER(5) DEFAULT 0,
CONSTRAINT chkQtes CHECK Qte_stock>=0
);

--Création de la table “Client”


CREATE TABLE Client
(
Code_client VARCHAR(20),
Nom_client VARCHAR(20) NOT NULL,
Prenom_client VARCHAR(30),
Adr_client VARCHAR(20) NOT NULL,
Tel_client NUMBER(8),
Email_client VARCHAR(50),
Chiffre_affaires_annee_en_cours NUMBER(10,3),
Cumul_chiffre_affaires NUMBER(12,3),
);

--Création de la table “Commande”


CREATE TABLE Commande
(
Num_comm VARCHAR(20) Primary key,
Date_comm DATE,
Code_client VARCHAR(20),
CONSTRAINT ChkDatecmd CHECK (Date_comm<=SYSDATE),
);

--Création de la table “Detail_commande”


CREATE TABLE Detail_commande
(
Num_comm VARCHAR(20),
Code_art VARCHAR(20),
Qte_comm NUMBER(3),
CONSTRAINT ChkQtecmd CHECK (Qte_comm>0),
);

Page 1/4
2. Ajouter les contraintes des clés primaires et étrangères des tables déjà créées.

--Ajout de la contrainte de la clé primaire de la table Article


ALTER TABLE Article
ADD CONSTRAINT PKArt PRIMARY KEY(Code_art);

--Ajout de la contrainte de la clé primaire de la table Client


ALTER TABLE Client
ADD CONSTRAINT PKClt PRIMARY KEY(Code_client);

--Ajout de la contrainte de la clé primaire de la table Commande


ALTER TABLE Commande
ADD CONSTRAINT PKCmd PRIMARY KEY(Num_comm);

--Ajout de la contrainte de la clé étrangère de la table Commande


ALTER TABLE Commande
ADD CONSTRAINT FKCmdClt FOREIGN KEY(Code_client)
REFERENCES Client(Code_client);

--Ajout de la contrainte de la clé primaire de la table Detail_commande


ALTER TABLE Detail_commande
ADD CONSTRAINT PKDetailCmd PRIMARY KEY(Num_comm,Code_art);

--Ajout de la contrainte de la clé étrangère de la table Detail_commande


ALTER TABLE Detail_commande
ADD CONSTRAINT FKCmd FOREIGN KEY(Num_comm)
REFERENCES Client(Num_comm);

--Ajout de la contrainte de la clé étrangère de la table Detail_commande


ALTER TABLE Detail_commande
ADD CONSTRAINT FKArt FOREIGN KEY(Code_art)
REFERENCES Article(Code_art);

3. Créer une copie de la table Client nommé "Clientele"

CREATE TABLE Clientele AS SELECT * FROM Client;

4. Renommer la table "Detail_commande" par "Ligne_commande".


1ère solution
RENAME Detail_commande TO Ligne_commande;
ème
2 solution
ALTER TABLE Detail_commande RENAME TO Ligne_commande;

5. Ajouter à la table "Ligne_Commande" le champ "PrixVente" de Type Numérique(8,3);

ALTER TABLE Ligne_commande


ADD (PrixVente NUMBER(8,3)) ;

6. Augmenter la taille du champ "Adresse" de la table "Client" de 20 à 50 caractères;

ALTER TABLE Client


MODIFY Adresse VARCHAR(50) ;

Page 2/4
7. Ajouter une valeur 'prénom inconnu' comme valeur par défaut au champ
"Prenom_client" de la table "Client";

ALTER TABLE Client


MODIFY Prenom_client DEFAULT ‘prénom inconnu’ ;

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'.

ALTER TABLE Client


ADD CONSTRAINT ChkAdr CHECK (Adr_client IN ('Kef','Jendouba','Beja');

9. Modifier le type de données du champ "Tel_client" en Numérique(taille 8).

ALTER TABLE Client


MODIFY Tel_client NUMBER(8);

10. Supprimer le champ "Email_client" de la table Client.

ALTER TABLE Client


DROP Email_client;

11. Supprimer la table "Client".

DROP TABLE Client;

Mise à jour de la base de données


INSERT INTO Client
VALUES ('S0010','BRINSI','Sami','Jendouba',66536658,'brinssi.sami@gmail.tn',
15679.355,123765.540);
--ou
-- INSERT INTO Client (Code_client Nom_client,Prenom_client, Adr_client,
-- Tel_client,Email_client,
-- Chiffre_affaires_annee_en_cours,Cumul_chiffre_affaires)
-- VALUES('S0010','BRINSI','Sami','Jendouba',66536658,
-- 'brinssi.sami@gmail.tn',15679.355,123765.540);

INSERT INTO Client


VALUES ('T0122','ABIDI','Nadia','Tunis',66335297,'abidi.nadia@topnet.tn',
54987.210,339807.250);

INSERT INTO Client


VALUES ('M523','HAMDI','Amine','Beja',54578789,'hamdi.amine@orange.tn',
22765.705,564700.590);

--********************************************************************

INSERT INTO Article VALUES (' Dis312','Disquette 3-1/2',1.200,0);


--Comme la valeur par défaut pour Qte_stock = 0 on peut écrire
-- INSERT INTO Article (Code_art,Des_art,PU)
-- VALUES ('Dis312',' Disquette 3-1/2',1.200);

INSERT INTO Article VALUES ('CD700','CDROM Vierge 700 Mo',NULL,15);


--Comme on peut écrire aussi
-- INSERT INTO Article (Code_art,Des_art,Qte_stock)
-- VALUES ('CD700','CDROM Vierge 700 Mo',15);

Page 3/4
INSERT INTO Article (Code_art,Des_art,PU)
VALUES ('ClaBil','Clavier Bilingue',12.200);

INSERT INTO Article (Code_art,Des_art,PU)


VALUES ('SouPS2','Souris',5.500);

INSERT INTO Article (Code_art,Des_art,Qte_stock)


VALUES ('AppPho','Appareil Photo Numérique',20);

INSERT INTO Article (Code_art,Des_art)


VALUES ('LanCard','Carte Réseau');

--********************************************************************

INSERT INTO Commande (Num_comm,Date_comm,Code_client)


VALUES ('000100/2013',TO_DATE('20/02/2013', 'dd-mm-yyyy'), 'T0122');

--ou
--INSERT INTO Commande
--VALUES ('000100/2013',TO_DATE('20/02/2013', 'dd-mm-yyyy'), 'T0122');

INSERT INTO Commande


VALUES ('002087/2013',TO_DATE('01/03/2013', 'dd-mm-yyyy'), 'S0010');

INSERT INTO Commande


VALUES ('001123/2013',TO_DATE('15/03/2013', 'dd-mm-yyyy'), 'M5423');

INSERT INTO Commande


VALUES ('003400/2013',TO_DATE('24/03/2013', 'dd-mm-yyyy'), ' T0122');

--********************************************************************

INSERT INTO Detail_commande


VALUES ('001123/2013',' CD700', 5);

-- La requête d’insertion suivante ne sera pas exécutée par le SGBD


-- vu qu’il y’a une intégrité référentielle entre les deux tables Commande
-- et Detail_commande. Les valeurs autorisées pour le Num_comm
-- de la table fille Detail_commande doivent exister dans
-- le champ Num_comm de la table mère Commande.
--INSERT INTO Detail_commande
--VALUES ('007845/2013','AppPho', 4);

UPDATE Article
SET PU = 0.500, Qte_stock=100
WHERE Code_art ='CD700';

DELETE Commande WHERE Num_comm = '003400/2013';

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.

Considérons la base de données dont le schéma et l'extension sont donnés ci-dessous :

EMP (EMPNO, ENOM, FONCTION, #MGR, DATEEMB, SAL, COMM, #DEPTNO)


DEPT (DEPTNO, DNOM, LOC)

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

Création de la base de données, contraintes d’intégrité

1. Créer la table DEPT. Ne pas oublier de définir le numéro de département DEPTNO


comme clé primaire. Intégrer également la contrainte de domaine suivante : le nom
d'un département (DNOM) ne peut être que COMPTABLE, RECHERCHE, VENTES ou
OPERATIONS.

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 ?

5. Annuler l’insertion précédente.

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…

7. Dans EMP, ajouter le nouvel employé :


(7657, 'HOUSSEM', 'MANAGER',7839,'17/11/1991', 3500.00, 600.00, 10).

8. Valider l’insertion précédente.

Mise à jour de la base de données

1. Changer la localisation (LOC) du département VENTES de SOUSSE à HAMMEM


SOUSSE.

2. Dans EMP, augmenter de 10 % le salaire (SAL) des chercheurs dont la commission


(COMM) est supérieure à 50 % du salaire.

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.

4. Annuler les trois mises à jour précédentes.

5. Dans DEPT, supprimer le département n° 20 (DEPTNO). Remarque ?

Interrogation de la base de données

1. Nom (ENOM), salaire, commission, salaire+commission de tous les vendeurs


(VENTESMAN).

2. Nom des vendeurs par ordre décroissant du ratio commission/salaire.

3. Nom des vendeurs dont la commission est inférieure à 25% de leur salaire.

4. Nombre d'employés du département n° 10.

Page 3/4
5. Nombre d'employés ayant une commission.

6. Nombre de fonctions (FONCTION) différentes.

7. Salaire moyen par fonction (sans tenir compte des commissions).

8. Total des salaires du département VENTES.

9. Nom des employés avec le nom de leur département.

10. Nom, fonction et salaire de l'employé ayant le salaire le plus élevé.

11. Nom des employés gagnant plus que WALID.

12. Nom des employés occupant la même fonction que WALID.

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

Création de la base de données, et des contraintes d’intégrité


1) CREATE TABLE DEPT
(
DEPTNO NUMBER(2),
DNOM VARCHAR(20),
LOC VARCHAR(20),
CONSTRAINT D_CLEP PRIMARY KEY (DEPTNO),
CONSTRAINT D_DOM CHECK (DNOM IN
('COMPTABLE','RECHERCHE','VENTE','OPERATIONS'))
);

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’);

3) CREATE TABLE EMP AS SELECT * FROM SCOTT.EMP;

4) INSERT INTO EMP VALUES (7369, 'Bidon', NULL, NULL, NULL, NULL, NULL, NULL);

5) ROLLBACK;

6) ALTER TABLE EMP


ADD CONSTRAINT E_CLEP PRIMARY KEY(EMPNO);

7) ALTER TABLE EMP


ADD CONSTRAINT E_CLET1 FOREIGN KEY(DEPTNO)
REFERENCES DEPT(DEPTNO);

8) ALTER TABLE EMP


ADD CONSTRAINT E_CLET2 FOREIGN KEY(MGR)
REFERENCES EMP(EMPNO);

9) INSERT INTO EMP


VALUES(7657, 'HOUSSEM', 'MANAGER', 7839, '17/11/1991',3500.00, 600.00, 10);

10) COMMIT;

Mise à jour de la base de données


1) UPDATE DEPT
SET LOC='HAMMEM SOUSSE'
WHERE DNOM='VENTE';

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;

Interrogation de la base de données

1) SELECT ENOM, SAL, COMM, SAL+COMM


FROM EMP
WHERE FONCTION='SALESMAN';

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;

6) SELECT COUNT(DISTINCT FONCTION)


FROM EMP;

7) SELECT FONCTION, AVG(SAL)


FROM EMP
GROUP BY FONCTION;

8) SELECT SUM(SAL)
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
AND DNOM='SALES';

9) SELECT ENOM, DNOM


FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO;

10) SELECT ENOM, FONCTION, SAL


FROM EMP
WHERE SAL>=ALL(SELECT SAL FROM EMP);

11) SELECT ENOM


FROM EMP
WHERE SAL>(SELECT SAL
FROM EMP
WHERE ENOM='WALID');

12) SELECT ENOM


FROM EMP
WHERE FONCTION=(SELECT FONCTION
FROM EMP
WHERE ENOM='WALID')
AND ENOM<>'WALID';

Page 2/3
13) SELECT ENOM
FROM EMP
WHERE MGR=(SELECT MGR
FROM EMP
WHERE ENOM='SONIA')
AND ENOM<>'SONIA';

14) SELECT ENOM


FROM EMP
WHERE (FONCTION, MGR) IN (SELECT FONCTION, MGR
FROM EMP
WHERE ENOM='HOSNI')
AND ENOM<>'HOSNI';

15) SELECT ENOM


FROM EMP
WHERE DATEMB<ALL(SELECT DATEMB
FROM EMP
WHERE DEPTNO=10);

16) SELECT SUBALTERNE.ENOM, SUPERIEUR.ENOM


FROM EMP SUBALTERNE, EMP SUPERIEUR
WHERE SUBALTERNE.MGR=SUPERIEUR.EMPNO;

17) SELECT SUB.ENOM


FROM EMP SUB, EMP SUP
WHERE SUB.MGR=SUP.EMPNO
AND SUB.DEPTNO<>SUP.DEPTNO;

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.

On donne le schéma relationnel suivant :


PILOTE(NUMPIL, NOMPIL, ADR, SAL)
AVION(NUMAV, NOMAV, CAPACITE, LOC)
VOL(NUMVOL, #NUMPIL, #NUMAV, VILLE_DEP, VILLE_ARR, H_DEP, H_ARR)

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

Extension des tables


PILOTE AVION
NUMPIL NOMPIL ADR SAL NUMAV NOMAV CAPACITE LOC
1 ZIGHED Tunis 21000 1 A300 300 Monastir
2 BOUSSAID Djerba 21000 2 A310 300 Monastir
3 BOUSLIMI Monastir 18000 3 B707 250 Tunis
4 JBELI Tunis 17000 4 A300 280 Sousse
5 ZAGHDOUDI Djerba 19000 5 Concorde 160 Monastir
6 NASRAOUI Tunis 18000 6 B747 460 Tunis
7 GARBAA Monastir 17000 7 B707 250 Tunis
8 CHALGHOUM Sousse 15000 8 A310 300 Djerba
9 ARBI Monastir 18000 9 Mercure 180 Sousse
10 HOSNI Tunis 20000 10 Concorde 160 Tunis

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 :

1) Liste de tous les vols.


2) Nom et ville de tous les pilotes, par ordre alphabétique inverse.
3) Liste des avions dont la capacité est supérieure à 350 passagers.
4) Numéro et nom de tous les avions localisés à Monastir.
5) Numéros des pilotes en service et les villes de départ de leurs vols.
6) Villes accessibles (sans doublon) dont la ville de départ est 'TABARKA'.
7) Noms des pilotes domiciliés à Tunis dont leurs noms commencent par 'B'.
8) Liste des avions (numéro et nom) localisés à Monastir ou dont la capacité est inférieure à 350
passagers.
9) Liste des vols au départ de Monastir allant à Tunis après 18 heures.
10) Numéros des pilotes qui ne sont pas en service.
11) Les vols (numéro, ville de départ) effectués par les pilotes de numéro 100 et 204.
12) Numéros des vols effectués au départ de Monastir par des pilotes de Monastir.
13) Les vols effectués par un avion qui n’est pas localisé à 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.
15) Noms des pilotes domiciliés à Tunis assurant un vol au départ de Monastir avec un Airbus.
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.
17) Les pilotes (numéro et nom) habitant dans la même ville que le pilote ZAGHDOUDI.
18) Numéros des pilotes en service différents de celui de BOUSLIMI.
19) Nom et numéro de vol des pilotes affectés à (au moins) un vol.
20) Les villes desservies (VILLE_ARR) à partir de la ville d’arrivée d’un vol au départ de Tunis.
21) Numéro et nom des avions affectés à des vols. Éliminer les doublons.
22) Les appareils (leur numéro) localisés dans la même ville que l’avion numéro 100.
23) Nombre total de vols.
24) Somme des capacités de tous les avions.
25) Moyenne et écart-type des durées des voyages.
26) Capacités minimum et maximum des avions.
27) Nombre de vols par pilote (indiquer uniquement le numéro des pilotes).
28) Nombre total d’heures de vol par pilote (préciser le nom des pilotes).
29) Numéro et nom des avions qui ne sont affectés à aucun vol.
30) Les pilotes (leur nom) de Tunis qui ont volé avec tous les avions.

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)

1) Liste de tous les vols.


SELECT *
FROM VOL;
2) Nom et ville de tous les pilotes, par ordre alphabétique inverse.
SELECT NOMPIL,ADR
FROM PILOTE;
3) Liste des avions dont la capacité est supérieure à 350 passagers.
SELECT *
FROM AVION
WHERE CAPACITE >350;
4) Numéro et nom de tous les avions localisés à Monastir.
SELECT NUMAV,NOMAV
FROM AVION
WHERE LOC = 'Monastir';
5) Numéros des pilotes en service et les villes de départ de leurs vols.
SELECT NUMPIL,VILLE_DEP
FROM VOL ;
6) Villes accessibles (sans doublon) dont la ville de départ est 'TABARKA'.
SELECT DISTINCT VILLE_ARR
FROM VOL
WHERE VILLE_DEP='Tabarka';
7) Noms des pilotes domiciliés à Tunis dont leurs noms commencent par 'B'.
SELECT NOMPIL
FROM PILOTE
WHERE ADR LIKE 'B%';
8) Liste des avions (numéro et nom) localisés à Monastir ou dont la capacité est inférieure à 350
passagers.
SELECT NUMAV,NOMAV
FROM AVION
WHERE LOC='Monastir'
OR CAPACITE <350;

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';

10) Numéros des pilotes qui ne sont pas en service.


1ère solution
SELECT NUMPIL
FROM PILOTE
MINUS
SELECT NUMPIL
FROM VOL

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');

18) Numéros des pilotes en service différents de celui de BOUSLIMI.


1ère solution
SELECT DISTINCT PILOTE.NUMPIL
FROM PILOTE, VOL
WHERE PILOTE.NUMPIL = VOL.NUMPIL
AND NOMPIL <> 'BOUSLIMI');

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);

23) Nombre total de vols.


SELECT COUNT(*)
FROM VOL;

24) Somme des capacités de tous les avions.


SELECT SUM(CAPACITE)
FROM AVION;

25) Moyenne et écart-type des durées des voyages.


SELECT AVG(H_FIN - H_DEB), STDDEV(H_FIN - H_DEB)
FROM VOL;

26) Capacités minimum et maximum des avions.


SELECT AVG(H_FIN - H_DEB), STDDEV(H_FIN - H_DEB)
FROM VOL;

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 ;

Exercice n°1(Les vues)

Soit le schéma relationnel suivant :

CLIENT(NumCli, Nom, Prenom, DateNaiss, CP, Rue, Ville)


PRODUIT(NumProd, Desi, PrixUni)
COMMANDE(NumCli#, NumProd#)

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).

3. Lister le contenu de la vue cliprod1.

4. Reformuler les deux premières requêtes de la question 1 en utilisant la vue cliprod1.


Commentaire ?

5. Formuler les requêtes suivantes en utilisant la vue cliprod1.

 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.

 Numéros des produits commandés plus de deux fois.

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.

7. Déduire la vue cliprod2. Lister le contenu de la vue cliprod1. Conclusion ?

Exercice n°2(Sécurité - Privilèges)

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.

2. Insérer un n-uplet dans la table TRANSACTION de vos voisions. Que se passe-t-il ?

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;

INSERT INTO voisins1.TRANSACTION


VALUES (80,'T8');

GRANT SELECT
ON TRANSACTION
TO voisins1;

INSERT INTO voisins1.TRANSACTION


VALUES (80,'T8');

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;

SELECT grantee, table_name, grantor, privilege


FROM user_tab_privs;

REVOKE SELECT ON TRANSACTION FROM voisins1;

REVOKE SELECT ON TRANSACTION FROM public;

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

Bloc PL/SQL DECLARE


--Déclaration constantes/variables
BEGIN
--Commandes/instructions
EXCEPTION
--Traitement des erreurs à l’exécution
END ;
Déclaration de variable Nom_variable TYPE_VARIABLE ;
Affectation Nom_variable := valeur ;
SELECT attribut INTO Nom_variable FROM table ;
Tests IF condition1 THEN
--Instructions
ELSEIF condition2 THEN
--Instructions
ELSE -- (optionnel)
--Instructions
END IF;
Boucles FOR compteur IN [REVERSE] min..max LOOP
--Instructions
END LOOP;
WHILE condtion LOOP
--Instructions
END LOOP;
LOOP
--Instructions
EXIT WHEN [condition];
END LOOP;
Curseurs -Déclaration CURSOR Nom_curseur IS Requête_SQL;
-Utilisation --Curseur implicite
FOR nuplet IN Nom_Curseur LOOP
--Instructions
--Ex. Nom_variable := nuplet.attribut ;
END LOOP ; -- NB : nuplet est de type Nom_Curseur%ROWTYPE
--Curseur explicite
OPEN Nom_curseur ;
LOOP
FETCH Nom_curseur INTO nuplet ;
--Instrcutions
EXIT WHEN Nom_curseur%NOTFOUND;
END LOOP
CLOSE Nom_curseur ;
Exception -Déclarer Nom_Exception EXCEPTION
-Lever RAISE NomException;
-Traiter WHEN Nom_Exception THEN – Instruction ;

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.

3. A la suite de ce programme, ajouter le code PL/SQL permettant d’afficher à l’écran la désignation


d’une pièce dont le numéro est saisi au clavier (utiliser une condition de type WHERE
nop=‘&variable_saisie’). Modifier la condition d’exception pour permettre l’exécution de
cette partie du code (par exemple, nombre de pièces supérieur à 60). Que se passe-t-il lorsque le
numéro de pièce saisi n’existe pas ?

Exercice n°2

1. Écrire un bloc PL/SQL anonyme permettant d’afficher les services de la table


SERVICE(nos,intitule,localisation) au format « numéro_service : intitulé (localisation) ». NB :
L’exploitation d’une requête qui retourne plusieurs n-uplets passe forcément par l’utilisation d’un
curseur.
2. Au cas où il n’y ait aucun n-uplet dans la table SERVICE, afficher un message d’erreur
(exception, mais pas erreur fatale). Tester le bon fonctionnement du test en suivant la procédure
suivante :
1. valider les mises à jour précédentes à l’aide de la commande COMMIT.
2. effacer le contenu de la table SERVICE ;
3. exécuter le bloc PL/SQL ;
4. annuler l’effacement de la table SERIVCE à l’aide de la commande ROLLBACK.
Exercice n°3

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;

IF nbp > 60 THEN


RAISE full;
END IF;

DBMS_OUTPUT.PUT_LINE('Nombre de pieces = ' || TO_CHAR(nbp));

SELECT desi INTO designation FROM piece


WHERE nop = '&numero_piece' ;

DBMS_OUTPUT.PUT_LINE('Designation : ' || designation);

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;

FOR un_service IN services


LOOP
DBMS_OUTPUT.PUT_LINE(un_service.nos || ':' || un_service.intitule
|| ' (' || un_service.localisation || ')');
END LOOP;

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;

--Si pas de produits, exception


IF nbp = 0 THEN
RAISE aucun_produit;
END IF;

--Acces sequential à la table PRODUIT


--Remplissage de la table PRODUIT2
FOR un_prod IN produits
LOOP
INSERT INTO produit2
VALUES(un_prod.numprod, UPPER(un_prod.designation),
ROUND(NVL(un_prod.prix,0)/euro) );
END LOOP;

--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 ;

FOR i IN 1..notes.COUNT LOOP


m := m + notes(i);
END LOOP;
m := m / notes.COUNT

DBMS_OUTPUT.PUT_LINE('Moyenne = ' || TO_CHAR(m));

Page 2/5
--notes.EXTEND; NE FONCTIONNE PLUS (taille maxi = 10)
--notes(11) :=20 ;

DBMS_OUTPUT.PUT_LINE('Taille actuelle / Taille limite =' ||


notes.COUNT || '/’ || notes.LIMIT);
notes.TRIM;
DBMS_OUTPUT.PUT_LINE('Taille actuelle / Taille limite =' ||
notes.COUNT || '/’ || notes.LIMIT);
notes.DELETE;
DBMS_OUTPUT.PUT_LINE('Taille actuelle / Taille limite =' ||
notes.COUNT || '/’ || notes.LIMIT);
END;
/

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 );

SELECT AVG(note) INTO m FROM notation;


DBMS_OUTPUT.PUT_LINE('Moyenne = ' || m );

DBMS_OUTPUT.PUT_LINE('Indice premier :' || notes.FIRST);


DBMS_OUTPUT.PUT_LINE('Indice dernier :' || notes.LAST);
DBMS_OUTPUT.PUT_LINE('Indice elements :' || notes.COUNT);

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

SELECT nompil,adr,sal INTO pl


FROM produit
WHERE numpli=&Numéro_de_pilote;

DBMS_OUTPUT.PUT_LINE(UPPER(pl.nom)||' ('||pl.adresse||') : '||pl.salaire);

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();

--Fonction max entre deux nombres


FUNCTION MonMax(a IN REAL, b IN REAL) RETURN REAL IS
BEGIN
IF a > b THEN
RETURN a;
ELSE
RETURN b;
END IF;
END;

--Fonction max dans un tableau


FUNCTION MultiMax(t IN TabReels) RETURN REAL IS
--Déclarations locales
i INTEGER;
m REAL;
vide EXCEPTION;
BEGIN
IF t.COUNT = 0 THEN
RAISE vide;
END IF;

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;

--Procédure tri sans perdre l’odre initial


PROCEDURE Tri_conserve(t_in IN TabReels, t_out OUT TabReels) IS
BEGIN
t_out := t_in
Tri(t_out);
END;

--Procédure affichage d’un tableau


PROCEDURE Affiche(t IN TabReels) IS
--Déclarations locales
i INTEGER;
chaine VARCHAR(255) := '';

BEGIN
FOR I IN 1..t.COUNT
LOOP
Chaine := chaine || ' ' || t(i);
END LOOP;
DBMS_OUTPUT.PUT_LINE(chaine);
END;

--Programme principal
BEGIN

DBMS_OUTPUT.PUT_LINE(MonMax('||a||' ; '||b||') = '||MonMax(a,b));


DBMS_OUTPUT.PUT_LINE('MultiMax = ' || MultiMax(tab);

--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° CIN : Nom et prénom : ___________________________________

N° Inscription : ___________________________________

Groupe : _________________________N°_______________
Code de l’administration :

Code de l’administration : Signatures des enseignants


_________________________________

________________________________

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
_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

2) Renommer la table "Abonne" par "Emprunteur".

_______________________________________________________________________________

_______________________________________________________________________________

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)

Exprimer en SQL les requêtes suivantes :

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 ».

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

3) La date d’examen du module « Système de Gestion de Base de Données».

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

4) La date et l’horaire d’examen du module « Base de données ». Sans doublons.

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

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

1) Créer la structure des tables de la base de données.


CREATE TABLE Livre
(
Code_livre VARCHAR(10) Primary Key,
Titre VARCHAR(50) NOT NULL,
Auteur VARCHAR(50) NOT NULL, (1pt)
Editeur VARCHAR(30),
Date_parution DATE,
CONSTRAINT chkDatep CHECK Date_parution<SYSDATE
);

CREATE TABLE Abonne


(
Num_abonne VARCHAR(10) Primary key, (1pt)
Nom_abonne VARCHAR(30) NOT NULL,
Prenom_abonne VARCHAR(30) NOT NULL,
Adresse VARCHAR(50) DEFAULT 'Jendouba',
Tel NUMBER(8)
);

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
);

2) Renommer la table "Abonne" par "Emprunteur".

Solution 1 : RENAME Abonne To Emprunteur ;


(1pt)
Solution 2 : ALTER TABLE Abonne RENAME TO Emprunteur;

3) Ajouter à la colonne "Adresse" une contrainte de domaine dont les valeurs autorisées sont : "Jendouba",
"Beja","Kef" et "Tunis".

ALTER TABLE Abonne


ADD CONSTRAINT chkAdresse CHECK ADRESSE IN ('Jendouba','Beja','Kef','Tunis') ; (1pt)
4) Supprimer la colonne "Tel".

ALTER TABLE Abonne


DROP COLUMN Tel ;
(1pt)

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

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';

4) La date et l’horaire d’examen du module « Base de données ».


SELECT DateExam, HeureD,HeureF
FROM Examen,Module,Dates,Horaire
WHERE Examen.CodeM = Module.CodeM
AND Examen.NJ = Dates.NJ
(1pt)
AND Examen.NH = Horaire.NH
AND lblModule =' 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

CURSOR Employes IS SELECT * FROM EMP ORDER BY SAL DESC ;


UnEmp Employes%ROWTYPE; (0.75pt)
n INTEGER;

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;

--Augmentation des salaires des employés


OPEN Employes;
LOOP
FETCH UnEmp IN Employes;
IF Employes%ROWCOUNT <=( n*(1/4)) THEN
UPDATE EMP SET SAL=SAL*1.04 WHERE EMPNO= UnEmp.EMPNO;
ELSEIF Employes%ROWCOUNT > ( n*(1/4)) AND Employes%ROWCOUNT <= ( n*(2/4)) THEN
UPDATE EMP SET SAL=SAL*1.06 WHERE EMPNO= UnEmp.EMPNO;
ELSE
UPDATE EMP SET SAL=SAL*1.08 WHERE EMPNO= UnEmp.EMPNO;
(2.5pts)
ENDIF;
EXIT WHEN Employes%NOTFOUND;
END LOOP;
CLOSE Employes;

--Affichage des employés après l’augmentation


DBMS_OUTPUT.PUT_LINE('----Affichage des employés après l’augmentation ---- ') ;
FOR Employes INTO UnEmp LOOP
BMS_OUTPUT.PUT_LINE(UnEmp.ENOM || ' ' || UnEmp.SAL;
END LOOP;
(0.25pt)
END;
/

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° CIN : Nom et prénom : ___________________________________

N° Inscription : ___________________________________

Groupe : _________________________N°_______________
Code de l’administration :

Code de l’administration : Signatures des enseignants


_________________________________

________________________________

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

1) Créer la structure des tables de la base de données.


_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

Page 2 / 8
NE RIEN ÉCRIRE ICI

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

2) Renommer la table "Article" par "Produit".

_______________________________________________________________________________

_______________________________________________________________________________

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

4) Supprimer la table Client.

_______________________________________________________________________________

_______________________________________________________________________________

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)

Exprimer en SQL les requêtes suivantes :

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 ».

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

3) Les enseignants qui enseignent les groupes « 2LFIAG01 », « 2LFIAG02 », « 2LFIAG03 » et


« 2LFIAG04 ». Sans doublons

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

_______________________________________________________________________________

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

Vous aimerez peut-être aussi