Вы находитесь на странице: 1из 8

Compte rendu de TP

II.2404 – Advanced DataBases


Chêne Pierre-Antoine / de Rouzé Geoffroy

2011-2012
Chêne Pierre-Antoine II.2403 Advanced DataBases TP 1 à 4
De Rouzé Geoffroy

A – INTRODUCTION

Le but de ces différents TP était la mise en place d’une base de données pour l’organisation
d’une bibliothèque. La création de cette base a pu s’effectuer en plusieurs étapes.
Tout d’abord nous avons simplement créé les différentes tables qui structurent cette base de
données. Nous avons ensuite dû la modifier et l’amélioré, notamment grâce à l’implémentation de
contraintes d’intégrités (TP 1) et la gestion du contenu des bases produites (TP 2). Lors du TP 3 et 4,
nous avons amélioré nos compétences PL/SQL par la mise en place d’une procédure de gestion de la
qualité des ouvrages.

Ayant eu la même préférence pour l’APP informatique lors de notre première année, nous
avions déjà eu la chance de travailler sur des bases de données à travers la création du site internet
demandée.
Cependant, les quelques requêtes SQL que nous avions pu coder l’année dernière ne nous
ont été que d’un très faible recours comparé aux problématiques abordées cette année.

Page 2
Chêne Pierre-Antoine II.2403 Advanced DataBases TP 1 à 4
De Rouzé Geoffroy

B – TRAVAIL EFFECTUE

I – SQL-LDD

1. Les différentes tables créées sont identifiées dans le tableau ci-dessous avec
leurs contraintes d’intégrités.

NOM_TABLE PRIMARY_KEY FOREIGN_KEY CHECK


Genres Code char (5)
Ouvrages Isbn number (10) Genres(code)
Exemplaires Isbn number (10), Ouvrages(isbn) etat in('NE', 'BO',
numero number (3) 'MO', 'MA')
Membres Numero number (6) duree>=0
Emprunts Numero number (10) Membres(numero)
Détails Emprunt number (10), Emprunts(numero),
numero number (3) Exemplaires(isbn)

D’autres données sont présentes dans ces tables, mais ne sont pas des
contraintes.

NOM_TABLE CHAMPS TYPE


Genres Libellé varchar2(80)notnull
Ouvrages Titre varchar2(200)notnull
Auteur varchar2(80)
Éditeur varchar2(80)
Membres Nom varchar2(80)notnull
Prénom varchar2(80)notnull
Adresse varchar2(200)notnull
Adhésion datenotnull
Téléphone char(10)notnull

Le code pour la création de ces tables est donné en annexe (page x).

Page 3
Chêne Pierre-Antoine II.2403 Advanced DataBases TP 1 à 4
De Rouzé Geoffroy

2. Nous avons ensuite défini une séquence afin de faciliter la mise en place d’un
numéro pour chaque membre. Cette séquence permettra une
incrémentation automatique du numéro affecté à chaque nouveau membre.
Ci-dessous le code SQL utilisé pour créer la séquence :

create sequence ma_sequence


start with 1
increment by 1
no cycle;

3. Il nous a également fallu créer une contrainte d’intégrité dont le but était
d’interdire la possibilité d’avoir deux membres possédant le même nom,
prénom et téléphone.
Vous trouverez ci-dessous le code SQL utilisé pour créer la contrainte :

alter table membres add constraint noduplicate


unique(nom, prenom, telephone);

4. Puis, il nous a été demandé d’ajouter un champ permettant aux membres


d’avoir un deuxième numéro de téléphone. Ce numéro devant être un
numéro de portable, nous avons mis en place une contrainte d’intégrité qui
vérifie que ce numéro commence par 06.
Le code SQL utilisé pour la modification de la structure de la table membre
vous est présenté ci-dessous :

alter table membres add telephone_mobile char(10)notnull;

alter table membres add constraint mobile_start check(


mobile Like '0[6-7]%' );

PS : Nous avons adapté le sujet à la réalité. Nous avons donc modifié la


contrainte imposée sur le numéro de téléphone, vérifiant ainsi qu’il
commence par 06 ou par 07.

5. Le but de ce point était de supprimer de façon automatique les champs liés à


la ligne que l’on souhaite supprimer. Nous avons donc du travailler sur
l’automatisation de certaines actions.
Le code SQL donné ci-dessous, permet donc de ‘nettoyer ‘ ce qui dans la
table Détails fait référence à la ligne supprimée dans la table Référence :

alter table details drop constraint fk_details_emprunts;


alter table details add constraint deleteoncascade
Foreign key(emprunt)
References Emprunts(numero)
ON delete cascade;

Page 4
Chêne Pierre-Antoine II.2403 Advanced DataBases TP 1 à 4
De Rouzé Geoffroy
6. Pour finir cette partie SQL-LDD, nous avons dû simplifier le remplissage des
tables, notamment la table Exemplaire, en mettant une valeur par défaut sur
le champ Etat.
Ci-dessous le code SQL qui modifie la valeur du champ Etat pour un nouvel
exemplaire ajouté :

Alter table exemplaires modify etat default'NE';

II – SQL-LMD

1. Le code téléchargé (insertionTables.sql) nous a permis de remplir les


différentes tables créées auparavant, par des valeurs données.

2. Dans le code téléchargé, nous avons dû modifier le nom de la séquence. Ainsi


la séquence ‘sec_membre’ est devenue ma_sequence.

3.

4. Dans cette question, il nous était demandé de modifier la valeur du champ


Etat en fonction du nombre d’emprunt pour un ouvrage. Il y avait 4 états
possibles pour un ouvrage : Neuf, Bon, Moyen ou Mauvais. Ces différents
états étaient caractérisés par le nombre d’emprunt de l’ouvrage : entre 0 et
11 emprunts, l’ouvrage devait être dans l’état ‘Neuf’ ; entre 11 et 25 fois,
l’ouvrage est dans l’état ‘Bon’ ; entre 25 et 60 fois, l’état est ‘Moyen’ ; et au-
delà de 60 fois, l’état est ‘Mauvais’. L’énoncé nous demandait de supprimer
les ouvrages empruntés plus de 60 fois, nous avons uniquement changé leur
état à cette question, pour faire la suppression au point n°5.
Vous trouverez ci-dessous le code qui nous a permis de réaliser ces
modifications :

MERGE INTO exemplaires n using(SELECT isbn, count(*)as nombre from details group by
isbn) o
ON(o.isbn = n.isbn)
WHEN MATCHED THEN
UPDATE SET n.etat ='neuf'
where o.nombre<11;

MERGE INTO exemplaires n using(SELECT isbn, count(*)as nombre from details group by
isbn) o
ON(o.isbn = n.isbn)
WHEN MATCHED THEN
UPDATE SET n.etat ='bon'
where(o.nombre>11AND o.nombre<25);

Page 5
Chêne Pierre-Antoine II.2403 Advanced DataBases TP 1 à 4
De Rouzé Geoffroy

MERGE INTO exemplaires n using(SELECT isbn, count(*)as nombre from details group by
isbn) o
ON(o.isbn = n.isbn)
WHEN MATCHED THEN
UPDATE SET n.etat ='moyen'
where(o.nombre>25AND o.nombre<60);

MERGE INTO exemplaires n using(SELECT isbn, count(*)as nombre from details group by
isbn) o
ON(o.isbn = n.isbn)
WHEN MATCHED THEN
UPDATE SET n.etat ='mauvais'
where nombre>60;

Avec l’aide de notre tuteur, et grâce à la documentation d’Oracle, nous avons


pu utiliser la fonction ‘Merge’ qui nous a servi dans ce programme à modifier
de façon automatique une information par rapport à une autre (ici l’état par
rapport au nombre d’emprunt).

5. Pour assurer une qualité maximum aux utilisateurs de la bibliothèque, tous


les livres ayant été empruntés plus de 60 fois, et donc dans un état ‘Mauvais’,
doivent être supprimés.
Pour réalisé cette fonction, nous avons simplement utilisé la fonction
delete qui supprimera tous les livres ayant un état égal à ‘Mauvais’:

Delete from exemplaires where etat ='mauvais';

6. Le but de cette question est de connaitre les noms des membres ayant
emprunté un livre depuis plus de deux semaines. Pour ce faire, nous devons
établir une connexion entre les livres empruntés depuis plus de deux
semaines et la personne l’ayant emprunté. C’est pour cela que nous utilisons
le code suivant :

select m.prenom, o.titre from membres m


join emprunts e on e.membre = m.numero
join details d on d.emprunt = e.numero
join ouvrages o on o.isbn = d.isbn
where e.creele <sysdate-14;

On peut voir que le numéro du member doit être égal au membre inscrit
dans la table emprunt, que le numéro de l’emprunt doit être égal à l’emprunt
inscrit dans la table du detail, que l’isbn du detail doit être celui de l’ouvrage.

Page 6
Chêne Pierre-Antoine II.2403 Advanced DataBases TP 1 à 4
De Rouzé Geoffroy

7. Dans la table genre, il y a un champ code, ce code doit être équivalent au


champ genre de la table ouvrage. A partir de la, nous pouvons compter grace
à la function ‘count(*1)’ le nombre d’ouvrage qui possèdent le même numéro
de genre.

select g.libelle,count(*)as nombrepargenres from ouvrages o


join genres g on g.code = o.genre
group by libelle;

8. On additionne la durée de chaques emprunts, par genre, en utilisant le code


‘genre’ de la table ouvrages.
Puis on utilise un dérivé de la fonction précédente pour obtenir le nombre
d’emprunt par genre.
En divisant l’un par l’autre, on obtient la durée moyenne de l’emprunt en
fonction du genre du livre.

select SUM(d.rendule - e.creele)/Count(*), o.genre


from emprunts e
join details d on d.emprunt = e.numero
join ouvrages o on o.isbn = d.isbn
group by genre;

II – Requêtes SQL

1. Le code permettant de créer la liste des membres triés par ordre


alphabétique est une requête SQL largement utilisée l’année dernière :

SELECT * from membres order by prenom asc;

1
All (tous)

Page 7
Chêne Pierre-Antoine II.2403 Advanced DataBases TP 1 à 4
De Rouzé Geoffroy

D – Annexe

I – SQL-LDD

1.

create table genre (


code char(5) constraint pk_genre primary key,
libelle varchar2(80) not null
);

create table ouvrages (


isbn number(10)constraint pk_ouvrages primary key,
titre varchar2(200) not null,
auteur varchar2(80),
genre char(5) not null constraint fk_ouvrages_genres references genres.code,
editeur varchar2(80)
);

create table exemplaires (


isbn number(10),
numero number(3),
etat char(5),
constraint pk_exemplaires primary key(isbn, numero),
constraint fk_exemplaires_ouvrages foreign key(isbn) references
ouvrages(isbn),
constraint ck_exemplaires_etat check(etat in('NE','BO','MO','MA'))
);

create table membres (


numero number(6)constraint pk_membres primary key,
nom varchar2(80) not null,
prenom varchar2(80) not null,
adresse varchar2(200) not null,
telephone char(10) not null,
adhesion date not null,
duree number(2) not null,
constraint ck_membres_duree check(duree>=0)
);

create table emprunts(


numero number(10)constraint pk_emprunts primary key,
membre number(6)constraint fk_emprunts_membres references membres(numero),
creele date default sysdate
);

create table details(


emprunt number(10)constraint fk_details_emprunts references emprunts(numero),
numero number(3),
isbn number(10),
exemplaire number(3),
rendule date,
constraint pk_details primary key(emprunt, numero),
constraint fk_details_exemplaires foreign key(isbn, exemplaire) references
exemplaires(isbn, numero)
);

Page 8

Вам также может понравиться