1. Langage PL/SQL
Langage PL/SQL
Atelier 2
Exercice 1
On souhaite conserver des statistiques concernant les mises à jour (insertion,
modifications, suppression) sur la table Emp. Ces statistiques seront enregistrées
dans une table appelée 'Stats' ayant la structure suivante :
TypeMAJ NbMAJ DateMAJ
Insert 0 NULL
Update 0 NULL
Delete 0 NULL
Etapes à suivre
• Créer une table Emp ayant la même structure que celle de Scott
• Créer la table Stats initialisée à 0 pour NbMAJ et à NULL pour DateMAJ
• Ecrire le ou les déclencheurs permettant de mettre à jour la table Stats après
chaque opération de mise à jour sur la table EMP
Exercice 2
Soit le schéma de la base de données suivante :
• Articles (Ref, Des, PU, QteS,Coul)
• Commandes (NBC, DateC, Code)
• Détails (NBC, Ref, QteC, QteL)
Créer une table jour_commandes (ayant la même structure que la table
Commandes) capable de récupérer les tuples effacés dans la table commandes.
Ecrire le trigger qui automatise cette journalisation. Ce trigger permettra entre autre
de :
- De ne journaliser que les commandes qui n’ont pas une quantité livrée égale à 0
- De ne journaliser que les commandes qui concerne un article de couleur noir.
Exercice 3
Le but de ce problème est de faire des statistiques concernant les transactions
effectuées par les clients d’une banque donnée. Pour cela on considère les tables
suivantes :i
• Comptes(NCompte, Solde, Code)
• Depots(NDepot, MontantD, NCompte)
• Retraits(NRetrait, MontantR, NCompte)
• Stats(NCompte, NombreD, NombreR)
Travail à faire
1. Créer les quatre tables. Ne tenir compte que de la contrainte de clé primaire.
2. Alimenter la table Comptes de quelques comptes (environ 4).
3. Ecrire un programme PL/SQ pour alimenter la table Stats. La table Stats doit
être initialisée par les NCompte de la table Comptes et par des zéros dans
NombreD et NombreR.
abdellah_madani@yahoo.fr 1
2. Langage PL/SQL
4. Ecrire les scripts permettant de mettre à jour les tables Comptes et Stats
après chaque mise à jour des tables Retraits et Dépôts.
Indications
A chaque dépôt ou retrait, il faut mettre à jour le solde de la table Comptes. Le
dépôt et le retrait affecte aussi le NombreD et NombreR de la table Stats
Exercice 4
Le but est de faire la gestion des emprunts d'une bibliothèque. Pour cela, on
considère les trois tables :
• Adhérents (NumA1, Nom, Tel)
• Ouvrages (Ref, Titre, NbreExp2)
• Emprunt (NumE3, NumA, Ref, DateE4)
Les deux premières tables étant déjà alimentées
Règles de gestion
• NumE doit être attribué automatiquement de la forme 100, 200, 300, …
• Un adhérent ne peut emprunter un ouvrage que s'il est disponible, mais ne
peut en emprunter plus que 5 ouvrages.
• Après chaque emprunt, on doit mettre à jour le nombre d'exemplaires
disponibles
Travail à faire
1- écrire le ou les déclencheur(s) pour gérer les emprunts des ouvrages
2- écrire un bloc permettant d'afficher le récapitulatif des emprunts effectués par
tous les adhérents pendant le mois de février 2006, sous la forme de :
N°Adhérent Nom Ref Titre Date emprunt
Nombre
ouvrages
Traiter le cas où aucun emprunt ne s'est effectué pendant ce mois à l'aide d'une
exception
Exercice 5
L'idée est de mettre à jour la quantité en stock après chaque opération
d'entrée/sortie. Pour cela, on considère les tables suivantes :
PRODUITS
Ref Des PU Qtes SeuilMax SeuilMin
1
2
3
4
1
N°Adhérent
2
Nombre d'exemplaires
3
N°d'emprunt
4
Date d'emprunt
abdellah_madani@yahoo.fr 2
3. Langage PL/SQL
Detail_Clients
NBC Ref QteC
Detail_Fournisseurs
NBC Ref QteC
Indications
• La tables 'Produits' doit être alimentée par des articles.
• A chaque opération d'entrée/sortie, modifier la quantité en stock. Il faut
respecter les seuils maximal et minimal de chaque produit.
Exercice 6
Une banque désire connaître le nombre de transactions effectuées par chacun de
ses clients à chaque opération de dépôt ou de retrait. A partir de la table
transactions(DateT, NCompte, Montant, TypeT) (où TypeT : D pour dépôt, R pour
chaque retrait), on veut mettre à jour la table clients(NCompte, Nom, Solde) et la
table statut(NCompte, NbreD, NbreR).
1. Ecrire un programme PL/SQL pour remplir la table statut à partir de la table
client
2. Ecrire un trigger pour mettre à jour les deux tables clients et statut à chaque
insertion dans la table transactions
Indications
• La table clients est déjà alimentée de quelques enregistrements
• La table statut contient les n°comptes des clients et les nombres initialisés à 0
• La table transactions est vide
Exercice 2
create table articles(
ref integer primary key,
des varchar(30),
pu float,
qtes integer,
coul varchar(20)
);
abdellah_madani@yahoo.fr 3
4. Langage PL/SQL
create table commandes(
nbc integer primary key,
datec date,
code integer
);
create table details(
nbc integer,
ref integer foreign key references articles(ref),
qtec integer,
qtel integer,
constraint pk_details primary key(nbc, ref),
constraint fk_details1 foreign key(nbc) references
commandes(nbc)
);
insert into articles values(1, 'p1',3,10,'Rouge');
insert into articles values(2, 'p2',3,10,'Noir');
insert into articles values(3, 'p3',3,10,'Noir');
insert into commandes values(10,sysdate,1);
insert into commandes values(20,sysdate,1);
insert into commandes values(30,sysdate,2);
insert into commandes values(40,sysdate,1);
insert into commandes values(50,sysdate,3);
insert into details values(10,1,30,10);
insert into details values(10,2,30,10);
insert into details values(10,3,30,10);
insert into details values(20,2,30,10);
insert into details values(20,3,30,10);
insert into details values(30,2,30,0);
insert into details values(40,1,30,10);
insert into details values(50,2,30,10);
--Création de deux tables vides qui ont la même structure
que la table
-- commandes
create table jour_commandes1 as select *from commandes
abdellah_madani@yahoo.fr 4
5. Langage PL/SQL
where nbc=-1;
create table jour_commandes2 as select *from
commandes;
delete from jour_commandes2;
-- Ecrire un déclencheur pour enregistrer les commandes
supprimés
-- (de la table commandes) dans la table jour_commandes1
create or replace trigger tr1 after delete on commandes
for each row
begin
insert into jour_commandes1 values
(:old.nbc,:old.datec,:old.code);
end;
--Journaliser dans la table jou_commandes les commandes
qui
--ont toutes les QTEL<>0 et que tous les produits ont une
couleur
--NOIR
create or replace trigger tr1 after delete on commandes
for each row
declare
vmin integer;
nbre intreger;
begin
select min(qteL) into vmin from details where
nbc=:old.nbc;
select count(*) into nbre from details, articles
where details.ref=articles.ref and coul<>'Noir' and
nbc=:old.nbc;
if (vmin>0 and nbre=0) then
insert into jour_commandes1 values
(:old.nbc,:old.datec,:old.code);
abdellah_madani@yahoo.fr 5
6. Langage PL/SQL
end if;
end;
Exercice 3
On suppose que les tables sont déjà créées (Question 1)
On suppose que la table Comptes est déjà alimentée
(Question2)
3/
-- Dans un cursor for, la variable de la boucle for est
toujours
-- considérée comme un enregistrement même si le curseur
-- retourne un seul champs
Declare
Cursor c is select ncompte from compte ;
Begin
For x in c loop
Insert into stats values (x.ncompte, 0, 0);
End loop;
End;
Declare
Cursor c is select ncompte from compte ;
vc compte.ncompte%type;
Begin
Open c;
loop
fetch c into vc
exit when c%notfound
Insert into stats values (vc, 0, 0);
End loop;
Close c;
abdellah_madani@yahoo.fr 6
7. Langage PL/SQL
End;
4/
Create or replace trigger tr1 after insert on retraits
For each row
Declare
Vsolde compte.solde%type;
Begin
Select solde into vsolde from compte
where ncompte=:new.ncompte;
If vsolde>=:new.montantr then
Update comptes set solde=solde-:new.montantr
Where ncompte=:new.ncompte;
Update stats set nombrer=nombrer+1
Where ncompte= :new.ncompte ;
End if ;
End ;
abdellah_madani@yahoo.fr 7