Vous êtes sur la page 1sur 50

NF17

CONCEPTION DE BASES
DE DONNÉES IV

Version 10.01

Travaux Pratiques

STÉPHANE CROZAT

Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique : Publié le 11 janvier 2010
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
TABLE DES MATIÈRES

I - Découverte d'une base de données avec PostgreSQL 5


A. Connexion à une base de données PostgreSQL.......................................................................................5
B. Notion de table.........................................................................................................................................5
C. Notion de contraintes...............................................................................................................................6
D. Notion de références................................................................................................................................7
E. Projection, restriction et jointure..............................................................................................................8
F. Fonctions et agrégats................................................................................................................................8
II - Application Web avec PostgreSQL et PHP 11
A. Modélisation du problème.....................................................................................................................11
B. Implémentation PosgreSQL...................................................................................................................12
C. Architecture de l'application..................................................................................................................12
D. Implémentation de l'application.............................................................................................................12
III - Initiation à Access (base de données et application) 15
A. Modélisation du problème.....................................................................................................................15
B. Implémentation de la base de données...................................................................................................17
C. Implémentation de l'application.............................................................................................................19
D. Alimentation de la BD...........................................................................................................................21
E. Interrogation de la BD............................................................................................................................22
F. Automatisation de l'application..............................................................................................................22
IV - Initiation à Access VBA 25
A. Déclaration de la base de données en SQL............................................................................................25
B. Test des instructions SQL......................................................................................................................27
C. Programme VBA d'exécution SQL........................................................................................................27
D. Alimentation..........................................................................................................................................29
E. Manipulation..........................................................................................................................................30
V - Approfondissement de la création d'application sous Access 31
A. Alimentation de la BD (amélioration)...................................................................................................31
B. Interrogation de la BD (amélioration)....................................................................................................32
C. Automatisation de l'application (amélioration)......................................................................................32
VI - SQL et SQL*Plus sous Oracle 33
A. Migration d'une base Access vers Oracle..............................................................................................33
B. Séquence................................................................................................................................................37
C. Extension Médiathèque..........................................................................................................................37
D. Transactions...........................................................................................................................................38
E. Questions avancées en SQL...................................................................................................................38
F. Maintenance de la base...........................................................................................................................39
G. Vue.........................................................................................................................................................39
H. SQL*Plus...............................................................................................................................................40
VII - PL/SQL sous Oracle 41

S. Crozat - UTC 2009


3
A. Fonctions stockées.................................................................................................................................41
B. Curseurs.................................................................................................................................................42
C. Triggers..................................................................................................................................................43
VIII - Relationnel-objet sous Oracle 45
A. Concevoir et implémenter une base RO................................................................................................46
B. Alimenter une base RO..........................................................................................................................46
C. Interroger une base RO : Utilisation des OID........................................................................................48
D. Interroger une base RO : Utilisation des méthodes...............................................................................48
E. Interroger une base RO : Utilisation des tables imbriquées...................................................................49
IX - Exemples d'exécution de transactions sous Oracle 51
A. Validation et annulation de transaction.................................................................................................51
B. Validation conditionnelle de transaction...............................................................................................51
C. Simulation de panne...............................................................................................................................52
D. Mises à jour concurrentes......................................................................................................................53

S. Crozat - UTC 2009


4
DÉCOUVERTE D'UNE BASE DE
I
I -

DONNÉES AVEC POSTGRESQL

Connexion à une base de données PostgreSQL 7


Notion de table 8
Notion de contraintes 9
Notion de références 10
Projection, restriction et jointure 10
Fonctions et agrégats 11

Objectifs
 Découvrir le modèle relationnel
 Découvrir un SGBDR
 Découvrir PostgreSQL

Ce TP est destiné à vous faire expérimenter un SGBDR, afin de vous familiariser avec les concepts
classiques des bases de données relationnelles.
Il a pour objectif de donner un aperçu général de la conception des bases de données, en donnant à
expérimenter la plupart des principes. Il constitue un résumé de ce qui sera vu en première partie de
NF17.
Ce TP sera réalisé sur le SGBDR PostgreSQL. Il permettra ainsi également d'introduire ce système.

A. Connexion à une base de données PostgreSQL


Connexion depuis un PC de l'UTC (mode terminal)
1. Ouvrez un terminal
2. Connectez-vous sur votre compte Unix
3. Exécutez la commande : psql username (avec username votre compte NF17)
Connexion depuis un PC de l'UTC (avec pgAdmin III)
1. Ouvrez le programme pgAdmin III
2. Sélectionner Fichier > Ajouter un serveur
3. Utilisez votre compte et mot de passe NF17

B. Notion de table
Créer sa première table
Une base de données relationnelle est principalement constituée de tables (ou « relations » d'où le nom

S. Crozat - UTC 2009


5
Découverte d'une base de données avec PostgreSQL

de relationnel). Une table est basiquement un élément d'organisation de l'information constitué de


colonnes (ou attributs) et de lignes (ou enregistrements).
Nous allons dans un premier temps créer le schéma d'une table, c'est à dire définir ses colonnes. Pour cela
nous utiliserons l'instruction SQL LDD « CREATE ».

Question 1
Exécuter l'instruction suivante et décrire ce qu'elle fait.
CREATE TABLE tEtu (
pk_numSecu CHAR(13) PRIMARY KEY,
k_numEtu VARCHAR(20) UNIQUE NOT NULL,
nom VARCHAR(50),
prenom VARCHAR(50));
Alimenter la table
Une fois les colonnes de la table définies, nous pouvons en déclarer les lignes. Nous utilisons pour cela
l'instruction SQL LMD « INSERT ».

Question 2
Exécuter les deux instructions suivantes et décrire ce qu'elles font.
INSERT INTO tEtu (pk_numSecu, k_numEtu, nom, prenom)
VALUES ('1800675001066', 'AB3937098X', 'Dupont', 'Pierre');
INSERT INTO tEtu (pk_numSecu, k_numEtu, nom, prenom)
VALUES ('2820475001124', 'XGB67668', 'Durand', 'Anne');
Interroger la table
Une fois une table créée, il est possible à tout moment d'en inspecter le contenu. Nous utilisons pour cela
l'instruction SQL LMD « SELECT ».

Question 3
Exécuter l'instruction suivante et décrire ce qu'elle fait.
SELECT pk_numSecu, k_numEtu, nom, prenom
FROM tEtu;

Question 4
Exécuter l'instruction suivante et décrire ce qu'elle fait.
SELECT nom, prenom
FROM tEtu
WHERE pk_numSecu='2820475001124';

C. Notion de contraintes
Contrainte de domaine
Lorsque l'on définit une table, on définit également des contraintes sur cette table, qui serviront à
contrôler son intégrité, par rapport à des règles que l'on aura fixées.
C'est notamment le cas des contraintes de domaine, qui permettent de vérifier qu'une colonne prend ses
valeurs parmi un ensemble déterminé (les chaînes de 10 caractères au plus, les entier de 1 à 1000, etc.).

Question 1
Exécuter l'instruction suivante et expliquer pourquoi le système renvoie une erreur.
INSERT INTO tEtu (pk_numSecu, k_numEtu, nom, prenom)
VALUES ('XXXXXXXXXXXXXXX', 'XXXXXX', 'Dupont', 'Pierre');

S. Crozat - UTC 2009


6
Découverte d'une base de données avec PostgreSQL

Question 2
Donner un exemple de contrainte qui n'est pas formulée dans la définition de la table tEtu et que l'on
aurait pu souhaiter.
Contraintes de clé
Les contraintes de clé se composent de contraintes d'unicité et de contraintes de non nullité. Elles
permettent d'assurer que toutes les valeurs d'une colonne seront différentes pour chaque ligne.

Question 3
Exécuter les trois instructions suivantes (les unes après les autres) et expliquer ce qui se passe.
INSERT INTO tEtu (pk_numSecu, k_numEtu, nom, prenom)
VALUES ('1800675001066', 'HGYT67655Y', 'Dupont', 'Pierre');
INSERT INTO tEtu (pk_numSecu, k_numEtu, nom, prenom)
VALUES ('1800675001066', 'XGB67668', 'Durand', 'Anne');
INSERT INTO tEtu (pk_numSecu, k_numEtu, nom, prenom)
VALUES ('2810592012232', 'HGYT67655Y', 'Duchemin',
'Aline');

Question 4
Explorer le contenu de votre table en exécutant l'instruction suivante, et vérifier vos explications
précédentes.
SELECT *
FROM tEtu;

Question 5
Pourrait-on insérer dans la table une seconde personne qui aurait le prénom "Aline" et le nom
"Duchemin" ? Pourquoi ?

D. Notion de références
Clé étrangère
Une base de données est en général constituée de plusieurs tables. Ces tables se référencent entre elles en
utilisant une clé étrangère : c'est à dire qu'une des colonnes de la table est utilisée pour faire référence à
la colonne d'une autre table.
On va à présent créer une seconde table, qui permettra d'associer des Unités de Valeurs (UVs) aux
étudiants, puis insérer des valeurs dans cette table.
CREATE TABLE tUv (
pk_code CHAR(4) NOT NULL,
fk_etu CHAR(13) NOT NULL,
PRIMARY KEY (pk_code, fk_etu),
FOREIGN KEY (fk_etu) REFERENCES tEtu(pk_numSecu));

INSERT INTO tUV (pk_code, fk_etu)


VALUES ('NF17', '1800675001066');
INSERT INTO tUV (pk_code, fk_etu)
VALUES ('NF26', '1800675001066');
INSERT INTO tUV (pk_code, fk_etu)
VALUES ('NF29', '1800675001066');

Question 1
Expliciter ce qu'exprime le contenu de la table tUv .
Contraintes d'intégrité référentielle
Lorsque nous avons défini la table tUv, nous avons défini une contrainte supplémentaire, dite d'intégrité

S. Crozat - UTC 2009


7
Découverte d'une base de données avec PostgreSQL

référentielle : contrainte de type FOREIGN KEY.

Question 2
En exécutant le code suivant, expliquer quel est le rôle d'une contrainte d'intégrité référentielle.
INSERT INTO tUV (pk_code, fk_etu)
VALUES ('NF17', '2810592012232');
INSERT INTO tUV (pk_code, fk_etu)
VALUES ('NF17', '1700792001278');

E. Projection, restriction et jointure


L'instruction SELECT du langage SQL LMD nous donne de larges possibilités pour interroger les tables
d'une base de données.

Question 1
Exécuter l'instruction suivante et expliquer pourquoi c'est une projection.
SELECT nom, prenom
FROM tEtu;

Question 2
Exécuter l'instruction suivante et expliquer pourquoi c'est une restriction.
SELECT *
FROM tEtu
WHERE nom='Dupont';

Question 3
Exécuter l'instruction suivante et expliquer pourquoi c'est une jointure.
SELECT nom, pk_code
FROM tEtu JOIN tUv ON pk_numSecu=fk_etu;

Question 4
Exécuter l'instruction suivante et expliquer pourquoi c'est un produit (cartésien).
SELECT nom, pk_code
FROM tEtu,tUv;

F. Fonctions et agrégats
Préalable : insertion de données dans la base de données
Afin de mieux appréhender les fonctions et agrégats, nous allons réinitialiser la base avec des données
contenues dans un fichier.
Exécuter les instructions suivantes afin de supprimer les données existantes dans les table (instruction
DELETE du SQL LMD).
DELETE FROM tUv;
DELETE FROM tEtu;
Récupérer les deux fichiers de données et les mettre sur son compte Unix. Regarder le contenu des
fichiers.
Les fichiers de données sont disponibles en ligne dans l'archive nf17tp01_data.zip.

S. Crozat - UTC 2009


8
Découverte d'une base de données avec PostgreSQL

Insérer les données en exécutant les instructions suivantes.


\copy tEtu (pk_numSecu, k_numEtu, nom, prenom) FROM
'etus.csv' WITH DELIMITER AS ';'
\copy tUv (fk_etu, pk_code) FROM 'uvs.csv' WITH DELIMITER
AS ';'

Question
Exécuter la requête SQL suivante et expliquer le résultat obtenu.
SELECT COUNT(pk_code)
FROM tUv
WHERE fk_etu='1';
Exécuter la requête SQL suivante et expliquer le résultat obtenu.
SELECT pk_code, COUNT(fk_etu)
FROM tUv
GROUP BY pk_code
ORDER BY COUNT(fk_etu);

S. Crozat - UTC 2009


9
APPLICATION WEB AVEC
II
II -

POSTGRESQL ET PHP
Modélisation du problème 13
Implémentation PosgreSQL 14
Architecture de l'application 14
Implémentation de l'application 15

Objectifs
 Réaliser une application PHP pour exploiter une base de données
 Utiliser PosgreSQL

Dans la première partie vous vous attacherez à la partie base de données, en utilisant PosgreSQL. Dans la
seconde partie vous vous attacherez à la partie application en PHP et interface graphique en HTML

A. Modélisation du problème
Dans le cadre d'un cours sur les bases de données (UV NF17 à l'UTC) l'enseignant responsable souhaite
oragniser une série de soutenances pour un grand nombre d'étudiants, en dehors des heures de cours
normalement prévues pour le cours.
Il décide pour cela d'organiser les inscriptions via un site Web qui permettra aux étudiants de s'inscrire en
ligne, dans la limite des places disponibles pour chaque créneau horaire. Il vous demande de réaliser ce
site, ayant choisi les technologies PosgreSQL et PHP (car disponibles à l'UTC).
On pose que chaque session est composée d'une date de début (date complète avec l'heure incluse) et
d'une date de fin. Chaque session a forcément une date de début et une date de fin unique et non nulle.
Chaque groupe d'étudiants candidat à la soutenance est représenté par un login et par un mot de passe
associé. Plusieurs groupes (6 maximum) peuvent s'inscrire à une même session.

Question 1
Réaliser le modèle conceptuel du problème.
Indice :
La classe session dispose des attributs date de début et date de fin qui sont tous deux des clés
candidates. La classe groupe dispose des attributs login et mot de passe, login étant une clé. Une
association 0-1:0-N représente l'inscription des groupes aux sessions (0 car les inscriptions sont
progressives, donc au début les groupes ne sont pas inscrits et les sessions sont vides).
Les contraintes dynamiques sont la date de début inférieur à la date de fin et la vérification du
nombre maximum d'étudiants inscrits.

S. Crozat - UTC 2009


11
Application Web avec PostgreSQL et PHP

Question 2
Réaliser le modèle logique en relationnel.
Indice :
On pourra choisir une clé artificielle pour la relation session, afin d'éviter le format date assez peu
pratique comme clé primaire.

B. Implémentation PosgreSQL

Question 1
Réaliser l'implémentation SQL de la base de données PosgreSQL (Types de données sous PosgreSQL).
Les relations seront nommées "tSession" et "tGroupe". La relation tGroupe aura une clé primaire
"pkLogin" et un attribut "aPassword".
Liste des logins
Initialiser la relation tGroupe avec les données ci-après.

Question 2
Initialiser la relation tSession, sachant que les soutenances ont lieu les 21 et 22 juin 2004, de 9h00 à
18h30, par créneaux de 2h00, avec 30 minutes de pause entre chaque session.
Indice :
Utiliser la syntaxe normalisée ISO-8601 : 'YYYY-MM-DD HH-MM-SS' pour saisir des dates et heures
dans PosgreSQL (entre simple quote)

C. Architecture de l'application
Réfléchissez à la façon dont vous allez implémenter votre application en PHP.

Question
Faite un schéma des pages PHP formalisant les appels et paramètres passés.
Indice :
Posez vous les bonnes questions :
 De combien de pages avez vous besoins ?
 Quel sera le rôle de chaque page ?
 Avez vous besoin de fonctions génériques ?
 Quelle page appelle quelle page, avec quels paramètres ?
 etc.

D. Implémentation de l'application
Vous allez à présent écrire le code PHP permettant de faire fonctionner votre application (Fonctions PHP
pour se connecter à PosgreSQL).
Vous pouvez suivre le fil des questions suivantes, ou bien réaliser directement votre application à votre
convenance.

Question 1

S. Crozat - UTC 2009


12
Application Web avec PostgreSQL et PHP

Écrivez une fonction ou une classe dans un fichier PHP autonome permettant de se connecter à la base de
données.
Indice :

Question 2
Déclarer une constante dans un fichier autonome pour le nombre d'inscrits autorisés par session.
Indice :

Question 3
Écrivez 3 fonctions :
1. Permettant de tester si le login et mot de passe est correct
2. Permettant de tester si le numéro de session est valide et s'il reste des places disponibles
3. Permettant de s'inscrire si les conditions sont réunies
Indice :

Question 4
Écrivez une page d'accueil permettant de se connecter à la base de données pour afficher la liste des
sessions disponibles.
Cette page proposera un menu permettant de s'inscrire et de voir la liste des inscrits.
Indice :

Question 5
Écrivez la page contenant le formulaire permettant de s'inscrire.
Indice :

Question 6
Écrivez la page PHP permettant d'insérer une nouvelle inscription et/ou d'afficher la liste des inscriptions.
Indice :

Question 7
Testez votre application et vérifier que les cas limites sont traités. Vérifiez les insertions dans la base de
données.

* *
*

Proposez un bilan rapide de votre modélisation et des points importants pour l'implémentation de
l'application.
Proposez un bilan rapide des aspects faciles et difficiles de PHP.

S. Crozat - UTC 2009


13
INITIATION À ACCESS (BASE DE
III
III -

DONNÉES ET APPLICATION)

Modélisation du problème 17
Implémentation de la base de données 19
Implémentation de l'application 22
Alimentation de la BD 23
Interrogation de la BD 24
Automatisation de l'application 25

Objectifs
 Apprendre à se servir d'Access
 Expérimenter les concepts de SGBDR

Au cours de de la première partie du TP, vous allez devoir concevoir une BD, puis l'implémenter sous
Access. Dans la partie suivante, vous réaliserez une petite application sur cette BD.
Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rendue à votre chargé de TP.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.
L'usage des assistants est formellement interdit (Si un assistant apparaît involontairement, annuler et
continuer manuellement).

A. Modélisation du problème
Mise en contexte
Vous prenez la présidence de l'association "Objectifs", dont l'objet est d'aider ses étudiants membres à
mener des projets dans le cadre de leurs études.
Vous constatez en arrivant dans l'association que personne ne sait exactement quels sont les projets en
cours ni qui fait quoi dans les projets. Vous ne parvenez pas non plus à obtenir une liste exacte des
partenaires sur lesquels l'association peut compter. La seule chose sur laquelle vous parvenez à mettre la
main est un fichier tableur vaguement à jour.
Vous décidez qu'il est plus que temps de mettre en place une base de données afin d'assurer la bonne
gestion des informations les plus importantes pour l'association. Vous vous attachez pour cela à réaliser
une analyse des besoins.
Analyse les documents ci-après.
Etat des projets

S. Crozat - UTC 2009


15
Initiation à Access (base de données et application)

Numéro Projet Chef de projet Date Remarques


Année dernière, bières offertes
1 La nuit du Picolo Paul Eau 25/12/2003 par 1664

Financement à trouver.
L'escalade de Voir si Décathlon pourrait
2 l'Evrest Pierre Elelou en 2005 sponsoriser.

Tournoi de Volley- Prix offerts par Yves Rocher.


3 Ball Marc Noflair Intersemestre Appui logistique BDS.

Recrutement des
3.1 équipes Barbara Stressée

Barbara (elle est sportive de haut niveau et


3.2 Arbitrage connait tout au sport)

NB : Hèlene Deuxtrois est


d'accord pour aider sur tous les
projets, pour la compta.

Tableau 1 État des projets de l'association Objectifs


Recueil de besoins
A partir de l'étude du fonctionnement actuel de l'association, vous relever les choses importantes à gérer
suivantes :
 Les membres de l'association, généralement identifiés par leur prénom.
 Les projets gérés par l'association, avec une date de début et de fin précise et un chef de projet.
 Le détail des tâches de chaque projet, avec leur dates de début et de fin aussi, et la liste de tous
les membres qui y participent.
 La liste des partenaires des projets, avec leur rôle précis pour chacun des projets auquels il
participe.
Afin de mieux gérer les attributions des projets, il serait également intéressant de créer une liste des
spécialités correspondant à ce qui ce fait dans l'association, et d'affecter une spécialité à chaque membre
ainsi qu'une à chaque projet, pour voir si ce sont bien les membres les mieux adaptés qui travaille sur les
projets.
Recueil de données
Les discussions avec les anciens membres de l'association vous apprennent les choses suivantes :
 L'association a terminé de gérer les trois projets, "Comédie Musicale" gérée par Nathalie sur les
trois premiers mois du semestre d'automne 1001, "Science en fête" gérée par Pierre sur tout le
semestre de printemps 1003. et "Nuit du picolo" gérée par Julien en novembre 1001.
 Les spécialités recensées pour le moment sont : Ville, Université, Sport, Entreprise, Culture,
International
 Il faut au moins dix membres à l'association (sinon elle ferme), recruter ceux qui manquent.
 Aidez l'association à diviser ses projets en tâches.
 Les partenaires suivants aident ou ont aidé l'association : la mairie pour la comédie musicale et la
science en fête, qui apporte un soutien financier ; le ministère de la culture qui apporte son
soutien logistique à la science en fête ; l'association des commerçants de la ville qui apporte son
soutien publicitaire à la comédie musicale ; 1664 qui offre ses bières à moitié prix pour la nuit du
picolo.

Question 1
Afin de préparer une analyse des besoins sommaire, listez les données que vous devrez gérer à l'aide des
documents et recueils de discussion à votre disposition. Faites des hypothèses lorsque les données sont
incomplètes ou incohérentes.

Question 2
Réaliser le MCD à partir des données préparées dans la question précédente. Ce MCD sera réalisé à la
fois en formalisme UML et E-A

Question 3

S. Crozat - UTC 2009


16
Initiation à Access (base de données et application)

Réaliser le MLD en relationnel en traduisant votre MCD.


Normaliser le schéma relationnel en 3NF.

B. Implémentation de la base de données


Vous décidez d'utiliser Access pour implémenter votre BD.
A ce stade, nous commencerons par un sous-ensemble réduit de la base de données, permettant de gérer
les projets, les spécialités et les chefs de projet uniquement. Nous suivrons par exemple le schéma
relationnel ci-après.
Projet (#Num, Nom, Debut, Fin, ChefDeProjet=>Membre,
Specialite=>Specialite
Specialite (#Intitule)
Membre (#Prenom, Nom, Specialite=>Specialite)

Question 1
Justifiez le choix d'Access pour votre application en quelques arguments.

Question 2
Créez votre base de données "assoBd.mdb", puis les trois tables tProjet, tSpecialite et tMembre.
Indices :
Pour nommer les tables, il est fortement conseillé sous Access d'adopter une convention qui consiste à
préfixer le nom de la table d'un "t" (pour table).
Pour créer une table cliquer sur "Créer une table en mode création". Puis saisissez chaque attribut
avec son type.
Les contraintes sont à spécifier dans la zone du bas :
 Taille
 Valide si (CHECK)
 Null interdit et chaîne vide autorisée (NOT NULL)
 Indexé (UNIQUE)

S. Crozat - UTC 2009


17
Initiation à Access (base de données et application)

Déclarer une table

Déclarer les attributs

Question 3
Déclarer les clés primaires et les clés candidates. Déclarer une clé candidate composé, par exemple (Nom,
Debut) pour la relation Projet.
Indice :
Pour déclarer les clés :
1. Pour la clé primaire, sélectionner l'attribut et cliquer sur le bouton "clé" (ou menu "Edition
> Clé primaire").
2. Pour les clés candidates spécifier : "Null interdit = oui" (et chaîne vide non autorisée le cas
échéant) et Indexé = "Oui - Sans doublon".
3. Plus généralement et notamment pour les clés composées, vous pouvez passer par le menu
"Affichage > Index".

S. Crozat - UTC 2009


18
Initiation à Access (base de données et application)

Déclarer la clé primaire

Déclarer une clé candidate

Déclarer une clé composée

Question 4
Déclarer les contraintes d'intégrités référentielles sur les clés étrangères.
Indice :
1. Choisissez le menu "Outils > Relation"
2. Ajoutez toutes les tables de votre base de données
3. Glissez-déposez chaque clé étrangère sur la clé primaire référencée
4. Cliquez sur l'option "Appliquer l'intégrité référentielle"

C. Implémentation de l'application
Votre BD réalisée, vous décidez à présent de commencer la réalisation de l'application. Pour cela vous

S. Crozat - UTC 2009


19
Initiation à Access (base de données et application)

vous faites aider par un membre de l'association, Pierre, qui connaît bien le problème de la gestion des
projets dans "Objectifs", et qui par ailleurs à une bonne expérience de la conception des IHM.
Prenez connaissance des propositions d'interface pour l'ajout de projet et pour l'interrogation que vous a
faites Pierre.

Interface d'ajout de projets

Interface de recherche d'un projet

Question 1
Afin de préparer la réalisation de l'application, créez un second fichier "assoAppli.mdb", et reliez-le à
celui contenant votre BD ("assoBd.mdb").
Indice :
Pour relier 2 fichiers Access :
1. Ouvrez le fichier de l'application qui va référencer le fichier de la base de données
2. Choisissez le menu "Fichier > Données externes > Lier les tables"
3. Sélectionner votre fichier de base de données
4. Sélectionner toutes les tables
5. Les tables apparaissent dans l'application, précédées d'une flèche, qui indique qu'elles sont

S. Crozat - UTC 2009


20
Initiation à Access (base de données et application)

en fait dans un autre fichier

Question 2
Décrivez le processus de conception que vous avez adopté pour réaliser votre base de données, en en
décrivant les différentes étapes, et après avoir rappelé en quoi et pourquoi l'on sépare la conception de la
BD de ses applications.
Donnez un exemple concret dans le cas de votre réalisation de problème qui justifie cette séparation.

D. Alimentation de la BD
Réaliser un unique formulaire indépendant permettant de saisir un nouveau projet, avec :
 Son numéro, son nom, son début et sa fin.
 Son chef de projet
 Sa spécialité
Les participations des membres de l'association au projet, les partenaires, et les tâches ne sont pas à
définir à ce stade, ils s'inscriront ultérieurement grâce à un autre formulaire qui n'est pas à réaliser dans le
cadre de cette question.

Question 1
Créer le formulaire en utilisant uniquement des contrôles de type "zone de texte".
NB : La réalisation d'interfaces avancées n'est pas le but de ce TP, même si vous avez la possibilité d'aller
plus loin en traitant les questions suivantes.
Indices :
Il est conseillé de préfixer les noms des formulaire par un "f".
Pensez à donner un nom explicite à chaque contrôle, comme par exemple les trois premières lettres
de l'attribut auquel il correspond.
Pour changer le nom d'un contrôle :
1. Cliquez sur le contrôle
2. Faites "Affichage > Propriété" si la fenêtre des propriétés ne s'affiche pas la première fois
3. Sélectionner l'onglet "Toutes"
4. Changer la première propriété "Nom"

Question 2
Écrivez la requête de type ajout de données (INSERT) permettant d'ajouter les nouvelles informations
dans la table tProjet depuis le formulaire.
Indices :
Il est conseillé de préfixer les noms des requêtes par un "r".
Pour écrire une requête directement en SQL, sans passer par l'interface graphique, choisissez
"Affichage > Mode SQL".
Pour l'exécuter choisissez le menu "Requête > Exécuter".
La syntaxe suivante permet de récupérer la valeur courante d'un contrôle d'un formulaire ouvert :
"Formulaires!NomDuFormulaire!NomDuContrôle"
Dans une question SQL on peut donc écrire "INSERT INTO t (attribut) VALUES (Formulaires!
NomDuFormulaire!NomDuContrôle)"
où "Formulaires!NomDuFormulaire!NomDuContrôle" sera remplacé par sa valeur courante dans le
formulaire.
Le formulaire doit donc être ouvert, et des valeurs doivent être saisies et validées, pour que la requête
s'exécute correctement.

S. Crozat - UTC 2009


21
Initiation à Access (base de données et application)

Question 3
Testez votre application en insérant des données, vérifier que les contraintes d'intégrité sont bien
contrôlées.

E. Interrogation de la BD
Réaliser une vue dont la requête source est paramétrée par un formulaire, afin de rechercher les projets
tels que leur nom contient un (unique) mot clé donné dans le formulaire.
Le numéro et le nom seront projetés.

Question 1
Créer le formulaire de recherche fRecherche.

Question 2
Créer la vue vRecherche.
Indices :
Un objet "Requête" d'Access est une vue.
La syntaxe suivante permet de récupérer la valeur courante d'un contrôle d'un formulaire ouvert :
"Formulaires!NomDuFormulaire!NomDuContrôle"
Dans une question SQL on peut donc écrire "SELECT ... FROM ... WHERE attribut=Formulaires!
NomDuFormulaire!NomDuContrôle"
où "Formulaires!NomDuFormulaire!NomDuContrôle" sera remplacé par sa valeur courante dans le
formulaire.
Le formulaire doit donc être ouvert, et des valeurs doivent être saisies et validées, pour que la requête
s'exécute correctement.
Pensez à l'usage de l'opérateur de comparaison de chaîne LIKE.
Le caractère de concaténation est "&" et le joker "*" désigne plusieurs caractères ("*" est sous
Access équivalent au caractère "%" standard en SQL).
Attention : lorsque vous saisissez une valeur dans le formulaire, faites "Entrée" pour valider avant
d'exécuter la requête.

Question 3
Proposer un exemple d'exécution.
Indice :
Un exemple d'exécution dans votre cas est une illustration d'un résultat obtenu (sortie) à partir du
paramétrage (entrée). On pourra par exemple effectuer des copies d'écran.

F. Automatisation de l'application

Question
Ajouter un bouton "OK" à vos formulaires d'ajout et de recherche de projet, afin d'exécuter directement
les requêtes SQL.
Indice :
N'utiliser pas les assistants !
1. Créer un module "ihm"
2. Ajouter les fonctions insertProjet() et rechercheProjet()

S. Crozat - UTC 2009


22
Initiation à Access (base de données et application)

3. Utilisez le commande DoCmd.OpenQuery ("nom de la requête")


4. Ajouter un contrôle de type bouton dans chaque formulaire
5. Ajoutez l'appel à la fonction sur la propriété "Sur clic" du bouton (écrivez "=fonction()"
dans la propriété "Sur clic").

* *
*

Faire une démonstration de votre réalisation, en montrant vos schémas MCD et MLD, votre code SQL, le
résultat de son exécution dans Access (interface de création de table), votre séparation BD/application,
votre formulaire de saisie, la requête d'insertion depuis ce formulaire, le formulaire d'interrogation, la
requête de question paramétrée associée.
Décrivez le processus général de conception d'une base de données et de ses couches applicatives sous
Access, en soulignant pour chacune des étapes les aspects technologiques qui vous paraissent intéressants
ou au contraire limitants.
Appuyez-vous sur ce que vous avez réalisé pour montrer et argumenter.

S. Crozat - UTC 2009


23
INITIATION À ACCESS VBA
IV
IV -

Déclaration de la base de données en SQL 27


Test des instructions SQL 29
Programme VBA d'exécution SQL 30
Alimentation 32
Manipulation 33

Objectifs
 Apprendre à se servir de VBA pour manipuler une base de données
Access
 Expérimenter l'usage d'un langage de programmation pour manipuler
une base de données

La première partie du TP a pour objectif l'écriture d'un programme VBA permettant de lire un fichier
SQL de façon à exécuter une série d'instructions LDD et LMD en vue de la création et de l'initialisation
d'une base de données. Au cours de la seconde partie, vous allez réaliser des fonctions VBA permettant
d'exploiter votre base de données.
Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rendue à votre chargé de TP.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.

A. Déclaration de la base de données en SQL


Vous êtes le président de l'association "Objectifs", dont l'objet est d'aider ses étudiants membres à mener
des projets dans le cadre de leurs études. Cette association est dotée d'une base de données Access pour
gérer les projets. Afin d'envisager l'amélioration de l'application, vous décidez d'en refaire le
développement en utilisant le langage de développement d'Access, le VBA.
Votre première action est de redévelopper la création de la base en se basant sur le langage SQL plutôt
que la création interactive qui a été jusque là favorisée. Cela permettra de plus facilement modifier la base
dans le cadre d'évolutions futures.

S. Crozat - UTC 2009


25
Initiation à Access VBA

Modèle UML de la base de données de gestion de projets de l'association Objectif

Numéro Projet Chef de projet Date Remarques


Année dernière, bières offertes
1 La nuit du Picolo Paul Eau 25/12/2003 par 1664

Financement à trouver.
L'escalade de Voir si Décathlon pourrait
2 l'Evrest Pierre Elelou en 2005 sponsoriser.

Tournoi de Volley- Prix offerts par Yves Rocher.


3 Ball Marc Noflair Intersemestre Appui logistique BDS.

Recrutement des
3.1 équipes Barbara Stressée

Barbara (elle est sportive de haut niveau et


3.2 Arbitrage connait tout au sport)

NB : Hèlene Deuxtrois est


d'accord pour aider sur tous les
projets, pour la compta.

Tableau 2 État des projets de l'association Objectifs


La base de données n'a pour le moment été implémentée que partiellement. Le schéma relationnel ci-
dessous décrit ce qui a été traité.
Projet (#Num, Nom, Debut, Fin, ChefDeProjet=>Membre,
Specialite=>Specialite
Specialite (#Intitule)
Membre (#Prenom, Nom, Specialite=>Specialite)

Question 1
Écrivez dans un fichier texte les instructions LDD permettant d'implémenter les trois tables de ce schéma
relationnel.
Indice :
Utilisez un éditeur ASCII pour écrire du code informatique (comme par exemple le logiciel libre
Notepad++). N'utilisez jamais un logiciel de traitement de texte, comme Word, qui ajoute des
caractères non standards, gère mal les tabulations, etc.

Question 2

S. Crozat - UTC 2009


26
Initiation à Access VBA

Écrivez dans un fichier texte les instructions LMD permettant d'initialiser la base de données avec les
données existantes.

B. Test des instructions SQL


Afin de vérifier la validité de votre SQL et de tester le comportement d'Access, exécutez vos requêtes
SQL une par une via l'interface graphique d'Access.

Question 1
Créez une base de données "assoBdtmp.mdb". Ouvrez une nouvelle requête en mode SQL et copiez vos
instructions SQL une par une afin de les exécuter.
Indices :
Pour écrire une requête directement en SQL, sans passer par l'interface graphique, choisissez
"Affichage > Mode SQL".
Pour l'exécuter choisissez le menu "Requête > Exécuter".
Pour voir les nouvelles tables s'afficher, actualiser la fenêtre principale d'Access (sélectionner un
autre type d'objet et revenir sur les objets table)
Pour voir les nouvelles données s'afficher, fermer et réouvrir la table en mode données (si elle était
déjà ouverte).

Question 2
Vérifiez au fur et à mesure que la base de données se construit bien conformément à vos instructions.
Indices :
Tester les types acceptés par Access et ceux qui ne le sont pas. Par exemple
 les types VARCHAR(X) et INTEGER et DATE sont acceptés
 le type CHAR n'existe pas, mais sa déclaration est acceptée et il et est géré comme un
VARCHAR
Veiller au format des dates à l'insertion.
Vérifier les clauses SQL acceptées et celles qui ne le sont pas : Par exemple DEFAULT et CHECK
(correspondant à "Valide Si") ne sont pas acceptés (ils ne peuvent être spécifiés qu'en mode
interactif, pas en SQL).
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap18.htm
Pensez à vérifier que les contraintes d'intégrité sont bien déclarées, via la fenêtre "Relations" (menu
Outils > Relations)

C. Programme VBA d'exécution SQL


Vous allez à présent écrire un programme VBA qui permettra d'enchaîner l'exécution des requêtes SQL
sans avoir à passer par l'interface graphique. En effet, vous découvrez qu'il n'est pas prévu dans Access de
créer une BD à partir d'un fichier texte contenant des instructions SQL (alors que la plupart des SGBD
proposent ce genre de fonctions).

Question 1
Créez une base de données "assoBd2.mdb". Créez un module "SQL". Configurez correctement votre
interface d'exécution.
Indice :
Affichez la fenêtre d'exécution (CTRL+G ou menu "afficher") dans l'interface d'édition de module

S. Crozat - UTC 2009


27
Initiation à Access VBA

VBA.

Question 2
Écrivez une procédure "HelloWorld()" :
 qui prend en argument une chaîne de caractères
 affiche "Hello Word" suivi de la chaîne passée en argument dans la fenêtre d'exécution
Écrivez une fonction "fHelloWorld2()" qui, en plus, retourne la valeur 0.
Indices :
Pour exécuter une fonction tapez "? fonction(arg1, arg2)" dans la fenêtre d'exécution.
Pour exécuter une procédure, tapez simplement "proc arg1 arg2" dans la fenêtre d'exécution.
L'instruction "Debug.Print MyString" permet l'affichage dans la fenêtre d'exécution.
Le caractère de concaténation sous Access est "&".

Question 3
Écrivez le programme VBA permettant d'enchaîner l'exécution de vos requêtes SQL.
Indices :
Afin de manipuler un fichier, il faut utiliser les instructions Open, Input et Close.
Appuyez vous sur l'exemple de code VBA du cours et sur l'aide d'Access pour avoir un exemple de
programme permettant la lecture d'un fichier. Pour cela écrivez le mot "Open" (par exemple) et
appuyez sur CTRL+F1.

Aide en ligne d'Access

S. Crozat - UTC 2009


28
Initiation à Access VBA

Notez que le caractère point-virgule est l'élément séparateur entre deux requêtes.
Pour exécuter une requête LDD, utilisez l'instruction : CurrentDb.CreateQueryDef("",
vSql).Execute (avec vSQL l'instruction SQL sous forme de chaîne de caractère).
Testez votre programme à l'aide de deux instructions SQL simples, comme par exemple celles
proposées ci-dessous.
 create table t (a integer);
 insert into t values (1);
Pensez à supprimer les tables créées entre deux exécutions, sinon le moteur de la BD vous renverra
une erreur due à l'impossibilité de créer deux tables de même nom.
Vous pouvez utiliser l'instruction DROP TABLE à cette fin.

Utilisez votre programme pour lire votre (ou vos) fichiers contenant les listes d'instructions SQL et les
exécuter.

Question 4
Créez d'abord le schéma de la base de données.

Question 5
Initialisez les données de la base en utilisant le même procédé.

D. Alimentation
Créez un second fichier "assoAppli2.mdb", et reliez-le à celui contenant votre BD ("assoBd2.mdb").
Créer un module "Alimentation".

Question 1
Créer une fonction "fAjoutSpecialite" prenant en argument une chaîne de caractère et réalisant l'insertion
dans la base de données.
Testez-la en ajoutant de nouvelles spécialités.
Indice :
Inspirez vous de l'exemple du cours.
Utilisez l'instruction : CurrentDb.CreateQueryDef("", vSQL).Execute.

Question 2
Créer un formulaire indépendant permettant d'ajouter des spécialités (le formulaire ne contient donc qu'un
seul champ).
Indices :
Le formulaire fera appel à la fonction "fAjoutSpecialite()" en lui passant en argument le contenu du
champ de saisie.
La fonction sera appelée sur la propriété "Sur Clic" du bouton "Valider" du formulaire.

Question 3
[Cette question est optionnelle]
Ajouter à votre fonction une gestion d'exception permettant de renvoyer 1 si l'exécution s'est bien passé et
0 sinon.
Indice :
Inspirez vous de l'exemple du cours.
Utilisez la structure de gestion d'exception ci-après.

S. Crozat - UTC 2009


29
Initiation à Access VBA

On Error GoTo ErreurInsertion


...
Exit_ParcoursTable:
...
Erreur_ParcoursTable:
...

Question 4
[Cette question est optionnelle]
Ajouter à votre fonction un test préliminaire permettant d'alerter l'utilisateur en cas de doublon.
Indices :
Commencer par une instruction SELECT pour vérifier que la chaîne à insérer n'existe pas déjà.
S'il la chaîne existe, alerter l'utilisateur à l'aide de l'instruction "MsgBox vMessage".

E. Manipulation

Question 1
Créer un module "Manipulation".
Écrivez deux fonctions, l'une permettant de renvoyer le nombre de spécialités actuellement existantes et
l'autre le nombre de spécialités actuellement utilisées.
Afficher le résultat de ces deux fonctions dans le formulaire "fAjoutSpecialite".
Indice :
Pour afficher le résultat d'une fonction, ajouter un contrôle de type saisie de texte, avec comme valeur
"=fNomFonction()".

Question 2
[Cette question est optionnelle]
Écrivez une fonction permettant de normaliser une chaîne de caractère de la façon suivante :
 La chaîne ne doit pas comporter d'espace (tout ce qui est après le premier espace est supprimé).
 La chaîne commence par une majuscule et se poursuit par des minuscules.
Utiliser cette fonction pour normaliser la table spécialité.
Indices :
La fonction Right(S, N) renvoie le N caractères à droites de la chaîne S (idem pour Left à
gauche).
 La fonction Len(S) renvoie la longueur de la chaîne S
 Le caractère de concaténation est le "&"
Appeler la fonction dans une instruction UPDATE.
Vous veillerez à propager les mises à jour dans les tables référençant les spécialités :
 Utilisation de la propriété ON CASCADE,
 ou bien suppression de la contrainte d'intégrité avant mise à jour, et réactivation après.

S. Crozat - UTC 2009


30
APPROFONDISSEMENT DE LA
V
V-

CRÉATION D'APPLICATION SOUS


ACCESS
Alimentation de la BD (amélioration) 35
Interrogation de la BD (amélioration) 36
Automatisation de l'application (amélioration) 37

Objectifs
 Approfondir l'usage d'Access
 Expérimenter les concepts de SGBDR
 Réaliser des applications de bases de données

Ce TP est réservé aux étudiants de NX17, il vise à approfondir l'usage d'Access, notamment dans sa
fonction de création d'applications.
Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rendue à votre chargé de TP.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.
L'usage des assistants est formellement interdit (Si un assistant apparaît involontairement, annuler et
continuer manuellement).
Ce TP fait suite au premier TP sous Access, il vise à terminer la création de l'application telle que l'avait
spécifié Pierre.

A. Alimentation de la BD (amélioration)
L'objectif est de compléter le formulaire d'alimentation de la base de données pour qu'il corresponde à
celui préconisé par Pierre.

Question 1
Proposer de choisir le chef de projet et la spécialité dans une liste plutôt que de le saisir en toutes lettres
(pour le chef de projet, on pourra alors afficher selon la sélection son prénom et sa spécialité).

Question 2
Ajouter l'insertion des tâches en même temps que du projet (plusieurs requêtes INSERT devront être
exécutées).

Question 3
Pour les tâches, on vérifiera que les débuts et fins des tâches sont cohérents avec le projet. On vérifiera
aussi que tout projet contient au moins une tâche.

S. Crozat - UTC 2009


31
Approfondissement de la création d'application sous Access

Question 4
Pour les chefs de projet et les spécialités, permettre de définir une nouvelle valeur. Une requête INSERT
complémentaire devra insérer donc préalablement insérer cette valeur dans les tables correspondantes.

B. Interrogation de la BD (amélioration)
L'objectif est de compléter le formulaire de recherche pour qu'il corresponde à celui préconisé par Pierre.
Réaliser une nouvelle vue dont la requête source est paramétrée par un second formulaire plus élaboré,
afin de rechercher les projets tels que :
 Leur nom contient un (unique) mot clé donné.
 Ils ont commencé avant une date donnée et se sont terminés après une date donnée.
 Leur chef de projet est donné.
 La spécialité du projet est donnée.
Chacun de ces paramètres peut ne pas être renseigné. Ces paramètres correspondent également aux
données à projeter pour le lecteur.

Question 1
Créer le formulaire de recherche fRecherche2.

Question 2
Créer la vue vRecherche2.
Indices :
Faites une recherche dans l'aide sur l'extension SQL "IIf" proposée par Access, pour tester les cas de
nullité et proposer une valeur par défaut permettant de tout sélectionner si le champ n'est pas
renseigné.
Faites une recherche dans l'aide sur l'extension SQL "IsNull" proposée par Access pour tester la
nullité d'un champ.
Faites une recherche dans l'aide sur l'extension SQL "CDate" proposée par Access, permettant de
saisir des date dans une expression SQL.

Question 3
Réaliser un état permettant de mettre en forme la vue précédente. Appelez cet état plutôt que la requête
depuis le formulaire.

C. Automatisation de l'application (amélioration)


Afin de terminer votre application, vous complétez votre IHM afin que l'utilisateur puisse naviguer de
formulaire en formulaire sans utiliser l'interface par défaut d'Access.

Question 1
Réaliser un menu d'accueil, initialisé à l'ouverture de la base, qui permet soit de rechercher des projets
existants, soit d'en saisir un nouveau.
Indice :
Utilisez la macro "AutoExec".

Question 2
Réaliser les boutons permettant de fermer chaque formulaire et de retourner au menu d'accueil.

S. Crozat - UTC 2009


32
SQL ET SQL*PLUS SOUS
VI
VI -

ORACLE
Migration d'une base Access vers Oracle 40
Séquence 43
Extension Médiathèque 43
Transactions 44
Questions avancées en SQL 45
Maintenance de la base 45
Vue 46
SQL*Plus 46

Objectifs
 Apprendre à se servir d'Oracle
 Approfondir SQL
 Avoir un aperçu de SQL*Plus

Dans cette première partie, vous allez aborder les aspects classiques des BD et du SQL, sur le cas
particulier d'Oracle.
Vous allez également expérimenter l'environnement de mise en forme de résultat de requêtes SQL*Plus.
Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rendue à votre chargé de TP.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.
Lisez la notice d'utilisation de l'OEM.
Attention : Oracle est un système transactionnel, il faut terminer chaque séquence de requêtes par une
instruction SQL "commit;".

A. Migration d'une base Access vers Oracle


Après un an de bons et loyaux services au sein de l'association "Objectifs", vous en laissez la présidence à
Marc Chardon. En effet, suite à votre excellent travail de structuration des activités de l'association dans
une base Access, l'association des anciens élèves vous invite à venir lui faire profiter de vos compétences,
ce que vous avez accepté avec plaisir. Après une nouvelle année, Marc vous demande de bien vouloir
revenir dans l'association "Objectifs" pour l'aider dans un projet ambitieux.
La base de données que vous aviez créée sous Access doit être migrée sous Oracle, sur préconisation du
service informatique.

S. Crozat - UTC 2009


33
SQL et SQL*Plus sous Oracle

Question 1
Prenez connaissance de la documentation (diagramme UML et code SQL de création et d'initialisation de
la base de données), afin de préparer la migration de l'existant.
Est-ce que les données dont vous disposez sont cohérentes entre elles ? Sinon expliquez en quoi elle ne le
sont pas et prenez les décisions adéquates.

Modèle UML de la base de données de gestion de projets de l'association Objectif

S. Crozat - UTC 2009


34
SQL et SQL*Plus sous Oracle

create table SPECIALITE (


intitule varchar(20),
constraint PK_SPECIALITE primary key (intitule)
);
create table MEMBRE (
prenom varchar(20),
nom varchar(20),
specialite varchar(20),
constraint PK_MEMBRE primary key (prenom),
constraint FK_MEMBRE_SPECIALITE foreign key (specialite)
references SPECIALITE(intitule)
);
create table PROJET (
num number,
nom varchar(20),
debut date,
fin date,
chefprojet varchar(20),
specialite varchar(20),
constraint PK_PROJET primary key (num),
constraint FK_PROJET_MEMBRE foreign key (chefprojet)
references MEMBRE(prenom),
constraint FK_PROJET_SPECIALITE foreign key (specialite)
references SPECIALITE(intitule)
);
create table TACHE (
num number,
projet number,
nom varchar(20),
debut date,
fin date,
constraint FK_TACHE_PROJET foreign key (projet)
references PROJET(num),
constraint PK_TACHE primary key (num, projet)
);
create table PARTENAIRE (
nom varchar(40),
description varchar(128),
constraint PK_PARTENAIRE primary key (nom)
);
create table PARTICIPE (
prenom varchar(20),
tache number,
projet number,
fonction varchar(60),
constraint FK_PARTICIPE_MEMBRE foreign key (prenom)
references MEMBRE(prenom),
constraint FK_PARTICIPE_TACHE foreign key (tache, projet)
references TACHE(num, projet),
constraint PK_PARTICIPE primary key (prenom, tache,
projet)
);
create table ESTASSOCIE (
nom varchar(40), projet number,
role varchar(128),
constraint FK_ESTASSOCIE_PARTENAIRE foreign key (nom)
references PARTENAIRE(nom),
constraint FK_ESTASSOCIE_PROJET foreign key (projet)
references PROJET(num),

S. Crozat - UTC 2009


35
SQL et SQL*Plus sous Oracle

constraint PK_ASTASSOCIE primary key (nom, projet)


);

INSERT INTO Specialite VALUES ('Ville');


INSERT INTO Specialite VALUES ('Université');
INSERT INTO Specialite VALUES ('Sport');
INSERT INTO Specialite VALUES ('Entreprise');
INSERT INTO Specialite VALUES ('Culture');
INSERT INTO Specialite VALUES ('International');
INSERT INTO Membre VALUES ('Nathalie', 'Dupont',
'Culture');
INSERT INTO Membre VALUES ('Pierre', 'Perret', 'Sport');
INSERT INTO Membre VALUES ('Alain', 'Durand', 'Culture');
INSERT INTO Membre VALUES ('Julien', 'Dujnou',
'Université');
INSERT INTO Projet VALUES (1, 'Comédie Musicale',
'20020901', '20021130', 'Nathalie', 'Culture');
INSERT INTO Projet VALUES (2, 'Science en fête',
'20030301', '20030630', 'Pierre', 'Ville');
INSERT INTO Projet VALUES (3, 'Nuit du Picolo', '20021101',
'20021130', 'Julien', 'Université');
INSERT INTO Tache VALUES (1, 1, 'Dossier financement',
'20020901', '20020930');
INSERT INTO Tache VALUES (2, 1, 'Casting', '20020901',
'20020930');
INSERT INTO Tache VALUES (3, 1, 'Script', '20020901',
'20020930');
INSERT INTO Tache VALUES (4, 1, 'Répétition', '20021001',
'20021130');
INSERT INTO Tache VALUES (5, 1, 'Réservation salle',
'20020901', '20020915');
INSERT INTO Tache VALUES (6, 1, 'Publicité', '20021101',
'20021115');
INSERT INTO Tache VALUES (7, 1, 'Vente billets',
'20021115', '20021130');
INSERT INTO Tache VALUES (1, 2, 'Programme', '20030315',
'20030415');
INSERT INTO Participe VALUES ('Alain', 1, 1,
'Prospection');
INSERT INTO Participe VALUES ('Nathalie', 1, 1,
'Rédaction');
INSERT INTO Partenaire (Nom) VALUES ('Mairie');
INSERT INTO Partenaire (Nom) VALUES ('Ministère');
INSERT INTO Partenaire (Nom) VALUES ('Association des
commerçants');
INSERT INTO Partenaire (Nom, Description) VALUES ('1664',
'Entreprise de fabrication de bière');
INSERT INTO EstAssocie VALUES ('Mairie', 1, 'Financeur');
INSERT INTO EstAssocie VALUES ('Mairie', 2, 'Financeur');
INSERT INTO EstAssocie VALUES ('Ministère', 2,
'Logistique');
INSERT INTO EstAssocie VALUES ('Association des
commerçants', 1, 'Publicitaire');
INSERT INTO EstAssocie VALUES ('1664', 3, 'Réduction sur
les bières'); commit;

Question 2
Vérifier que le code SQL LDD et LMD est adapté à une implémentation sous Oracle. Effectuez les
corrections nécessaires sinon.

S. Crozat - UTC 2009


36
SQL et SQL*Plus sous Oracle

Indice :
L'insertion des dates peut poser des problèmes selon les formats paramétrés sur le serveur Oracle (en
général par défaut le format est DD-MMM-YY). La solution la plus rigoureuse consiste à utiliser la
fonction de conversion TO_DATE. Par exemple :
INSERT INTO Projet VALUES (1, 'Comédie Musicale', to_date('20020901', 'YYYYMMDD'),
to_date('20021130', 'YYYYMMDD'), 'Nathalie', 'Culture');

Question 3
Procédez à la création et à l'initialisation de la base.

B. Séquence
Marc a une formation solide en marketing. Dans son discours pour sa seconde investiture à la présidence
de l'association, il promet de donner un nouveau souffle à l'association suite à des malentendus avec les
supports financiers. Après concertation des membres de l'association, Marc décide alors de donner une
dimension commerciale aux activités de l'association dans le but d'auto-subventionner ses projets.
Dans cette perspective, Marc lance un nouveau projet intitulé "Médiathèque", spécialisé dans la vente de
produits multimédia (CDROM, DVD, Vidéo, ...) à distance (via Internet). Ce projet est composé de trois
tâches : "Marketing", "Prospection" et "Service après vente", et s'inscrit dans la spécialité "Commerce".

Question 1
Afin de profiter au mieux des fonctions proposées par Oracle, associez une séquence à la table Projet
pour gérer l'itération automatique des numéros de projet.
Indice :
La clause START WITH de l'instruction CREATE SEQUENCE permet de définir la première valeur
de la séquence.

Question 2
Ecrire et exécuter les requêtes LMD nécessaires à la gestion du nouveau projet "Médiathèque virtuelle",
en utilisant la séquence.

C. Extension Médiathèque
Submergé par la demande de la clientèle, Marc fait appel à vous pour étendre le schéma de la base de
données de l'association afin d'automatiser les tâches de marketing (analyse des ventes, analyse des
profils des clients) et commerciales (facturation).
Cette extension doit inclure les nouvelles entités : client, produit, et facture.
Les règles suivantes doivent être respectées dans la conception du schéma :
 Une facture comporte un ou plusieurs produits.
 Un produit peut paraître dans plusieurs factures.
 Une facture appartient à un seul client.
 Un client peut établir plusieurs factures.

Question 1
Faites le schéma conceptuel de l'extension.

Question 2
Dériver le modèle relationnel.

S. Crozat - UTC 2009


37
SQL et SQL*Plus sous Oracle

Vous demandez à un collègue de réaliser pour vous les instructions de création et d'initialisation des
tables, sur la base des données dont vous disposez.

Question 3
Vérifier que les scripts de création et d'initialisation sont corrects, corrigez les sinon, puis exécutez les.

D. Transactions
Lors de la saisie d'une facture, le client peut changer d'avis : il n'a plus envie d'acheter un article, il se
rend compte qu'il n'a pas assez d'argent avec lui, etc.
Pour gérer ces cas (et d'autres plus critiques, comme les cas de panne), on utilise un mécanisme qui
permet de valider ou d'annuler une transaction, c'est à dire une série d'instructions SQL.

Question 1
Le client 1 souhaite acheter 1 exemplaire du produit 1, mais il change d'avis au moment de valider.
Exécutez le script SQL suivant et expliquez ce qui se passe.
select * from facture;
select * from ligne_fact;
insert into FACTURE(num, client, date_etabli)
values( facture_seq.NEXTVAL, 1,
to_date('18042002','DDMMYYYY' ) );
insert into LIGNE_FACT(facture, produit, qte)
values( facture_seq.CURRVAL, 1, 3 );
select * from facture;
select * from ligne_fact;
rollback;
select * from facture;
select * from ligne_fact;

Question 2
Cette fois la procédure est refaite et le client valide bien son achat.
Exécutez ce second script SQL et expliquez ce qui se passe.
select * from facture;
select * from ligne_fact;
insert into FACTURE(num, client, date_etabli)
values( facture_seq.NEXTVAL, 1,
to_date('18042002','DDMMYYYY' ) );
insert into LIGNE_FACT(facture, produit, qte)
values( facture_seq.CURRVAL, 1, 1);
select * from facture;
select * from ligne_fact;
commit;
select * from facture;
select * from ligne_fact;

E. Questions avancées en SQL


A la fin de chaque année, le service marketing établit un ensemble d'états qui permettent d'analyser le
profil de leurs clients (leurs préférences, leur pouvoir d'achat, etc.) et d'ajuster l'offre de l'association en
conséquence.

Question 1

S. Crozat - UTC 2009


38
SQL et SQL*Plus sous Oracle

Écrivez une requête SQL LMD pour calculer pour chaque produit, le nombre d'articles vendus, trié par
ordre décroissant.
Indice :
Utilisez la fonction SUM appliquée à la quantité sum(t.qte), la clause GROUP BY pour faire les
calculs par produit, et la clause ORDER BY pour le tri.

Question 2
Ecrivez une requête SQL LMD pour calculer les chiffres d'affaire par client, triés par ordre décroissant.
Indice :
Utilisez la fonction SUM appliquée au produit du prix et de la quantité (sum(t1.prix*t2.qte)),
la clause GROUP BY pour faire les calculs par client, et la clause ORDER BY pour le tri.

Question 3
Ecrivez une requête SQL LMD pour calculer le montant moyen des factures pour chaque client, trié par
ordre croissant.
Indice :
Vous pouvez utiliser les sous-requêtes dans la clause FROM pour traiter la question en deux étapes.

Question 4
Écrivez deux requêtes SQL LMD pour obtenir la liste des produits dont le prix est maximal et dont le prix
est minimal.
Indice :
Utilisez une sous-requête d'existence de type IN.

F. Maintenance de la base
Suite aux premiers usages, l'association se rend compte que le classement des produits vendus par
catégories (fiction, culture, musique, comédie, etc.) n'a pas été prévu. Or l'association a besoin de
connaître le nombre d'articles vendus par catégorie.

Question 1
Ecrivez les requêtes SQL LDD et LMD permettant de modifier la table "produit" et ses données pour
intégrer la propriété de catégorie.
Indice :
Utiliser ALTER pour modifier la définition de la table et UPDATE pour modifier les données.

Question 2
Ecrivez la requête LMD permettant de répondre à la question que se pose l'association (le nombre
d'articles vendus par catégorie)

G. Vue
Le service après vente est instruit à se comporter « pragmatiquement » vis à vis des clients, selon leur
catégorie :
 "VIP" si le chiffre d'affaire du client est >= 3000 euros,

S. Crozat - UTC 2009


39
SQL et SQL*Plus sous Oracle

 "client ordinaire" si son chiffre d'affaire est compris entre 100 et 3000 euros,
 et "client à potentiel" si son chiffre d'affaire est inférieur à 100 euros.
Le mécanisme de vue est fréquemment utilisé pour cacher la complexité d'un schéma de BD aux yeux
d'opérateurs nécessitant un schéma simple, ou pour cacher des informations confidentielles aux
opérateurs n'ayant pas le droit d'accéder à des informations sensibles dans le schéma.
Dans notre cas, les opérateurs du service après vente désirent avoir la catégorie du client au téléphone
avec une instruction très simple :
select * from Chiffre_Affaire where code_client=# ;

Question 1
Écrivez la requête SQL LMD qui permet de renvoyer la liste des clients (num, nom et prénom) avec leur
chiffre d'affaire et leur catégorie (VIP, Ordinaire ou Potentiel)
Indice :
Utiliser l'extension SQL CASE WHEN d'Oracle :
SELECT CASE WHEN ... THEN 'X' WHEN ... THEN 'Y' ELSE 'Z' END
FROM ...

Question 2
Écrivez la requête SQL LDD qui crée la vue "Chiffre_Affaire" permettant de répondre au besoin des
opérateurs du service après vente.

Question 3
Écrire la requête SQL LMD qui renvoie la catégorie du client 1.
Indice :
Utilisez la vue dans la clause FROM de votre requête.

H. SQL*Plus
A présent que vous avez terminé vos requêtes, expérimentez SQL*Plus afin d'améliorer la lisibilité.

Question 1
Effectuez un SELECT * sur la table "produit". Que constatez vous ? Pourquoi ?

Question 2
Proposez une solution en utilisant le formatage SQL*Plus.

Question 3
Améliorez le formatage des autres requêtes posant problème.

* *
*

Après avoir rappelé les différents aspects du SQL que vous avez manipulés, vous en commenterez l'usage
dans le cadre d'Oracle.
Faites une démonstration de votre réalisation, en montrant vos codes SQL et SQL*Plus, et les résultats
d'exécution en utilisant le client Oracle.

S. Crozat - UTC 2009


40
PL/SQL SOUS ORACLE
VII
VII -

Fonctions stockées 49
Curseurs 50
Triggers 51

Objectifs
 Apprendre à se servir d'Oracle
 Apprendre à programmer en PL/SQL
 Expérimenter les déclencheurs

Vous allez dans cette seconde partie étudier des aspects de la gestion de BD plus spécifiques à Oracle, à
travers le langage PL/SQL.
Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rendue à votre chargé de TP.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.

A. Fonctions stockées
A la fin de chaque année, le fournisseur des produits du projet "Médiathèque Virtuelle" demande à
l'association un inventaire sur les produits vendus. Cet inventaire lui est envoyé par e-mail pour analyse et
traitement. L'information demandée est la suivante : donner pour chaque produit, sa désignation, son prix
actuel, et une mention sur la demande :
 demande "forte" si le nombre d'articles vendus dépasse 1000,
 demande "moyenne" si le nombre d'articles vendus est compris entre 1000 et 500
 et demande "faible" sinon

Question 1
Créer la table inventaire.

Question 2
Écrire une fonction stockée qui retourne la valeur de demande (forte, moyenne, faible) en fonction d'un
numéro de produit.
Indices :
Pensez à utiliser l'instruction show errors en fin de block PL/SQL pour avoir en retour les
éventuelles erreurs de complication.

S. Crozat - UTC 2009


41
PL/SQL sous Oracle

Utilisez la trame suivante pour vous aider.


CREATE OR REPLACE FUNCTION fDemande (num_produit in
number) RETURN varchar
IS
qte_vendue NUMBER;
BEGIN
SELECT ... INTO qte_vendue
FROM ...
WHERE ...
IF ... THEN
RETURN ('forte');
ELSE
...
END IF ;
END fDemande
/
SHOW ERRORS

Question 3
Écrire une requête SELECT qui utilise cette fonction pour présenter la liste des produits avec la demande.
Indice :

SELECT ..., f(...), ... FROM ... WHERE ...

Question 4
Écrire la requête INSERT permettant d'insérer les produits dans la table inventaire.

B. Curseurs
Afin de raffiner l'analyse du profil de chaque client, le service marketing souhaite calculer pour chaque
client le nombre de ses factures et son chiffre d'affaire total.

Question 1
Écrivez une procédure stockée qui prend en argument un numéro de client, et deux variables de type
number, et qui retourne le nombre de factures et le chiffre d'affaire dans ces deux variables.
Indice :

create or replace procedure nb_fact(num_client in number,


nb out number, ca out number)
...

Question 2
Écrivez un programme PL/SQL anonyme qui affiche pour le client numéro 1 le nombre de factures et le
chiffre d'affaire.
Indices :
Pensez à exécuter le "SET SERVEROUTPUT ON" avant l'exécution de
"DBMS_OUTPUT.PUT_LINE".
Utlisez la syntaxe DECLARE ... BEGIN ... END pour déclarer un bloc PL/SQL anonyme.
declare
client number;

S. Crozat - UTC 2009


42
PL/SQL sous Oracle

nb number;
ca number;
begin
client:=1;
...
end;
/

Question 3
Écrivez un second programme PL/SQL qui affiche pour chaque client son nombre de factures et son
chiffre d'affaire
Client 1
10 / 152.23
------------------
Client 2
5 / 123.34
------------------
...

Indices :
Utiliser un curseur sur la table client :
cursor c_client is select num from client;
Utiliser le caractère de concaténation || pour afficher plusieurs informations sur une même ligne :
dbms_output.put_line('Client' || client.num);

C. Triggers
Un ensemble de règles de gestion est défini afin de gérer le stock des produits du projet "Médiathèque
Virtuelle". La politique suivante a été admise :
1. après chaque vente, la quantité vendue est soustraite de la quantité disponible indiquée dans une
colonne de la table des produits,
2. si cette quantité (disponible) est inférieure à un "seuil" alors insérer un avertissement dans une
table de journalisation : "Attention : rupture de stock imminente", date du jour, numéro de
produit, nouveau stock après mise à jour.

Question 1
Créer un déclencheur permettant de mettre à jour la quantité disponible dans la table produit à chaque
insertion dans la table ligne facture (traitement du point 1).
Indices :
Il s'agit d'un trigger qui modifie une seconde table lorsqu'une première est modifiée : utilisez un
trigger "after"
create trigger TR_STOCK_AUDIT
after insert on ligne_fact
Il s'agit d'un trigger qui cherche à faire une modification pour chaque insertion, donc utilisez un
trigger "for each row"
for each row
Utilisez une requête update pour effectuer la mise à jour avec une condition sur le numéro de produit.

S. Crozat - UTC 2009


43
PL/SQL sous Oracle

update ...
set ...
where num=:new.produit;

Question 2
Créer la table de journalisation.

Question 3
Modifiez votre déclencheur de telle façon qu'après la mise à jour, il teste si le stock est inférieur à une
valeur seuil de 5. Si le stock est inférieur à ce seuil, alors il devra insérer les informations adéquates dans
la table de journalisation (traitement du point 2).

* *
*

Décrivez le processus général de conception d'une base de données sous Oracle, énoncez des exemples
pertinent d'utilisation du PL/SQL, en le positionnant par rapport au SQL et aux langages applicatifs
(comme PHP).
Appuyer vous sur ce que vous avez réalisé pour montrer et argumenter.

S. Crozat - UTC 2009


44
RELATIONNEL-OBJET SOUS
VIII
VIII -

ORACLE
Concevoir et implémenter une base RO 54
Alimenter une base RO 55
Interroger une base RO : Utilisation des OID 56
Interroger une base RO : Utilisation des méthodes 57
Interroger une base RO : Utilisation des tables imbriquées 58

Objectifs
 Expérimenter les concepts du RO
 Savoir réaliser des modèles RO
 Savoir implémenter et interroger des BD RO sous Oracle

Vous vous proposez de recommencer la conception du sous-schéma de facturation en utilisant la


modélisation Relationnel-Objet et ses possibilités d'implémentation sous Oracle.
Reprenez connaissance du schéma E-A réalisé pour la gestion de la facturation.

Schéma E-A de l'extension de la base

S. Crozat - UTC 2009


45
Relationnel-objet sous Oracle

Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rendue à votre chargé de TP.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.

A. Concevoir et implémenter une base RO

Question 1
Réaliser le passage vers un modèle RO du sous-schéma de facturation.
On déclarera la méthode Total() sur la classe "facture" : une méthode qui retourne le montant total de la
facture.
Indices :
Définir les types d'objet "Produit", "Client" et "Facture" et les tables d'objet associées.
Utiliser des OID plutôt que les clés étrangères, pour pointer les produits et clients depuis la table des
factures.
Utiliser une collection d'objets imbriquée dans "Facture" pour gérer les lignes de facturation
(relation N:M entre facture et produit). Une ligne de facture contient donc une référence sur l'objet «
produit » demandé ainsi que la quantité demandée.

Question 2
Réalisez l'implémentation SQL3 sous Oracle.
Indice :
Utiliser la structure NESTED TABLE d'Oracle pour gérer l'imbrication des lignes de facturation dans
la table facture.

Question 3
Réalisez l'implémentation de la méthode total()
Indice :
Penser à utiliser SELF pour désigner l'enregistrement courant.
create or replace type body obj_facture as
member function total return number is
...
begin
...
end total;
end;
Cette méthode n'est pas triviale à écrire, vous pouvez vous contenter de retourner 0 pour le moment
(RETURN 0), et vous reviendrez sur son écriture plus tard (les exercices suivants qui vous guideront
dans l'écriture de requêtes RO).

B. Alimenter une base RO

Question 1
Initialiser les tables client et produit avec les données de votre choix (au moins deux clients et deux
produits).

S. Crozat - UTC 2009


46
Relationnel-objet sous Oracle

Indice :
Effectuez l'insertion comme en relationnel.
-- Exemple de données insérées dans la table client
SELECT num||';'||nom||';'||prenom||';'||adresse
FROM obj_client_tab;
-----------------------------------
1;Colomb;Christophe;4, rue liberte
2;Bernard;Morin;120, square zola
-----------------------------------

-- Exemple de données insérées dans la table produit


SELECT num||';'||designation||';'||prix||';'||stock
FROM obj_produit_tab;
-----------------------------------
1;DVD Matrix;23,5;100
2;DVD seigneur des anneaux;49,3;100
3;CD Album Yanni;25,9;100
-----------------------------------

Question 2
Initialiser la BD avec les données de votre choix (deux factures de deux lignes chacune au moins).
-- Exemple de données insérées dans la table facture
SELECT f.num||';'||f.client.nom||';'||f.date_etabli||';'||
l.produit.designation||';'||l.qte
FROM obj_facture_tab f, TABLE(f.lignes) l;
--------------------------------------------
1;Colomb;27/05/08;DVD Matrix;3
1;Colomb;27/05/08;DVD seigneur des anneaux;2
2;Colomb;27/05/08;DVD seigneur des anneaux;6
2;Colomb;27/05/08;DVD Matrix;1
3;Bernard;27/05/08;CD Album Yanni;1
-----------------------------------

Indices :
Récupérer les OID pour insérer les références aux produits et clients.
Utiliser les constructeurs d'objet pour insérer les lignes de facture.
Utiliser du code PL/SQL est souvent plus simple pour manipuler les OID, et donc dans le cas présent
pour instancier des factures.
declare
ref_clie1 ref obj_client;
...
begin
select ref(c) into ref_clie1
from obj_client_tab c
where c.num=1;
...
insert into obj_facture_tab(num, client, date_etabli,
lignes)
values(
1,
ref_clie1,
SYSDATE,
liste_obj_ligne_fact(
obj_ligne_fact(ref_prod1,3),
...)

S. Crozat - UTC 2009


47
Relationnel-objet sous Oracle

);
...
end ;

C. Interroger une base RO : Utilisation des OID


Navigation depuis la table facture
Dans ce premier exercice, vous expérimenterez la manipulation des OID pour naviguer d'enregistrement
en enregistrement, sans utiliser de jointure.

Question 1
Ecrivez une requête permettant d'afficher la liste des factures existantes, avec le nom et le prénom du
client.
Indice :

-- Résultat attendu --
----------------------
1 Colomb Christophe
2 Colomb Christophe
3 Bernard Morin
----------------------

Question 2
Ecrivez une requête permettant d'afficher le montant total de chaque facture de la BD, en rappelant le
nom du client pour chaque facture.
Indice :

-- Résultat attendu --
----------------------
1 169,1 Colomb
2 319,3 Colomb
3 25,9 Bernard
----------------------

D. Interroger une base RO : Utilisation des méthodes


Dans ce second exercice, vous expérimenterez la manipulation des méthodes.

Question 1
Ecrivez une requête permettant de renvoyer le montant total de toutes les factures, ainsi que le nombre de
factures, du client 1.
Indice :
Pensez à toujours passer par un alias de table pour appeler des méthodes.
-- Résultat attendu --
----------------------
488,4 2
----------------------

S. Crozat - UTC 2009


48
Relationnel-objet sous Oracle

Question 2
Ecrivez une requête permettant de renvoyer le montant moyen des factures des clients qui ont comme
prénom Christophe.
Indice :

-- Résultat attendu --
----------------------
244,2
----------------------

Question 3
Ecrivez une requête permettant de renvoyer les numéros et les noms des clients ayant payé au moins une
facture supérieure à 100 euros.

Question 4
Ecrivez une requête permettant de renvoyer le montant total, le montant moyen et le nombre des factures
pour chaque client.
Indice :
Faites un regroupement sur les numéros de client.
-- Résultat attendu --
----------------------
488,4 244,2 2
25,9 25,9 1
----------------------

E. Interroger une base RO : Utilisation des tables imbriquées


Dans ce second exercice, vous expérimenterez la manipulation des collections implémentées sous forme
de tables imbriquées.

Question 1
Ecrivez une requête permettant de renvoyer le nombre de produits achetés par le client 2
Indice :
Il faut utiliser la pseudo-jointure TABLE() entre la table des factures et la table imbriquée des lignes
de facture.
SELECT ...
FROM obj_facture_tab f, TABLE(f.lignes) l
WHERE ...

Question 2
Ecrivez une requête permettant de renvoyer les numéros et noms des clients ayant payé au moins une
facture avec plus de 5 articles.
Indice :
Faites un regroupement sur les numéros et noms des clients.

Question 3
Quelle aurait été une solution plus élégante à la question précédente ? Proposez une implémentation de
cette solution en RO et une nouvelle requête utilisant cette solution.

S. Crozat - UTC 2009


49
Relationnel-objet sous Oracle

* *
*

Faites la synthèse de votre travail en reprenant les points méthodologiques les plus importants. Mettez en
perspective les apports du RO par rapport au relationnel classique, et éventuellement les inconvénients.
Que pensez vous de la complexité à écrire des méthodes et du gain que l'on obtient ensuite dans les
questions ?

S. Crozat - UTC 2009


50
EXEMPLES D'EXÉCUTION DE
IX
IX -

TRANSACTIONS SOUS ORACLE

Validation et annulation de transaction 61


Validation conditionnelle de transaction 62
Simulation de panne 63
Mises à jour concurrentes 63

Exécuter les opérations suivantes sous Oracle afin d'expérimenter le comportement des transactions.

A. Validation et annulation de transaction

CREATE TABLE TransTest (X number(1));


Table créée.

INSERT INTO TransTest VALUES (1);


1 ligne créée.

COMMIT;
Validation effectuée.

INSERT INTO TransTest VALUES (2);


1 ligne créée.

ROLLBACK;
Annulation (rollback) effectuée.

SELECT * FROM TransTest;


X
-----
1

B. Validation conditionnelle de transaction

CREATE TABLE TransTest (X number(1));


INSERT INTO TransTest VALUES (1);
INSERT INTO TransTest VALUES (1);
COMMIT;

S. Crozat - UTC 2009


51
Exemples d'exécution de transactions sous Oracle

SELECT * FROM TransTest;

DECLARE
 minX TransTest.X%TYPE;
BEGIN
 UPDATE TransTest SET X=X-1;
 SELECT min(X) INTO minX FROM TransTest;
 IF minX < 0 THEN
  ROLLBACK;
 ELSE
  COMMIT;
 END IF;
END;

SELECT * FROM TransTest;

Première exécution
X
---
1
2

Procédure PL/SQL terminée avec succès.

X
---
0
1

Seconde exécution
X
---
0
1

Procédure PL/SQL terminée avec succès.

X
---
0
1

C. Simulation de panne

CREATE TABLE TransTest (X number(1));


INSERT INTO TransTest VALUES (1);
COMMIT;

INSERT INTO TransTest VALUES (2);


SELECT * FROM TransTest;

DECLARE

S. Crozat - UTC 2009


52
Exemples d'exécution de transactions sous Oracle

 i number(5);
BEGIN
 i:=0;
 WHILE i=0 LOOP
  i:=0;
 END LOOP;
END;

COMMIT;

Exécution
Table créée.
1 ligne créée.
Validation effectuée.
1 ligne créée.
X
---
1
2
... Attente dans la boucle infinie ...
Simulation de panne (en brisant la connexion)

Vérification
SELECT * FROM TransTest;
X
---
1

D. Mises à jour concurrentes


Préparation
CREATE TABLE TransTest (X number(1));
INSERT INTO TransTest VALUES (1);
COMMIT;

Début exécution 1
UPDATE TransTest SET X=X+1 WHERE X=1;
1 ligne mise à jour.

SELECT * FROM TransTest;


X
---
2

Début exécution 2
SELECT * FROM TransTest;
X
---
1

UPDATE TransTest SET X=X+1 WHERE X=1;

S. Crozat - UTC 2009


53
Exemples d'exécution de transactions sous Oracle

-- ... Mise en attente ...

Fin exécution 1
COMMIT;
Validation effectuée.

Fin exécution 2
-- ... Reprise et exécution du UPDATE.
0 ligne(s) mise(s) à jour.
-- NB : X ne vaut plus 1, mais 2 après le COMMIT de la
première exécution

COMMIT;
Validation effectuée.

SELECT * FROM TransTest;


X
---
2

S. Crozat - UTC 2009


54