Professional Documents
Culture Documents
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
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.
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
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');
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));
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é
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');
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.
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);
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.
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
É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.
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
Financement à trouver.
L'escalade de Voir si Décathlon pourrait
2 l'Evrest Pierre Elelou en 2005 sponsoriser.
Recrutement des
3.1 équipes Barbara Stressée
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
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)
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".
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
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.
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
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.
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()
* *
*
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.
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.
Financement à trouver.
L'escalade de Voir si Décathlon pourrait
2 l'Evrest Pierre Elelou en 2005 sponsoriser.
Recrutement des
3.1 équipes Barbara Stressée
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
Écrivez dans un fichier texte les instructions LMD permettant d'initialiser la base de données avec les
données existantes.
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)
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
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.
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.
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.
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.
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.
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.
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;".
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.
Question 2
Vérifier que le code SQL LDD et LMD est adapté à une implémentation sous Oracle. Effectuez les
corrections nécessaires sinon.
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.
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;
Question 1
É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,
"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.
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.
Question 3
Écrire une requête SELECT qui utilise cette fonction pour présenter la liste des produits avec la demande.
Indice :
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 :
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;
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.
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.
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
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.
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).
Question 1
Initialiser les tables client et produit avec les données de votre choix (au moins deux clients et deux
produits).
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
-----------------------------------
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),
...)
);
...
end ;
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
----------------------
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
----------------------
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
----------------------
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.
* *
*
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 ?
Exécuter les opérations suivantes sous Oracle afin d'expérimenter le comportement des transactions.
COMMIT;
Validation effectuée.
ROLLBACK;
Annulation (rollback) effectuée.
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;
Première exécution
X
---
1
2
X
---
0
1
Seconde exécution
X
---
0
1
X
---
0
1
C. Simulation de panne
DECLARE
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ébut exécution 1
UPDATE TransTest SET X=X+1 WHERE X=1;
1 ligne mise à jour.
Début exécution 2
SELECT * FROM TransTest;
X
---
1
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.