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

Atelier2

  • 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 tablecommandes( 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; createtable 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; Exercice3 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 orreplace 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