Vous êtes sur la page 1sur 194

Bases de Données Avancées

UML et SQL 2/3

Thierry Hamon

Bureau H202
Institut Galilée - Université Paris 13
&
LIMSI-CNRS
hamon@limsi.fr
https://perso.limsi.fr/hamon/Teaching/P13/BDA-INFO2-2018-2019/

INFO2 – BDA

1/193
Plan
De UML à SQL 2/3, Objet-Relationnel, Orienté-Objet

Introduction
De UML à SQL2
(du conceptuel au relationnel étendu – objet-relationnel)
De UML à SQL3
(du conceptuel à l’orienté objet)
Conclusion

2/193
Conception, Développement, Utilisation, Administration

1 Etape conceptuelle : Conception et Modélisation de bases de


données
2 Etape logique : Implantation d’une base de données
3 Etape physique :
4 Logiciels (SGBD, Interfaces, ...) & Matériels

3/193
Modélisation de Bases de Données
Phase d’analyse : définition d’un schéma conceptuel
Schéma Conceptuel de Données (SCD) : selon le formalisme
utilisé,
ensemble d’Entités et d’Associations
ou
ensemble de Classes
Formalisme EA, ER

Formalisme UML :

4/193
Modélisation de Bases de Données

Différents formalismes de modélisation de schémas conceptuels de


BD :
Formalisme EA, ER, EER
Modèle Entité-Association (Entity-Relationship Model)
Modèle Entité-Association Etendu (Extended
Entity-Relationship Model
Formalisme UML (Unified Modelling Language)

5/193
Modèle Entité-Association
Rappel

Entité : tout concept concret ou abstrait individualisable


Classe ou type d’entités : regroupement d’entités de même
nature (niveau générique)
Association : relation liant plusieurs entités
Classe ou type d’associations) : regroupement d’associations
présentant les mêmes caractéristiques

6/193
Modèle entité-association étendu

Modèle entité-association : jeu de concept réduit mais


suffisant pour la modélisation de problèmes simples (ou peu
complexes)
Modèle Entité-association étendu : Modélisation plus précise
et plus expressive de problèmes complexes et de grande taille

Introduction de mécanismes d’abstraction


de classification
d’héritage
d’agrégation

7/193
Types faibles

Type d’entités ou d’associations faibles :


existence d’une instance subordonnée à l’existence d’un autre
type d’entité ou d’association

8/193
Classification

Regroupement d’entités dans des classes en fonction de


propriétés communes
Possibilité de classer un objet dans plusieurs classes
Exemple :
Livre électronique : fichier électronique, et livre
Autocar : véhicule de transport en commun, véhicule à
moteur à explosion

9/193
Héritage
Spécialisation - Généralisation
Un type d’ entité A est une spécialisation d’un autre type d’entité
B si
chaque entité de A est une entité de B
Une seule entité (au plus) de B est associé à une entité de A

10/193
Agrégation

Description de types d’entités complexes


Un type d’associations entre types d’entités est considéré comme
un nouveau type d’entités

11/193
Modélisation de Bases de Données
Les deux formalismes E/R et UML sont très proches /
 équivalents 

Entité/Association → UML
Entité Objet
Type d’entité Classe
Relation Objet
Type d’association Classe
Attribut/Propriété Propriété
Rôle / Label Rôle
Méthode

Domaine Contrainte de domaine


Clé Contrainte de clé
Contrainte Contrainte
Cardinalité Multiplicité/Cardinalité
0,1 1,1 0,n 1,n a,b a,a 0..1 1 0..* 1..* a..b a
Diagramme E/A Diagramme de Classe UML

12/193
De EA à SQL

Objectifs :
Implantation d’un schéma conceptuel (SCD) dans un BD
relationnelle
Exploitation du SCD par le SGBD et les modules de
programmation
→ Transformation dans un schéma relationnel : Schéma Logique
de Données (SLD)

13/193
De EA à SQL
Exemple de schéma conceptuel EA (SCD)

14/193
De EA à SQL
Exemple de schéma logique (schéma relationnel) SLD

R1 ENT 2 ( B1 , B2 , B3 )
R2 ENT 1 ( A1 , A2 , B1 ∗ )
R3 ENT 3 ( C1 , C2 )
R4 ENT 4 ( D1 )
R5 ASSOC 6 ( B1 ∗ , C1 ∗ , D1 ∗ , X1 )

15/193
Règles de passage
du modèle Entité-Association au modèle Relationnel

Tout type d’entité E est traduit en une relation R


La clé primaire de R est l’identifiant de E
Les attributs de R sont ceux de E.
Tout type d’association est traduit :
en une clé étrangère dans une relation existante si la
cardinalité est du type 1,1 ou 0,1
en une nouvelle relation si aucune cardinalité n’est du type 1,1
ou 0,1 (elles sont toutes du type 0,n ou 1,n)
Plusieurs algorithmes sont possibles selon l’interprétation de la
cardinalité minimale égale à 0.

16/193
De UML à SQL
Traduction des associations binaires
Traduction des associations binaires récursives

Traduction des associations n-aires (n > 2)

Traduction des associations d’héritage


Traduction des contraintes d’héritage

Traduction des associations d’agrégation

Traduction des contraintes d’intégrité fonctionnelles


(contraintes : Partition, Exclusion, Totalité, Simultanéité,
Inclusion)

17/193
Intégrité des données (1)

Les SGBD prennent en compte l’intégrité des données définies via


la déclaration de contraintes (constraints)
la programmation de
fonctions (functions)
de procédures (procedures) cataloguées
de paquetages (packages)
de déclencheurs (triggers)
Le principe étant d’assurer la cohérence de la base après chaque
mise à jour par les commandes insert, update ou delete

18/193
Intégrité des données (2)
Notation utilisée concernant les noms des contraintes :
la contrainte clé primaire d’une table se nomme pk table
la contrainte clé étrangère d’une table se nomme
fk table1 colonne table2
la contrainte de validité d’une colonne se nomme
ck table colonne
la contrainte de type non nulle sur une colonne se nomme
nn table colonne
la contrainte de type unique sur une colonne se nomme
unique table colonne

19/193
Traduction des associations binaires (1)
Association du type 1-1

REM ∗∗∗ Un s t a g e e s t e f f e c t u é p a r au p l u s un é t u d i a n t

c r e a t e t a b l e STAGE
( NUMEROS number ( 7 ) ,
NOMENTREPRISE v a r c h a r ( 4 0 ) ,
TELENT v a r c h a r ( 1 5 ) ,
ADRENT v a r c h a r ( 5 0 ) ,
c o n s t r a i n t PK STAGE p r i m a r y key (NUMEROS)
);

20/193
Traduction des associations binaires (2)
Association du type 1-1
REM ∗∗∗ Un é t u d i a n t e f f e c t u e o b l i g a t o i r e m e n t un s t a g e u n i q u e

c r e a t e t a b l e ETUDIANT
( NUMEROE number ( 7 ) ,
NOM v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE date ,
SEXE c h a r ( 1 ) ,
NUMEROS number ( 7 ) ,
c o n s t r a i n t PK ETUDIANT p r i m a r y key (NUMEROE) ,
c o n s t r a i n t FK ETUDIANT NUMEROS STAGE f o r e i g n key (NUMEROS)
r e f e r e n c e s STAGE(NUMEROS) ,
c o n s t r a i n t CK ETUDIANT SEXE c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) ) ,

−−
c o n s t r a i n t NN ETUDIANT NUMEROS c h e c k (NUMEROS i s no t n u l l ) ,
c o n s t r a i n t UNIQUE ETUDIANT NUMEROS u n i q u e (NUMEROS)
);

21/193
Traduction des associations binaires (1)
Association du type 1-N

REM ∗∗∗ Une p e r s o n n e p e u t p o s s é d e r p l u s i e u r s voitures

c r e a t e t a b l e PERSONNE
(
NUMEROP number ( 7 ) ,
NOM v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE date ,
SEXE c h a r ( 1 ) ,
c o n s t r a i n t PK PERSONNE p r i m a r y key (NUMEROP)
);

22/193
Traduction des associations binaires (2)
Association du type 1-N

REM ∗∗∗ Une v o i t u r e e s t o b l i g a t o i r e m e n t p o s s é d é e p a r une p e r s o n n e

c r e a t e t a b l e VOITURE
(
NUMIMMAT v a r c h a r ( 1 5 ) ,
MARQUE v a r c h a r ( 2 0 ) ,
TYPE v a r c h a r ( 3 0 ) ,
NUMEROP number ( 7 ) ,
c o n s t r a i n t PK VOITURE p r i m a r y key (NUMIMMAT) ,
c o n s t r a i n t FK VOITURE NUMEROP PERSONNE f o r e i g n key (NUMEROP)
r e f e r e n c e s PERSONNE(NUMEROP) ,

−−
c o n s t r a i n t NN VOITURE NUMEROP c h e c k (NUMEROP i s no t n u l l )
);

23/193
Traduction des associations binaires (1)
Association du type N-N

REM ∗∗∗ Une p e r s o n n e p e u t c r é e r plusieurs entreprises

c r e a t e t a b l e PERSONNE
(
NUMEROP number ( 7 ) ,
NOMP v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE date ,
SEXE c h a r ( 1 ) ,
c o n s t r a i n t PK PERSONNE p r i m a r y key (NUMEROP)
);

24/193
Traduction des associations binaires (2)
Association du type N-N

REM ∗∗∗ Une e n t r e p r i s e d o i t ê t r e c r é é e


REM p a r une ou p l u s i e u r s p e r s o n n e s

c r e a t e t a b l e ENTREPRISE
(
NSIRET v a r c h a r ( 2 0 ) ,
NOME v a r c h a r ( 2 0 ) ,
STATUTJUR v a r c h a r ( 1 0 ) ,
c o n s t r a i n t PK ENTREPRISE primary key ( NSIRET )
);

25/193
Traduction des associations binaires (3)
Association du type N-N
c r e a t e t a b l e CREER
(
NUMEROP number ( 7 ) ,
NSIRET v a r c h a r ( 2 0 ) ,
DATECREATION date ,
c o n s t r a i n t PK CREER p r i m a r y key (NUMEROP, NSIRET ) ,
c o n s t r a i n t FK CREER NUMEROP PERSONNE
f o r e i g n key (NUMEROP)
r e f e r e n c e s PERSONNE(NUMEROP) ,
c o n s t r a i n t FK CREER NSIRET ENTREPRISE
f o r e i g n key ( NSIRET )
r e f e r e n c e s ENTREPRISE ( NSIRET )
);
La cardinalité minimale de l’association créer pourra être testée par
l’intermédiaire d’une procédure PL/SQL

26/193
Traduction des associations binaires (1)
Association du type Réflexif/Récursif, UML ∼ EA

c r e a t e t a b l e PERSONNES
(
NUMERO number ( 7 ) , NOM v a r c h a r ( 1 5 ) , PRENOM v a r c h a r ( 1 5 ) ,
DATENAISSANCE date , SEXE c h a r ( 1 ) , PERE number ( 7 ) ,
MERE number ( 7 ) ,
c o n s t r a i n t PK PERSONNES p r i m a r y key (NUMERO) ,
c o n s t r a i n t FK PERSONNES PERE PERSONNES f o r e i g n key (PERE)
r e f e r e n c e s PERSONNES ,
c o n s t r a i n t FK PERSONNES MERE PERSONNES f o r e i g n key (MERE)
r e f e r e n c e s PERSONNES ,
c o n s t r a i n t CK SEXE PERSONNES c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
);

27/193
Traduction des associations binaires (2)
Association du type Réflexif/Récursif, UML ∼ EA

c r e a t e t a b l e PRODUITS
(
NUMERO number ( 3 ) , NOM v a r c h a r ( 1 5 ) , QSTOCK number ( 5 ) ,
c o n s t r a i n t PK PRODUITS p r i m a r y key (NUMERO) ,
c o n s t r a i n t CK QSTOCK PRODUITS c h e c k (QSTOCK >= 0 )
);

28/193
Traduction des associations binaires (3)
Association du type Réflexif/Récursif, UML ∼ EA

c r e a t e t a b l e NOMENCLATURE
(
COMPOSER number ( 3 ) , COMPOSANT number ( 3 ) , QFABR number ( 5 ) ,
c o n s t r a i n t PK NOMENCLATURE p r i m a r y key (COMPOSER, COMPOSANT) ,
c o n s t r a i n t FK NOMENCL COMPOSER PRODUITS f o r e i g n key (COMPOSER)
r e f e r e n c e s PRODUITS ,
c o n s t r a i n t FK NOMENCL COMPOSANT PRODUITS f o r e i g n key (COMPOSANT)
r e f e r e n c e s PRODUITS ,
c o n s t r a i n t CK QFABR NOMENCLATURE c h e c k (QFABR >= 0 )
);

→ Définition de requêtes récursives

29/193
Traduction des associations d’héritage
Traduction des contraintes d’héritage

Gestion du personnel dans une université

30/193
Associations d’héritage dans UML (1)

Recensement des différents cas d’héritage en fonction des


instances
Modélisation des différents héritages, dans le formalisme
UML, à l’aide des contraintes
partition
exclusion
totalité

31/193
Associations d’héritage dans UML (2)
Expression des cas d’héritage à l’aide de
couverture
disjonction
d’instances dans une population donnée

Quatre type de contraintes sont recensés :


partition
totalité
exclusion
absence de contrainte

32/193
Contraintes d’héritages PARTITION et TOTALITE
Disjonction & Couverture → Partition
Non-Disjonction & Couverture → Totalité

33/193
Contraintes d’héritages EXCLUSION et ABSENCE DE
CONTRAINTE
Disjonction & Non-Couverture → Exclusion
Non-Disjonction & Non-Couverture → Absence de contrainte

34/193
Exemple (1)
Gestion du personnel dans une université

Couverture + Disjonction → Partition

Personnel (P) est égal à l’Union de Enseignant (EC) et de


BIATOS (B) et l’Intersection de EC et de B est Vide

Couverture + Non-Disjonction → Totalité

Personnel (P) est égal à l’Union de Enseignant (EC) et de


BIATOS (B) et l’Intersection de EC et de B n’est pas Vide

35/193
Exemple (2)
Gestion du personnel dans une université

Non-Couverture + Disjonction → Exclusion

L’Union de Enseignant (EC) et de BIATOS (B) est incluse


dans P et l’Intersection de EC et de B est Vide

Non-Couverture + Non-Disjonction → Absence de contraintes

L’Union de Enseignant (EC) et de BIATOS (B) est incluse


dans P et l’Intersection de EC et de B n’est pas Vide

36/193
Transformation des associations d’héritage

Traduction d’une association d’héritage en fonction des contraintes


de l’association d’héritage
→ 3 familles de décomposition :
Décomposition par distinction
Décomposition descendante (push-down)
Décomposition ascendante (push-up)

37/193
Décomposition par distinction
Transformation de chaque sous-classe en une relation
Migration de la clé primaire de la sur-classe dans la ou les
relations issues des sous-classes
La clé primaire de la sur-classe devient à la fois clé primaire et
clé étrangère
Distinction
PERSONNEL( Numéro , Nom, Prénom ,
DateNaissance , Sexe )

ENSEIGNANT( Numéro ∗ ,
Echelon ,
I n d i c e , S p é c i a l i t é )

BIATOS ( Numéro ∗ , DateEmbauche ,


Service )

38/193
Décomposition descendante

Deux cas possibles selon la contrainte d’héritage :


Contrainte de totalité ou de partition sur l’association :
Possibilité de ne pas traduire la relation issue de la sur-classe
→ Migration de tous les attributs dans la ou les relations
issues de la ou des sous-classes
Sinon : Migration de tous les attributs dans la ou les relations
issues de la ou des sous-classes
→ Duplication des données

39/193
Décomposition descendante
Exemple

Contrainte de partition :
Aucun personnel ne peut être à la fois enseignant et BIATOS
Il n’existe pas non plus un personnel n’étant ni enseignant ni
biatos.
Descendante
ENSEIGNANT( Numéro ,
Nom, Prénom , D a t e N a i s s a n c e ,
Sexe , E c h e l o n , I n d i c e ,
S p é c i a l i t é )

BIATOS ( Numéro , Nom, Prénom ,


D a t e N a i s s a n c e , Sexe ,
DateEmbauche , S e r v i c e )

40/193
Décomposition ascendante

Suppression de la ou les relations issues de la ou des


sous-classes
Migration des attributs dans la relation issue de la sur-classe
Exemple : (absence de contrainte)
Ascendante
PERSONNEL( Numéro , Nom, Prénom ,
D a t e N a i s s a n c e , Sexe ,
Echelon , I n d i c e ,
S p é c i a l i t é ,
DateEmbauche , S e r v i c e )

41/193
Transformation des associations d’héritage multiple
Mêmes règles ; plusieurs possibilités
Exemple : (décomposition ascendante)
Contrainte d’exclusion sur enseignant et BIATOS

PERSONNEL( Numéro , Nom, Prénom ,


DateNaissance , Sexe )

ENSEIGNANT ( Numéro ∗ ,
E c h e l o n , I n d i c e , S p é c i a l i t é ,
DateDébutStage , D a t e F i n S t a g e )

BIATOS ( Numéro ∗ , DateEmbauche ,


Service ,
DateDébutStage , D a t e F i n S t a g e )

42/193
Transformation des associations d’héritage en SQL 2
Exemple

Gestion du personnel dans une université

43/193
Transformation des associations d’héritage
Décomposition par distinction
Distinction
PERSONNEL( Numéro , Nom, Prénom ,
DateNaissance , Sexe )

ENSEIGNANT( Numéro ∗ ,
Echelon ,
I n d i c e , S p é c i a l i t é )

BIATOS ( Numéro ∗ , DateEmbauche ,


Service )
REM ∗∗∗ Un p e r s o n n e l à l ’ U n i v e r s i t é

c r e a t e t a b l e PERSONNEL
( NUMERO number ( 7 ) ,
NOM v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE d a t e ,
SEXE c h a r ( 1 ) ,
c o n s t r a i n t PK PERSONNEL p r i m a r y k e y (NUMERO) ,
c o n s t r a i n t CK SEXE PERSONNEL c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
);

44/193
Transformation des associations d’héritage
Décomposition par distinction
REM ∗∗∗ P e r s o n n e l e n s e i g n a n t

c r e a t e t a b l e ENSEIGNANT
( NUMERO number ( 7 ) , ECHELON number ( 2 ) ,
INDICE number ( 5 ) , SPECIALITE v a r c h a r ( 2 0 ) ,
c o n s t r a i n t PK ENSEIGNANT p r i m a r y key (NUMERO) ,
c o n s t r a i n t FK ENS PERS f o r e i g n key (NUMERO)
r e f e r e n c e s PERSONNEL
);
REM ∗∗∗ P e r s o n n e l BIATOS ( I n g , Adm, Tech , Ouv , S e r v )

c r e a t e t a b l e BIATOS
( NUMERO number ( 7 ) , DATEEMBAUCHE date ,
SERVICE v a r c h a r ( 2 0 ) ,
c o n s t r a i n t PK BIATOS p r i m a r y key (NUMERO) ,
c o n s t r a i n t FK BIATOS PERS f o r e i g n key (NUMERO)
r e f e r e n c e s PERSONNEL
);

45/193
Transformation des associations d’héritage
Décomposition descendante
Descendante
ENSEIGNANT( Numéro ,
Nom, Prénom , D a t e N a i s s a n c e ,
Sexe , E c h e l o n , I n d i c e ,
S p é c i a l i t é )

BIATOS ( Numéro , Nom, Prénom ,


D a t e N a i s s a n c e , Sexe ,
DateEmbauche , S e r v i c e )

REM ∗∗∗ P e r s o n n e l e n s e i g n a n t

c r e a t e t a b l e ENSEIGNANT
( NUMERO number ( 7 ) , NOM v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) , DATENAISSANCE date ,
SEXE c h a r ( 1 ) , ECHELON number ( 2 ) ,
INDICE number ( 5 ) , SPECIALITE v a r c h a r ( 2 0 ) ,
c o n s t r a i n t CK SEXE ENSEIGNANT c h e c k
( SEXE i n ( ’M’ , ’ F ’ ) )
c o n s t r a i n t PK ENSEIGNANT p r i m a r y key (NUMERO)
);

46/193
Transformation des associations d’héritage
Décomposition descendante
Descendante
ENSEIGNANT( Numéro ,
Nom, Prénom , D a t e N a i s s a n c e ,
Sexe , E c h e l o n , I n d i c e ,
S p é c i a l i t é )

BIATOS ( Numéro , Nom, Prénom ,


D a t e N a i s s a n c e , Sexe ,
DateEmbauche , S e r v i c e )

REM ∗∗∗ P e r s o n n e l BIATOS

c r e a t e t a b l e BIATOS
( NUMERO number ( 7 ) , NOM v a r c h a r ( 1 0 ) , PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE date , SEXE c h a r ( 1 ) , DATEEMBAUCHE date ,
SERVICE v a r c h a r ( 2 0 ) ,
c o n s t r a i n t CK SEXE BIATOS c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
c o n s t r a i n t PK BIATOS p r i m a r y key (NUMERO)
);

46/193
Transformation des associations d’héritage
Décomposition ascendante
Ascendante
PERSONNEL( Numéro , Nom, Prénom ,
D a t e N a i s s a n c e , Sexe ,
Echelon , I n d i c e ,
S p é c i a l i t é ,
DateEmbauche , S e r v i c e )

REM ∗∗∗ P e r s o n n e l

c r e a t e t a b l e PERSONNEL
( NUMERO number ( 7 ) , NOM v a r c h a r ( 1 0 ) , PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE date , SEXE c h a r ( 1 ) , ECHELON number ( 2 ) ,
INDICE number ( 5 ) , SPECIALITE v a r c h a r ( 2 0 ) ,
DATEEMBAUCHE date , SERVICE v a r c h a r ( 2 0 ) ,
c o n s t r a i n t CK SEXE PERSONNEL c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
c o n s t r a i n t PK PERSONNEL p r i m a r y key (NUMERO)
);

47/193
Traduction des contraintes d’héritage
Décomposition par distinction

→ Contrainte de partition
Contrainte de totalité
Contrainte d’exclusion
Sans Contrainte
Contraintes d’héritage :
(Contrainte A) Il n’existe pas de personnel à la fois enseignant
et BIATOS
(Contrainte B) Il n’existe pas de personnel ni enseignant ni
BIATOS

48/193
Traduction des contraintes d’héritage
Décomposition par distinction
Implémentation de la contrainte A : 2 déclencheurs
REM ∗∗∗ D é c l e n c h e u r s u r ENSEIGNANT

c r e a t e o r r e p l a c e t r i g g e r TRIG ENSEIGNANT
b e f o r e i n s e r t o r u p d a t e o f NUMERO on ENSEIGNANT
f o r e a c h row
declare
num number ;
begin
s e l e c t NUMERO INTO num
from BIATOS where NUMERO = : new .NUMERO;
r a i s e a p p l i c a t i o n e r r o r ( −20001 , ’ Le p e r s o n n e l ’ | |
t o c h a r ( num ) | | ’ e s t d é j à BIATOS ! ! ! ’ ) ;
exception
when n o d a t a f o u n d t h e n n u l l ;
end ;
/

49/193
Traduction des contraintes d’héritage
Décomposition par distinction

REM ∗∗∗ D é c l e n c h e u r s u r BIATOS

c r e a t e o r r e p l a c e t r i g g e r TRIG BIATOS
b e f o r e i n s e r t o r u p d a t e o f NUMERO on BIATOS
f o r e a c h row
declare
num number ;
begin
s e l e c t NUMERO INTO num
from ENSEIGNANT where NUMERO = : new .NUMERO;
r a i s e a p p l i c a t i o n e r r o r ( −20001 , ’ Le p e r s o n n e l ’ ||
t o c h a r ( num ) | | ’ e s t d é j à e n s e i g n a n t ! ! ! ’ ) ;
exception
when n o d a t a f o u n d t h e n n u l l ;
end ;
/

50/193
Traduction des contraintes d’héritage
Décomposition par distinction
Implémentation de la contrainte B :
procédures cataloguées (Insertion, Suppression)
déclencheurs (Modification)
REM ∗∗∗ A j o u t d ’ un E n s e i g n a n t

c r e a t e o r r e p l a c e p r o c e d u r e AJOUT ENSEIGNANT
(NUM number , NOM v a r c h a r , PREN v a r c h a r , DNAIS d a t e ,
SEXE v a r c h a r , ECHEL number , IND number , SPEC v a r c h a r ) i s
begin
i n s e r t i n t o PERSONNEL v a l u e s (NUM, NOM, PREN , DNAIS , SEXE ) ;
i n s e r t i n t o ENSEIGNANT v a l u e s
(NUM, ECHEL , IND , SPEC ) ;
end ;
/

51/193
Traduction des contraintes d’héritage
Décomposition par distinction

REM ∗∗∗ A j o u t d ’ un BIATOS

c r e a t e o r r e p l a c e p r o c e d u r e AJOUT BIATOS
(NUM number , NOM v a r c h a r , PREN v a r c h a r , DNAIS d a t e ,
SEXE v a r c h a r , DEMB d a t e , SERV v a r c h a r ) i s
begin
i n s e r t i n t o PERSONNEL v a l u e s (NUM, NOM, PREN , DNAIS , SEXE ) ;
i n s e r t i n t o BIATOS v a l u e s (NUM, DEMB, SERV ) ;
end ;
/

52/193
Traduction des contraintes d’héritage
Décomposition par distinction
REM ∗∗∗ S u p p r e s s i o n d ’ un E n s e i g n a n t

c r e a t e o r r e p l a c e p r o c e d u r e SUPPR ENSEIGNANT
(NUM number ) i s
begin
d e l e t e from ENSEIGNANT w h e r e NUMERO = num ;
d e l e t e from PERSONNEL w h e r e NUMERO = num ;
end ;
/
REM ∗∗∗ S u p p r e s s i o n d ’ un BIATOS

c r e a t e o r r e p l a c e p r o c e d u r e SUPPR BIATOS
(NUM number ) i s
begin
d e l e t e from BIATOS w h e r e NUMERO = num ;
d e l e t e from PERSONNEL w h e r e NUMERO = num ;
end ;
/

53/193
Traduction des contraintes d’héritage
Décomposition par distinction

REM ∗∗∗ D é c l e n c h e u r p o u r l a r é p e r c u s s i o n de l a m o d i f i c a t i o n
REM ∗∗∗ du numéro du PERSONNEL v e r s ENSEIGNANT e t BIATOS

c r e a t e o r r e p l a c e t r i g g e r TRIG ENSBIATOS
b e f o r e u p d ate o f NUMERO on PERSONNEL
f o r e a c h row
begin
begin
u p d a te ENSEIGNANT
s e t NUMERO = : new .NUMERO
where NUMERO = : o l d .NUMERO;
exception
when n o d a t a f o u n d t h e n n u l l ;
end ;
u p d a t e BIATOS
s e t NUMERO = : new .NUMERO
where NUMERO = : o l d .NUMERO;
exception
when n o d a t a f o u n d t h e n n u l l ;
end ;
/

54/193
Traduction des contraintes d’héritage
Utilisation

REM ∗∗∗∗∗∗ I n s e r t i o n s d e s d o n né e s s o u s SQLPLUS


REM ∗∗∗∗∗∗ Lancement d e s p r o c é d u r e s

select ’ I n s e r t i o n d e s d o n n é e s ’ from d u a l ;
PAUSE

e x e c u t e AJOUT ENSEIGNANT ( 1 , ’ TRAIFOR ’ , ’ C lé m e n t ’ ,


’ 17−09−1958 ’ , ’M’ , 6 , 7 8 0 , ’BD ’ ) ;
e x e c u t e AJOUT ENSEIGNANT ( 2 , ’ TRAIFOR ’ , ’ C l é m e n t i n e ’ ,
’ 22−11−1969 ’ , ’F ’ , 6 , 7 8 0 , ’ IA ’ ) ;

e x e c u t e AJOUT BIATOS ( 3 , ’FAITOUT ’ , ’ A l e x ’ ,


’ 16−10−1960 ’ , ’M’ , ’ 01−01−2002 ’ , ’ C o m m e r c i a l ’ ) ;

PAUSE

s e l e c t ∗ from PERSONNEL ;
s e l e c t ∗ from ENSEIGNANT ;
s e l e c t ∗ from BIATOS ;
PAUSE

55/193
Traduction des contraintes d’héritage
Décomposition par distinction
→ Contrainte de totalité

Contraintes d’héritage :
(Contrainte B) Il n’existe pas de personnel ni enseignant ni BIATOS
(Contrainte C) Il peut exister un personnel à la fois enseignant et
BIATOS
Implémentation :
Contrainte B : voir ci-dessus
Contrainte C : équivaut à ne pas programmer la contrainte A
précédente
⇒ Pas de mise en œuvre les déclencheurs des tables ENSEIGNANT et
BIATOS : TRIG_ENSEIGNANT, TRIG_BIATOS

56/193
Traduction des contraintes d’héritage
Décomposition par distinction
→ Contrainte d’exclusion

Contraintes d’héritage :
(Contrainte A) Il n’existe pas de personnel à la fois enseignant et
BIATOS
(Contrainte D) Il peut exister un personnel ni enseignant ni BIATOS
Implémentation :
Contrainte A: voir ci-dessus
Contrainte D : équivaut à ne pas programmer la contrainte B
précédente
⇒pas de mise en œuvre les quatre procédures (ajout et suppression)
et le déclencheur TRIG_ENSBIATOS

57/193
Traduction des contraintes d’héritage
Décomposition par distinction

→ Sans Contrainte

Aucune contrainte n’est à programmer !

58/193
Traduction des contraintes d’héritage
Décomposition descendante
Descendante
ENSEIGNANT( Numéro ,
Nom, Prénom , D a t e N a i s s a n c e ,
Sexe , E c h e l o n , I n d i c e ,
S p é c i a l i t é )

BIATOS ( Numéro , Nom, Prénom ,


D a t e N a i s s a n c e , Sexe ,
DateEmbauche , S e r v i c e )

Contrainte de partition ? → aucun personnel ne peut être à la


fois enseignant et iatos et il n’existe pas non plus un personnel
n’étant ni enseignant ni iatos
Contrainte de totalité ?
Contrainte d’exclusion ? → il faudrait la table personnel pour
les personnels non enseignant et non BIATOS
Sans contrainte !

59/193
Traduction des contraintes d’héritage
Décomposition ascendante

→ Contrainte de partition
Contrainte de totalité
Contrainte d’exclusion
Sans Contrainte
Contraintes d’héritage :
(Contrainte A) Il n’existe pas de personnel à la fois enseignant
et BIATOS
(Contrainte B) Il n’existe pas de personnel ni enseignant ni
BIATOS

60/193
Traduction des contraintes d’héritage
Décomposition ascendante

Implémentation des contraintes A et B :


au niveau de la table personnel
à l’aide des contraintes de type CHECK

Contrainte A :
Vérifier que les colonnes ECHELON, INDICE, SPECIALITE,
DATEEMBAUCHE et SERVICE ne soient pas toutes initialisées
Contrainte B :
Vérifier que les colonnes ECHELON, INDICE, SPECIALITE,
DATEEMBAUCHE et SERVICE ne soient pas toutes nulles

61/193
Traduction des contraintes d’héritage
Décomposition ascendante
REM ∗∗∗∗ CONTRAINTE A

a l t e r t a b l e PERSONNEL
add c o n s t r a i n t CK CONTRAINTE A
check (
(ECHELON i s n u l l and INDICE i s n u l l and
SPECIALITE i s n u l l )
o r (DATEEMBAUCHE i s n u l l and SERVICE i s n u l l )
);
REM ∗∗∗∗ CONTRAINTE B

a l t e r t a b l e PERSONNEL
add c o n s t r a i n t CK CONTRAINTE B
check (
(ECHELON i s no t n u l l o r INDICE i s no t n u l l o r
SPECIALITE i s no t n u l l )
or (DATEEMBAUCHE i s no t n u l l o r SERVICE i s no t n u l l )
);

62/193
Traduction des contraintes d’héritage
Décomposition ascendante

→ Contrainte de totalité
Contraintes d’héritage :
(Contrainte B) Il n’existe pas de personnel ni enseignant ni
BIATOS
(Contrainte C) Il peut exister un personnel à la fois enseignant
et BIATOS

63/193
Traduction des contraintes d’héritage
Décomposition ascendante
→ Contrainte de totalité
Contrainte B : voir ci-dessus
Contrainte C : Suppression ou désactiver la contrainte A
précédente (DROP CONSTRAINT ou
DISABLE CONSTRAINT)

DROP CONSTRAINT : en cas de réactivation de la


contrainte, il est nécessaire de la recréer
(ADD CONSTRAINT)
DISABLE CONSTRAINT : en cas de réactivation de la
contrainte, il faut simplement la réactiver avec la requête
ENABLE CONSTRAINT

64/193
Traduction des contraintes d’héritage
Décomposition ascendante

→ Contrainte de totalité
REM La c o n t r a i n t e C r e v i e n t à f a i r e l a
REM D é s a c t i v a t i o n de l a CONTRAINTE A

a l t e r t a b l e PERSONNEL
d i s a b l e c o n s t r a i n t CK CONTRAINTE A ;

65/193
Traduction des contraintes d’héritage
Décomposition ascendante

→ Contrainte d’exclusion

Contrainte d’héritage :
Contrainte A → Réactivation de la contrainte A en supprimant
au préalable les tuples ne répondant pas à cette contrainte
Non-contrainte B → Désactivation de la contrainte B

66/193
Traduction des contraintes d’héritage
Décomposition ascendante

→ Contrainte d’exclusion
REM ∗∗∗∗∗ R é a c t i v a t i o n de l a CONTRAINTE A
a l t e r t a b l e PERSONNEL
e n a b l e c o n s t r a i n t CK CONTRAINTE A ;

REM ∗∗∗∗∗ D é s a c t i v a t i o n de l a CONTRAINTE B


a l t e r t a b l e PERSONNEL
d i s a b l e c o n s t r a i n t CK CONTRAINTE B ;

67/193
Traduction des contraintes d’héritage
Décomposition ascendante

→ Sans Contrainte

Aucune contrainte de type CHECK n’est à programmer !

68/193
Récursivité

Sous Oracle,
possibilité de représentation et de manipulation
de données ayant une structure de données récursive (arbre)
par une représentation tabulaire et avec la commande SQL :

SELECT . . . FROM . . . WHERE . . .


CONNECT BY PRIOR c o l o n n e o p é r a t e u r c o l o n n e
[CONNECT BY c o l o n n e o p é r a t e u r PRIOR c o l o n n e ]
START WITH . . .
LEVEL . . .

69/193
Exemples de parcours de
structure de données de type récursif
Structures de données récursives de type Arbres
Exemples :
Arbre Généalogique
Nomenclature d’un produit (Composé, Composant)
Oracle offre la commande CONNECT BY
SELECT . . . FROM . . . WHERE . . .
CONNECT BY PRIOR c o l o n n e o p é r a t e u r c o l o n n e
CONNECT BY c o l o n n e o p é r a t e u r PRIOR c o l o n n e
START WITH
LEVEL

70/193
Structures hiérarchiques, arborescentes
Arbre Généalogique

Oracle permet la représentation et la manipulation des données


ayant une structure arborescente par le modèle relationnel

c r e a t e t a b l e PERSONNES (
NUMERO number ( 7 ) , NOM v a r c h a r ( 1 5 ) , PRENOM v a r c h a r ( 1 5 ) ,
DATENAISSANCE date , SEXE c h a r ( 1 ) , PERE number ( 7 ) , MERE number ( 7 ) ,
c o n s t r a i n t PK PERSONNES p r i m a r y key (NUMERO) ,
c o n s t r a i n t FK PERSONNES PERE PERSONNES f o r e i g n key (PERE) r e f e r e n c e s PERSONNES ,
c o n s t r a i n t FK PERSONNES MERE PERSONNES f o r e i g n key (MERE) r e f e r e n c e s PERSONNES ,
c o n s t r a i n t CK SEXE PERSONNES c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) ) );

71/193
Exemple de requête récursive

Recherche des ancêtres d’une personne


s e l e c t d i s t i n c t NUMERO, NOM, PRENOM,
DATENAISSANCE from PERSONNES
connect by p r i o r PERE=NUMERO o r
p r i o r MERE=NUMERO
s t a r t w i t h NUMERO=&num ;

72/193
Conclusion / Bilan

Aucune des solutions ne constitue la panacée.

Il faut mesurer les performances des requêtes.

Voir aussi le type de requêtes

73/193
Transformation des associations d’héritage en SQL 3
Héritage de types
Existe depuis la version 9.1 d’Oracle (novembre 2001)
Uniquement héritage de type
Pas d’héritage multiple

Un type peut hériter d’un seul autre type (sur-type)


Un sur-type peut permettre de définir plusieurs sous-types
Chaque sous-type est spécialisé par rapport au sur-type qui est
dit plus général

Mécanisme d’héritage automatiquement répercuté au niveau


des tables objet à par du moment où les types définissant les
tables sont issus eux-mêmes d’une hiérarchie d’héritage
Héritage de tables ?

74/193
Héritage de types

Définition d’un personnel à l’Université


−−− ∗∗∗ C r é a t i o n du t y p e de l a s u r −c l a s s e
c r e a t e t y p e PERSONNEL TYPE AS OBJECT
(
NUMERO number ( 7 ) ,
NOM v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE date ,
SEXE c h a r ( 1 )
)
NOT FINAL /∗ p e u t i n c l u r e d e s s o u s c l a s s e s ∗/
/

75/193
Héritage de types

Définition d’un enseignant


−−− ∗∗∗ C r é a t i o n du t y p e de l a s o u s −c l a s s e
c r e a t e t y p e ENSEIGNANT TYPE UNDER PERSONNEL TYPE
(
ECHELON number ( 2 ) ,
INDICE number ( 5 ) ,
SPECIALITE v a r c h a r ( 2 0 )
)
FINAL
/

76/193
Création des tables objet et contraintes
Création de tables objet en fonctions des types précédemment
définis
Aucune directive ne précise l’héritage : il est induit par la
hiérarchie de type existante
−−− ∗∗∗ P e r s o n n e l de l ’ u n i v e r s i t é
c r e a t e t a b l e PERSONNEL OF PERSONNEL TYPE
(
c o n s t r a i n t PK PERSONNEL p r i m a r y key (NUMERO) ,
c o n s t r a i n t CK SEXE PERSONNEL c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
);
−−− ∗∗∗ P e r s o n n e l e n s e i g n a n t
c r e a t e t a b l e ENSEIGNANT OF ENSEIGNANT TYPE ;

IMPORTANT : les contraintes ne sont définies que dans la table


personnel

77/193
Création des tables objet et contraintes
Illustration
NB : Les contraintes ne sont définies que dans la table personnel
→ On hérite d’un type

Insertion des données dans la table personnel :


i n s e r t i n t o p e r s o n n e l v a l u e s ( 1 , ’B ’ , ’ F ’ , ’ 17−09−2004 ’ , ’M’ ) ;
i n s e r t i n t o p e r s o n n e l v a l u e s ( 1 , ’B ’ , ’ F ’ , ’ 17−09−2004 ’ , ’M’ ) ;

ERREUR à l a l i g n e 1 :

ORA−00001: v i o l a t i o n de c o n t r a i n t e u n i q u e (FB . PK PERSONNEL)

s e l e c t ∗ from p e r s o n n e l ;
NUMERO NOM PRENOM DATENAISSA S
−−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −
1 B F 17−09−2004 M

78/193
Création des tables objet et contraintes
Illustration

NB : Les contraintes ne sont définies que dans la table personnel


→ On hérite d’un type

Insertion des données dans la table enseignant :


i n s e r t i n t o e n s e i g n a n t v a l u e s ( 7 , ’B ’ , ’ F ’ , ’ 17−09−2004 ’ , ’M’ , 2 , 7 8 0 , ’BD ’ ) ; 1 ligne
i n s e r t i n t o e n s e i g n a n t v a l u e s ( 7 , ’B ’ , ’ F ’ , ’ 17−09−2004 ’ , ’M’ , 2 , 7 8 0 , ’BD ’ ) ; 1 ligne
i n s e r t i n t o e n s e i g n a n t v a l u e s ( 8 , ’B ’ , ’D ’ , ’ 17−10−2004 ’ , ’M’ , 2 , 7 8 0 , ’BD ’ ) ; 1 ligne

s e l e c t ∗ from e n s e i g n a n t ;

NUMERO NOM PRENO DATENAISSA S ECHELON INDICE SPECIALITE


−−−−−− −−−−− −−−−− −−−−−−−−−− − −−−−−−−−−− −−−−−−−−−− −−−−−−−−−−
7 B F 17−09−2004 M 2 780 BD
7 B F 17−09−2004 M 2 780 BD
8 B D 17−10−2004 M 2 780 BD

79/193
Création des tables objet et contraintes (2)

Ci-dessous :
Création des tables objet en fonctions des types
précédemment définis
Définition des contraintes au niveau des tables
−−− ∗∗∗ P e r s o n n e l de l ’ u n i v e r s i t é
c r e a t e t a b l e PERSONNEL OF PERSONNEL TYPE
(
c o n s t r a i n t PK PERSONNEL p r i m a r y key (NUMERO) ,
c o n s t r a i n t CK SEXE PERSONNEL c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
);
−−− ∗∗∗ P e r s o n n e l e n s e i g n a n t

80/193
Transformation des associations d’héritage en SQL 3

c r e a t e t a b l e ENSEIGNANT OF ENSEIGNANT TYPE


(
c o n s t r a i n t PK ENSEIGNANT p r i m a r y key (NUMERO) ,
c o n s t r a i n t CK SEXE ENSEIGNANT c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
);

ATTENTION :
Définition des contraintes, aussi dans la table enseignant
Héritage d’un type

81/193
Création des tables objet et contraintes (2)
illustrations

Les contraintes doivent être définies aussi dans la table


enseignant : héritage d’un type
SQL> i n s e r t i n t o e n s e i g n a n t v a l u e s ( 7 , ’B ’ , ’ F ’ , ’ 17−09−2004 ’ , ’M’ , 2 , 7 8 0 , ’BD ’ ) ; 1 l i g
SQL> i n s e r t i n t o e n s e i g n a n t v a l u e s ( 7 , ’B ’ , ’ F ’ , ’ 17−09−2004 ’ , ’M’ , 2 , 7 8 0 , ’BD ’ ) ;
insert into e n s e i g n a n t v a l u e s ( 7 , ’B ’ , ’ F ’ , ’ 17−09−2004 ’ , ’M’ , 2 , 7 8 0 , ’BD ’ )
∗ ERREUR à l a l i g n e 1 : ORA−00001: v i o l a t i o n de c o n t r a i n t e u n i q u e (FB . PK ENSEIGNANT )

SQL> i n s e r t i n t o e n s e i g n a n t v a l u e s ( 8 , ’B ’ , ’D ’ , ’ 17−10−2004 ’ , ’M’ , 2 , 7 8 0 , ’BD ’ ) ; 1 l i g


SQL> i n s e r t i n t o e n s e i g n a n t v a l u e s ( 9 , ’B ’ , ’D ’ , ’ 17−10−2004 ’ , ’K ’ , 2 , 7 8 0 , ’BD ’ ) ;
i n s e r t i n t o e n s e i g n a n t v a l u e s ( 9 , ’B ’ , ’D ’ , ’ 17−10−2004 ’ , ’K ’ , 2 , 7 8 0 , ’BD ’ )
∗ ERREUR à l a l i g n e 1 : ORA−02290: v i o l a t i o n de c o n t r a i n t e s (FB . CK SEXE ENSEIGNANT )
de v é r i f i c a t i o n

SQL> s e l e c t ∗ from e n s e i g n a n t ;
NUMERO NOM PRENO DATENAISSA S ECHELON INDICE SPECIALITE
−−−−−− −−−−− −−−−− −−−−−−−−−− − −−−−−−−−−− −−−−−−−−−− −−−−−−−−−−
7 B F 17−09−2004 M 2 780 BD
8 B D 17−10−2004 M 2 780 BD

82/193
Transformation des associations d’héritage en SQL 3
Héritage de tables : À venir

REM ∗∗∗ Un p e r s o n n e l à l ’ U n i v e r s i t é
c r e a t e t a b l e PERSONNEL
(
NUMERO number ( 7 ) , NOM v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) , DATENAISSANCE d a t e ,
SEXE c h a r ( 1 ) ,
c o n s t r a i n t PK PERSONNEL p r i m a r y k e y (NUMERO) ,
c o n s t r a i n t CK SEXE PERSONNEL c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
);

83/193
Transformation des associations d’héritage en SQL 3
Héritage de tables : À venir

REM ∗∗∗ P e r s o n n e l e n s e i g n a n t
c r e a t e t a b l e ENSEIGNANT u n d e r PERSONNEL
(
ECHELON number ( 2 ) ,
INDICE number ( 5 ) ,
SPECIALITE v a r c h a r ( 2 0 )
);

REM ∗∗∗ P e r s o n n e l b i a t o s
c r e a t e t a b l e BIATOS u n d e r PERSONNEL
(
DATEEMBAUCHE date ,
SERVICE v a r c h a r ( 2 0 )
);

84/193
Traduction des associations d’agrégation

85/193
Traduction des associations d’agrégation
REM ∗∗∗ Un co− p r o p r i é t a i r e p e u t p o s s é d e r p l u s i e u r s i m m e u b l e s
c r e a t e t a b l e COPROPRIETAIRE
(
NUMCO number ( 7 ) ,
NOMCO v a r c h a r ( 1 0 ) ,
TELCO v a r c h a r ( 1 5 ) ,
ADRCO v a r c h a r ( 5 0 ) ,
c o n s t r a i n t PK COPROPRIETAIRE p r i m a r y key (NUMCO)
);

REM ∗∗∗ Un immeuble d o i t ê t r e p o s s é d é p a r un ou


REM p l u s i e u r s c o p r o p r i é t a i r e s
c r e a t e t a b l e IMMEUBLE
(
NUMIMM number ( 7 ) ,
ADRIMM v a r c h a r ( 5 0 ) ,
c o n s t r a i n t PK IMMEUBLE p r i m a r y key (NUMIMM)
);

86/193
Traduction des associations d’agrégation
c r e a t e t a b l e DEPENSE
(
NUMCO number ( 7 ) ,
NUMIMM number ( 7 ) ,
DATEDEP date ,
MTTDEP number ( 1 0 , 2 ) ,
LIBDEP v a r c h a r ( 5 0 ) ,
c o n s t r a i n t PK DEPENSE p r i m a r y key (NUMCO,NUMIMM) ,
c o n s t r a i n t FK DEPENSE NUMCO COPROPR f o r e i g n key (NUMCO)
r e f e r e n c e s COPROPRIETAIRE (NUMCO) on d e l e t e c a s c a d e ,
c o n s t r a i n t FK DEPENSE NUMIMM IMMEUBLE f o r e i g n key (NUMIMM)
r e f e r e n c e s IMMEUBLE(NUMIMM ) on d e l e t e c a s c a d e
);

→ La cardinalité minimale de l’association dépenser pourra être


testée par l’intermédiaire d’une procédure PL/SQL

87/193
Traduction des contraintes d’intégrité fonctionnelles

Contraintes : Partition, Exclusion, Totalité, Simultanéité, Inclusion


...
Toutes les contraintes peuvent être définies ou programmées via :
la déclaration de contraintes (constraints)
la programmation de
fonctions (functions)
procédures (procedures)
paquetages (packages)
déclencheurs (triggers)
en PL/SQL ou avec un langage hôte tel que le C, C++, Java

88/193
Contrainte d’inclusion

c r e a t e t a b l e STAGE
(
NUMEROS number ( 7 ) ,
NOMENTREPRISE v a r c h a r ( 4 0 ) ,
TELENT v a r c h a r ( 1 5 ) ,
ADRENT v a r c h a r ( 5 0 ) ,
c o n s t r a i n t PK STAGE p r i m a r y key (NUMEROS)
);

89/193
Contrainte d’inclusion
Une table par classe

c r e a t e t a b l e ETUDIANT
(
NUMEROE number ( 7 ) ,
NOM v a r c h a r ( 1 0 ) ,
PRENOM v a r c h a r ( 1 0 ) ,
DATENAISSANCE date ,
SEXE c h a r ( 1 ) ,
NUMEROS number ( 7 ) ,
c o n s t r a i n t PK ETUDIANT p r i m a r y key (NUMEROE) ,
c o n s t r a i n t FK ETUDIANT NUMEROS STAGE f o r e i g n key (NUMEROS)
r e f e r e n c e s STAGE(NUMEROS) ,
c o n s t r a i n t CK ETUDIANT SEXE c h e c k ( SEXE i n ( ’M’ , ’ F ’ ) )
);

90/193
Contrainte d’inclusion

c r e a t e t a b l e VOEUX
(
NUMEROE number ( 7 ) ,
NUMEROS number ( 7 ) ,
c o n s t r a i n t PK VOEUX p r i m a r y key (NUMEROE,NUMEROS) ,
c o n s t r a i n t FK VOEUX NUMEROE ETUDIANT f o r e i g n key (NUMEROE)
r e f e r e n c e s ETUDIANT (NUMEROE) ,
c o n s t r a i n t FK VOEUX NUMEROS STAGE f o r e i g n key (NUMEROS)
r e f e r e n c e s STAGE(NUMEROS)
);

a l t e r t a b l e ETUDIANT add
c o n s t r a i n t FK EFFECTUER INCLUSION VOEUX
f o r e i g n key (NUMEROE,NUMEROS)
r e f e r e n c e s V O E U X (NUMEROE,NUMEROS ) ;

91/193
Contrainte d’inclusion
Contrainte d’inclusion : Le logiciel doit être installé sur un serveur
du département qui a acheté le programme.

Un logiciel L acheté par le département D est installé sur un


serveur S, destiné entre autres, à ce département

92/193
Contrainte d’inclusion
Une table par Classe

c r e a t e t a b l e DEPARTEMENT
(
NUMDEP number ( 7 ) ,
NOMDEP v a r c h a r ( 1 0 ) ,
SPECIALITE v a r c h a r ( 2 0 ) ,
c o n s t r a i n t PK DEPARTEMENT p r i m a r y key (NUMDEP)
);

c r e a t e t a b l e LOGICIEL
(
NUMLOG number ( 7 ) ,
NOMLOG v a r c h a r ( 1 0 ) ,
VERSIONLOG v a r c h a r ( 1 0 ) ,
c o n s t r a i n t PK LOGICIEL p r i m a r y key (NUMLOG)
);

93/193
Contrainte d’inclusion
Une table par Classe

c r e a t e t a b l e SERVEUR
(
NUMSERV number ( 7 ) ,
NOMSERV v a r c h a r ( 1 0 ) ,
TYPESERV v a r c h a r ( 1 0 ) ,
c o n s t r a i n t PK SERVEUR p r i m a r y key (NUMSERV)
);

94/193
Contrainte d’inclusion
Une table par Association ou par Classe-Association
c r e a t e t a b l e ACHETER (
NUMDEP number ( 7 ) , NUMLOG number ( 7 ) , DATEACHAT date ,
c o n s t r a i n t PK ACHETER p r i m a r y key (NUMDEP,NUMLOG) ,
c o n s t r a i n t FK ACHETER NUMDEP DEPARTEMENT
f o r e i g n key (NUMDEP) r e f e r e n c e s DEPARTEMENT(NUMDEP) ,
c o n s t r a i n t FK ACHETER NUMLOG LOGICIEL
f o r e i g n key (NUMLOG) r e f e r e n c e s LOGICIEL (NUMLOG)
);

c r e a t e t a b l e UTILISER (
NUMDEP number ( 7 ) , NUMSERV number ( 7 ) ,
c o n s t r a i n t PK UTILISER p r i m a r y key (NUMDEP,NUMSERV) ,
c o n s t r a i n t FK UTILISER NUMDEP DEPARTEMENT
f o r e i g n key (NUMDEP) r e f e r e n c e s DEPARTEMENT(NUMDEP) ,
c o n s t r a i n t FK UTILISER NUMSERV SERVEUR
f o r e i g n key (NUMSERV) r e f e r e n c e s SERVEUR(NUMSERV)
);

95/193
Contrainte d’inclusion
Une table par Association ou par Classe-Association

c r e a t e t a b l e INSTALLER (
NUMLOG number ( 7 ) , NUMSERV number ( 7 ) ,
c o n s t r a i n t PK INSTALLER p r i m a r y key (NUMLOG, NUMSERV) ,
c o n s t r a i n t FK INSTALLER NUMLOG LOGICIEL
f o r e i g n key (NUMLOG) r e f e r e n c e s LOGICIEL (NUMLOG) ,
c o n s t r a i n t FK INSTALLER NUMSERV SERVEUR
f o r e i g n key (NUMSERV) r e f e r e n c e s ERVEUR(NUMSERV) ) ;

96/193
Contrainte d’Inclusion
Déclencheur
Un logiciel L acheté par le département D est installé sur un serveur S, destiné entre
autres, à ce département
create or r e p l a c e t r i g g e r t r i g c o n t r a i n t e i n c l u s i o n
b e f o r e i n s e r t on INSTALLER
f o r e a c h row
declare
LOGIC number ( 7 ) ;
SERV number ( 7 ) ;
begin
s e l e c t ACHETER .NUMLOG, UTILISER . NUMSERV i n t o LOGIC , SERV
from ACHETER, UTILISER
where ACHETER .NUMDEP = UTILISER .NUMDEP and
ACHETER .NUMLOG = : new .NUMLOG and
UTILISER .NUMSERV = : new .NUMSERV;
exception
when n o d a t a f o u n d t h e n
r a i s e a p p l i c a t i o n e r r o r ( −20100 ,
’ Le l o g i c i e l d o i t ê t r e i n s t a l l é s u r
un s e r v e u r du dé p a r t e m e n t a c h e t e u r ’ ) ;
end ;
/

97/193
Programmation Objet – SQL 3

Objet-relationnel – Objet
Passage UML → Objet / Objet relationnel

98/193
Schéma relationnel / SQL2

Schéma relationnel :
COURS ( NUM COURS, NOMC, NBHEURES, ANNEE )

PROFESSEURS ( NUM PROF, NOMP, SPECIALITE , DATE ENTREE ,


DER PROM, SALAIRE BASE , SALAIRE ACTUEL
)

CHARGE( NUM PROF∗ , NUM COURS∗ )

99/193
Schéma relationnel / SQL2
SQL2 :
c r e a t e t a b l e COURS
( NUM COURS NUMBER( 2 ) NOT NULL ,
NOMC VARCHAR( 2 0 ) NOT NULL ,
NBHEURES NUMBER( 2 ) ,
ANNE NUMBER( 1 ) ,
c o n s t r a i n t PK COURS p r i m a r y key (NUM COURS)
);

c r e a t e t a b l e PROFESSEURS
( NUM PROF NUMBER( 4 ) NOT NULL ,
NOMP VARCHAR2( 2 5 ) NOT NULL ,
SPECIALITE VARCHAR2( 2 0 ) ,
DATE ENTREE DATE,
DER PROM DATE,
SALAIRE BASE NUMBER,
SALAIRE ACTUEL NUMBER,
c o n s t r a i n t PK PROFESSEURS p r i m a r y key (NUM PROF)
);

c r e a t e t a b l e CHARGE
( NUM PROF NUMBER( 4 ) NOT NULL ,
NUM COURS NUMBER( 4 ) NOT NULL ,
c o n s t r a i n t PK CHARGE p r i m a r y key (NUM COURS,
NUM PROF)
);

100/193
Schéma relationnel / SQL2

a l t e r t a b l e CHARGE
add c o n s t r a i n t FK CHARGE COURS
f o r e i g n key (NUM COURS)
r e f e r e n c e s COURS (NUM COURS ) ;

a l t e r t a b l e CHARGE
add c o n s t r a i n t FK CHARGE PROFESSEUR
f o r e i g n key (NUM PROF)
r e f e r e n c e s PROFESSEURS (NUM PROF ) ;

101/193
Schéma relationnel-objet / SQL3

Schéma relationnel-objet
COURS ( NUM COURS, NOMC, NBHEURES, ANNEE )

PROFESSEURS (
NUM PROF, NOMP, SPECIALITE , DATE ENTREE ,
DER PROM, SALAIRE BASE , SALAIRE ACTUEL ,
EnsembleDe (COURS)
)

102/193
Schéma relationnel-objet / SQL3
SQL3 :
c r e a t e type c o u r s t y p e as o b j e c t
( n u m c o u r s number ( 2 ) , nomc v a r c h a r 2 ( 2 0 ) ,
n b h e u r e s number ( 2 ) , a n n e e number ( 1 ) )
/

create type l e s c o u r s t y p e as t a b l e of c o u r s t y p e
/

create type p r o f e s s e u r t y p e as o b j e c t
( n u m p r o f number ( 4 ) , nom v a r c h a r 2 ( 2 5 ) ,
s p e c i a l i t e varchar2 (20) , cours l e s c o u r s t y p e ...)
/

create table professeur of professeur type


( p r i m a r y key ( n u m p r o f ) )
n e s t e d t a b l e c o u r s s t o r e a s tabemp
/

103/193
Types Objet
Type de données
Principaux type de données Oracle :

104/193
Types Objet
Persistance
Sous Oracle, 3 catégories d’objets :
Objets colonne (column objects) : stockés en tant que
colonne structurée dans une table relationnelle ;
Objets ligne (row objects) : stockés en tant que ligne d’une
table objet.
possèdent un identificateur unique appelé OID (Object
Identifier )
peuvent être indexés et partitionnés
Objets non persistants : non stockés
ni dans une colonne d’une table relationnelle
ni dans une ligne d’une table objet
Ces objets n’existent que durant l’exécution d’un programme
PL/SQL

105/193
Types Objet

Définition de chaque objet à partir d’un type décrivant


une structure de données se positionnant dans une hiérarchie
d’héritage
des méthodes
Utilisation d’un type :
Construire d’autres types
Définir une ou plusieurs tables objet
Définir une colonne d’une table relationnelle
Construire des vues objet

106/193
Types Objet
Création d’un type
Création
CREATE [OR REPLACE TYPE ] schéma . nomType
[ AS OBJECT | UNDER schéma . nomSurType ]
(
REM ∗∗∗ d é f i n i t i o n de l a s t r u c t u r e
colonne1 type1 , colonne2 type2 , . . . ,

REM ∗∗∗ d é f i n i t i o n du comportement


méthode1 ( p a r a m è t r e s 1 ) , méthode2 ( p a r a m è t r e s 2 ) ...
)
[ [ NOT] INSTANTIABLE ]

REM ∗∗∗ p o s i t i o n n e m e n t d a n s l e g r a p h e d ’ h é r i t a g e
[ [ NOT] FINAL ]
/

107/193
Création d’un type
Directive FINAL

Directives FINAL et NOT FINAL : positionnement d’un type


dans le graphe d’héritage
Directive NOT final : à appliquer aux types génériques
Par défaut, tout type est FINAL
Un type FINAL ne peut servir à définir des sous-types

108/193
Création d’un type
Directive FINAL – Exemples

CREATE TYPE a d r e s s e t AS OBJECT (


n r u e NUMBER( 3 ) , r u e VARCHAR( 4 0 ) , v i l l e VARCHAR( 3 0 )
/

CREATE TYPE P e r s o n n e l t AS OBJECT(


nom VARCHAR ( 1 0 ) , prenom VARCHAR( 1 0 ) , a d r e s s e a d r e s s e t ) )
NOT FINAL
/

CREATE TYPE E n s e i g n a n t t UNDER P e r s o n n e l t (


E c h e l o n NUMBER, i n d i c e NUMBER)
FINAL

109/193
Création d’un type
Directive INSTANTIABLE
Directives INSTANTIABLE et NOT INSTANTIABLE : capacité
d’instancitation d’un type
Tous les types créés sont par défaut INSTANTIABLE
NOT INSTANTIABLE : similaire à la notion de classe abstraite
Chaque type possède
un constructeur permettant de créer des objets (persistants ou
non) à l’aide de la commande NEW ou au sein d’un commande
INSERT
un constructeur (par défaut) et plusieurs dans le cas de
surcharge
Un type NOT INSTANTIABLE ne peut pas être FINAL
Un sous-type NOT INSTANTIABLE peut hériter d’un type
INSTANTIABLE

110/193
Création d’un type
Directive INSTANTIABLE -- Exemples

CREATE TYPE P e r s o n n e l t AS OBJECT(


nom VARCHAR ( 1 0 ) , prenom VARCHAR( 1 0 ) , a d r e s s e a d r e s s e t ) )
NOT INSTANTIABLE NOT FINAL
/

CREATE TYPE E n s e i g n a n t t UNDER P e r s o n n e l t (


E c h e l o n NUMBER, i n d i c e NUMBER)
INSTANTIABLE FINAL
/

111/193
Types Objet
Suppression d’un type
DROP TYPE nomType [ FORCE | VALIDATE ] ;

Directives :
FORCE : suppression du type même s’il y a des objets de ce
type dans une base
Oracle marque les colonnes dépendant de ce type, UNUSED, et
elles deviennent inaccessibles (non recommandé)
VALIDATE : Vérification si les instances du type à supprimer
peuvent être substitués par un sur-type.
Exemple :
DROP TYPE P e r s o n n e l t FORCE

112/193
Types Objet
Création d’un type
Spécification de l’objet
CREATE TYPE B a n k A c c o u n t AS OBJECT (
a c c t n u m b e r INTEGER ( 5 ) ,
balance REAL ,
status VARCHAR2( 1 0 ) ,

MEMBER PROCEDURE open


( amount IN REAL ) ,

MEMBER PROCEDURE v e r i f y a c c t
( num IN INTEGER ) ,

MEMBER PROCEDURE c l o s e
( num IN INTEGER , amount OUT REAL )
);

CREATE TYPE BODY B a n k A c c o u n t AS


...
END;

113/193
Types Objet
Création d’un type

Définition des méthodes associées à l’objet


CREATE TYPE BODY B a n k A c c o u n t AS

MEMBER PROCEDURE open ( amount IN REAL ) I S


BEGIN −− open a c c o u n t w i t h i n i t i a l d e p o s i t
I F NOT amount > 0 THEN
RAISE APPLICATION ERROR ( −20104 , ’ bad amount ’ ) ;
END I F ;
−− SELECT a c c t s e q u e n c e . NEXTVAL INTO a c c t n u m b e r FROM d u a l ;
s t a t u s := ’ open ’ ;
b a l a n c e := amount ;
END open ;

114/193
Types Objet
Création d’un type

MEMBER PROCEDURE v e r i f y a c c t ( num IN INTEGER) I S


BEGIN −− c h e c k f o r wrong a c c o u n t number o r c l o s e d a c c o u n t
I F ( num <> a c c t n u m b e r ) THEN
RAISE APPLICATION ERROR ( −20105 , ’ wrong number ’ ) ;
ELSIF ( s t a t u s = ’ c l o s e d ’ ) THEN
RAISE APPLICATION ERROR ( −20106 , ’ a c c o u n t c l o s e d ’ ) ;
END I F ;
END v e r i f y a c c t ;

MEMBER PROCEDURE c l o s e ( num IN INTEGER , amount OUT REAL ) I S


BEGIN −− c l o s e a c c o u n t and r e t u r n b a l a n c e
v e r i f y a c c t ( num ) ;
s t a t u s := ’ c l o s e d ’ ;
amount := b a l a n c e ;
END c l o s e ;
END;

115/193
Types Objet
Extraction de la description d’un type

Définition de nouvelles vues du DD pour prendre en compte les


types
Exemple :
create type emp type as o b j e c t ( n i n s e e varchar2 ( 1 3 ) ,
a ge number , nom v a r c h a r 2 ( 3 0 ) )
/

Description de la structure du 1er niveau d’un type :


SQL> DESC e m p t y p e

116/193
Types Objet
Extraction de la description d’un type

Exemples de vues : (USER_..., DBA_..., ALL_...)

Description :
des collections : USER_COLL_TYPES
des index sur les types : USER_INDEXTYPES
des types d’une manière générale : USER_TYPES
des attributs des types : USER_TYPE_ATTRS
des méthodes des types : USER_TYPE_METHODS
des versions des types : USER_TYPE_VERSIONS

117/193
Passage à l’objet
Tables relationnelles
−− T a b l e : MAGASINS2 SQL2 −− T a b l e : CLIENTS2 SQL2
c r e a t e t a b l e MAGASINS2 c r e a t e t a b l e CLIENTS2
( NUMMAG INTEGER , ( NUMCLI INTEGER ,
NOMMAG CHAR( 3 0 ) , NOMCLI CHAR( 2 0 ) ,
TELMAG CHAR( 1 5 ) , TELCLI CHAR( 1 5 ) ,
ADRNUMMAG VARCHAR2( 1 0 ) , ADRNUMCLI VARCHAR2( 1 0 ) ,
ADRRUEMAG VARCHAR2( 5 0 ) , ADRRUECLI VARCHAR2( 5 0 ) ,
ADRCPMAG VARCHAR2( 1 0 ) , ADRCPCLI VARCHAR2( 1 0 ) ,
ADRVILLEMAG VARCHAR2( 5 0 ) , ADRVILLECLI VARCHAR2( 5 0 ) ,
ADRPAYSMAG VARCHAR2( 5 0 ) , ADRPAYSCLI VARCHAR2( 5 0 ) ,
c o n s t r a i n t PK MAGASINS2 c o n s t r a i n t PK CLIENTS2
p r i m a r y key (NUMMAG) ) ; p r i m a r y key (NUMCLI ) ) ;
i n s e r t i n t o MAGASINS2 v a l u e s ( 1 , ’ FB ’ , ’ 0145454545 ’ , ’ 13 ’ , ’ Avenue de l a p a i x ’ ,
’ 75015 ’ , ’ P a r i s ’ , ’ F r a n c e ’ ) ;

NUMMAG NOMMAG TELMAG ADRNU ADRRUEMAG ADRCP ADRVILLEMA ADRPAYSMAG


1 FB 0145454545 13 Avenue de l a p a i x 75015 Paris France
2 FB 0155555555 20 Avenue de l a l i b e r t é 06100 N i c e France
3 FB 0155555555 10 Avenue d e s Amis 6050 Bruxelles Belgique
4 FB 71226002 10 Avenue du s o l e i l 1001 T u n i s Tunisie

NUMCLI NOMCLI TELCLI ADRNU ADRRUECLI ADRCP ADRVILLECL ADRPAYSCLI


1 TRAIFOR 0645454545 13 Avenue de l a p a i x 75015 Paris France
2 CLEMENT 0607080910 17 Avenue de l a p a i x 75015 Paris France
3 SOUCY 98980307 77 Route de l a c o r n i c h e 4001 Sousse Tunisie

118/193
Tables Objet
Création d’un type – TAD
Première extension du modèle relationnel : Types Abstraits de Données
(TAD)
TAD (contexte BD) :
Nouveau type d’attribut défini par l’utilisateur
Enrichissement de la collection existante de types disponibles par défaut
(number, date, char, varchar ...)
Structure de données partagée
Utilisation du type dans une ou plusieurs tables
Participation à la composition d’un ou plusieurs autres types
Remarques :
Un TAD inclut des méthodes qui sont des procédures ou des fonctions
Elles permettent de manipuler les objets du type abstrait

119/193
Tables Objet
Création d’un type – exemple de TAD

create t y p e ADRESSE TYPE a s o b j e c t


( ADRNUM VARCHAR2( 1 0 ) ,
ADRRUE VARCHAR2( 5 0 ) ,
ADRCP VARCHAR2( 1 0 ) ,
ADRVILLE VARCHAR2( 5 0 ) ,
ADRPAYS VARCHAR2( 5 0 ) )
/

c r e a t e t y p e MAG TYPE a s o b j e c t c r e a t e t y p e CLI TYPE a s o b j e c t


( NUMMAG INTEGER , ( NUMCLI INTEGER ,
NOMMAG CHAR( 3 0 ) , NOMCLI CHAR( 3 0 ) ,
TELMAG CHAR( 1 5 ) , TELCLI CHAR( 1 5 ) ,
ADRMAG ADRESSE TYPE ) ADRCLI ADRESSE TYPE )
/ /

120/193
Tables Objet
Création d’une table – Exemples

c r e a t e t a b l e MAGASINS3 OF MAG TYPE


( c o n s t r a i n t PK MAGASINS3 p r i m a r y key (NUMMAG) ) ;

c r e a t e t a b l e CLIENTS3 OF CLI TYPE


( c o n s t r a i n t PK CLIENTS3 p r i m a r y key (NUMCLI) ) ;

121/193
Tables Objet
Création d’un type

Remarques :
Un type ne peut pas contenir de contraintes (NOT NULL,
CHECK, UNIQUE, DEFAULT, PRIMARY KEY, FOREIGN KEY, etc.).
Les contraintes doivent être déclarées au niveau de la table
objet

Accès à la description des types à partir du Dictionnaire de


Données :
SQL > s e l e c t t a b l e n a m e , o b j e c t i d t y p e , t a b l e t y p e o w n e r ,
t a b l e t y p e from u s e r o b j e c t t a b l e s ;

122/193
Tables Objet
Création/description d’une table Exemples
SQL> d e s c c l i e n t s 2
Nom NULL ? Type
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−− −−−−−−−−−−−−−−−
NUMCLI NOT NULL NUMBER( 3 8 )
NOMCLI CHAR( 2 0 )
TELCLI CHAR( 1 5 )
ADRNUMCLI VARCHAR2( 1 0 )
ADRRUECLI VARCHAR2( 5 0 )
ADRCPCLI VARCHAR2( 1 0 )
ADRVILLECLI VARCHAR2( 5 0 )
ADRPAYSCLI VARCHAR2( 5 0 )

SQL> d e s c c l i e n t s 3
Nom NULL ? Type
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−− −−−−−−−−−−−−−−−
NUMCLI NOT NULL NUMBER( 3 8 )
NOMCLI CHAR( 3 0 )
TELCLI CHAR( 1 5 )
ADRCLI ADRESSE TYPE

123/193
Tables Objet
Object identifier (OID)
OID basés sur la clé primaire : Utilisation de l’option primary
key
c r e a t e t a b l e CLIENTS3 OF CLI TYPE
( c o n s t r a i n t PK CLIENTS3 p r i m a r y key (NUMCLI) )
o b j e c t i d e n t i f i e r i s p r i m a r y key ;

Index sur OID :


c r e a t e t a b l e CLIENTS3 OF CLI TYPE
( c o n s t r a i n t PK CLIENTS3 p r i m a r y key (NUMCLI) )
o b j e c t i d e n t i f i e r i s s y s t e m g e n e r a t e d OIDINDEX n d x c l i e n t s 3 ;

c r e a t e t a b l e CLIENTS3 OF CLI TYPE


( c o n s t r a i n t PK CLIENTS3 p r i m a r y key (NUMCLI) )
o b j e c t i d e n t i f i e r i s system generated
OIDINDEX n d x c l i e n t s 3 ( s t o r a g e ( i n i t i a l 100K n e x t 50 k
m i n e x t e n t s 1 maxextents 50)
);

124/193
Tables Objet
Instanciation - exemples
Insertion d’une  ligne  (ou plutôt d’un objet) :
i n s e r t i n t o MAGASINS3 v a l u e s (MAG TYPE( 1 , ’ FB ’ , ’ 0145454545 ’ ,
ADRESSE TYPE ( ’ 13 ’ , ’ Avenue de l a p a i x ’ , ’ 75015 ’ , ’ P a r i s ’ , ’ F r a n c e ’ ) ) ) ;
i n s e r t i n t o MAGASINS3 v a l u e s (MAG TYPE( 2 , ’ FB ’ , ’ 0155555555 ’ ,
ADRESSE TYPE ( ’ 20 ’ , ’ Avenue de l a l i b e r t é ’ , ’ 06100 ’ , ’ N i c e ’ , ’ F r a n c e ’ ) ) ) ;
i n s e r t i n t o MAGASINS3 v a l u e s (MAG TYPE( 3 , ’ FB ’ , ’ 0155555555 ’ ,
ADRESSE TYPE ( ’ 10 ’ , ’ Avenue d e s Amis ’ , ’ 6050 ’ , ’ B r u x e l l e s ’ , ’ B e l g i q u e ’ ) ) ) ;
i n s e r t i n t o MAGASINS3 v a l u e s (MAG TYPE( 4 , ’ FB ’ , ’ 71226002 ’ ,
ADRESSE TYPE ( ’ 10 ’ , ’ Avenue du s o l e i l ’ , ’ 1001 ’ , ’ T u n i s ’ , ’ T u n i s i e ’ ) ) ) ;

SQL> s e l e c t ∗ from m a g a s i n s 3 ;
NUMMAG NOMMAG TELMAG ADRMAG(ADRNUM, ADRRUE, ADRCP, ADRVILLE , ADRPAYS)
1 FB 0145454545 ADRESSE TYPE ( ’ 13 ’ , ’ Avenue de l a p a i x ’ ,
’ 75015 ’ , ’ P a r i s ’ , ’ F r a n c e ’ )
2 FB 0155555555 ADRESSE TYPE ( ’ 20 ’ , ’ Avenue de l a l i b e r t é ’ ,
’ 06100 ’ , ’ N i c e ’ , ’ F r a n c e ’ )
3 FB 0155555555 ADRESSE TYPE ( ’ 10 ’ , ’ Avenue d e s Amis ’ ,
’ 6050 ’ , ’ B r u x e l l e s ’ , ’ B e l g i q u e ’ )
4 FB 71226002 ADRESSE TYPE ( ’ 10 ’ , ’ Avenue du s o l e i l ’ ,
’ 1001 ’ , ’ T u n i s ’ , ’ T u n i s i e ’ )

125/193
Tables Objet
Instanciation - exemples

i n s e r t i n t o CLIENTS3 v a l u e s ( CLI TYPE ( 1 , ’ TRAIFOR ’ , ’ 0645454545 ’,


ADRESSE TYPE ( ’ 13 ’ , ’ Avenue de l a p a i x ’ , ’ 75015 ’ , ’ P a r i s ’ , ’ France ’ ) ) ) ;
i n s e r t i n t o CLIENTS3 v a l u e s ( CLI TYPE ( 2 , ’CLEMENT ’ , ’ 0607080910 ’,
ADRESSE TYPE ( ’ 17 ’ , ’ Avenue de l a p a i x ’ , ’ 75015 ’ , ’ P a r i s ’ , ’ France ’ ) ) ) ;
i n s e r t i n t o CLIENTS3 v a l u e s ( CLI TYPE ( 3 , ’SOUCY ’ , ’ 98980307 ’ ,
ADRESSE TYPE ( ’ 77 ’ , ’ Route de l a c o r n i c h e ’ , ’ 4001 ’ , ’ Sousse ’ , ’ Tunisie ’ ) ) ) ;

SQL> S e l e c t ∗ from c l i e n t s 3 ;
NUMCLI NOMCLI TELCLI ADRCLI (ADRNUM, ADRRUE, ADRCP, ADRVILLE , ADRPAYS)
1 TRAIFOR 0645454545 ADRESSE TYPE ( ’ 13 ’ , ’ Avenue de l a p a i x ’ , ’ 75015 ’ ,
’ P a r i s ’ , ’ France ’ )
2 CLEMENT 0607080910 ADRESSE TYPE ( ’ 17 ’ , ’ Avenue de l a p a i x ’ , ’ 75015 ’ ,
’ P a r i s ’ , ’ France ’ )
3 SOUCY 98980307 ADRESSE TYPE ( ’ 77 ’ , ’ Route de l a c o r n i c h e ’ , ’ 4001 ’ ,
’ Sousse ’ , ’ Tunisie ’ )

126/193
Tables Objet
Instanciation

Table objet-relationnelle :
Table dépendante d’un type
Enregistrements (lignes) dans cette table considérés comme
des objets car ils possèdent tous un OID (Object Identifier)
unique
SQL> SELECT ∗ FROM c l i e n t s 3 ;
NUMCLI NOMCLI TELCLI ADRCLI (ADRNUM, ADRRUE, ADRCP, ADRVILLE , ADRPAYS)
1 TRAIFOR 0645454545 ADRESSE TYPE ( ’ 13 ’ , ’ Avenue de l a p a i x ’ , ’ 75015 ’ ,
’ P a r i s ’ , ’ France ’ )
2 CLEMENT 0607080910 ADRESSE TYPE ( ’ 17 ’ , ’ Avenue de l a p a i x ’ , ’ 75015 ’ ,
’ P a r i s ’ , ’ France ’ )
3 SOUCY 98980307 ADRESSE TYPE ( ’ 77 ’ , ’ Route de l a c o r n i c h e ’ , ’ 4001 ’ ,
’ Sousse ’ , ’ Tunisie ’ )

127/193
Tables Objet
Instanciation

Renvoi des OID des objets de la table :


SQL> SELECT REF ( c ) FROM c l i e n t s 3 c ;

REF (C)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
0000280209 E9E229206EDF47DF9996946C4BBD571C4EB9AF259F2F42BC813
0 0 0 0 2 8 0 2 0 9 5 5 0 14 1 E8898C4859AF0F3D48FA3041944EB9AF259F2F42BC813
0000280209 C2C96804847047F6856499690AAC9E254EB9AF259F2F42BC813E

128/193
Tables Objet
Mises à jour
Modifications/Suppressions de  lignes ou d’objets
Mise à jour d’une colonne standard
update c l i e n t s 3
s e t NOMCLI = ’CBON ’ where NUMCLI=2;

Modification d’une colonne appartenant à un type imbriqué


update c l i e n t s 3 c
s e t c . ADRCLI . ADRVILLE = ’ MAVILLE ’ where c . NUMCLI=2;

Suppression d’objet
d e l e t e from c l i e n t s 3
where n u m c l i = 3 ;

d e l e t e from c l i e n t s 3 c
where u p p e r ( c . ADRCLI . ADRPAYS) = ’FRANCE ’ ;

129/193
Tables Objet
Interrogations
Utilisation de colonnes standards
s e l e c t n u m c l i , n o m c l i from c l i e n t s 3 ;
NUMCLI NOMCLI
−−−−−−−−−− −−−−−−−−−−
1 TRAIFOR
2 CLEMENT
3 SOUCY

Utilisation d’une colonne appartenant à un type imbriqué


s e l e c t n u m c l i , n o m c l i , c . ADRCLI . ADRPAYS
from c l i e n t s 3 c ;
NUMCLI NOMCLI ADRCLI . ADRPAYS
−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−
1 TRAIFOR France
2 CLEMENT France
3 SOUCY Tunisie

130/193
Tables Objet
Interrogations

avec formatage
c o l nom f o r m a t A10
c o l l o c f o r m a t A15
s e l e c t n u m c l i a s c l i , n o m c l i a s nom ,
c . ADRCLI . ADRVILLE | | ’ ’ | | c . ADRCLI . ADRPAYS as l o c
from c l i e n t s 3 c ;
CLI NOM LOC
−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−
1 TRAIFOR P a r i s France
2 CLEMENT P a r i s France
3 SOUCY Sousse Tunisie

131/193
Tables Objet
Interrogations

avec contraintes
SQL> c o l c . ADRCLI . ADRPAYS f o r m a t A10
SQL> c o l c . ADRCLI . ADRVILLE f o r m a t A10
SQL> s e l e c t n u m c l i , n o m c l i , c . ADRCLI . ADRPAYS,
2 c . ADRCLI . ADRVILLE from c l i e n t s 3 c
3 WHERE u p p e r ( c . ADRCLI . ADRVILLE ) l i k e ’P% ’ ;

NUMCLI NOMCLI ADRCLI . ADRPAYS ADRCLI . ADRVILLE


−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−− −−−−−−−−−−−−−−−
1 TRAIFOR France Paris
2 CLEMENT France Paris

132/193
Tables imbriquées
(NESTED TABLE )
Table imbriquée (NESTED TABLE) : collection non ordonnée et non
limitée d’éléments de même type
Exemple : table Departement
NumDep Budget Employés
NInsee Nom Age

1 table contenant une colonne (table) :


Association du type 1-N

??? 1 ou plusieurs tables : Association du type N-N

133/193
Tables imbriquées (NESTED TABLE)
Création
create type emp type as o b j e c t
( n i n s e e v a r c h a r 2 ( 1 3 ) , a g e number , nom v a r c h a r 2 ( 3 0 ) )
/

create type emps type as t a b l e o f emp type


/
create type departement type as o b j e c t
( numdep v a r c h a r 2 ( 1 1 ) , b u d g e t number ,
employes emps type )
/
create table departement of departement type
( p r i m a r y key ( numdep ) )
n e s t e d t a b l e e m p l o y e s s t o r e a s tabemp
/

clause NESTED TABLE : définition d’une table imbriquée


clause STORE AS : nommage de la structure interne qui stocke les
enregistrements de cette table imbriquée

134/193
Tables imbriquées (NESTED TABLE)
Exemple

create type emp type as o b j e c t ( n i n s e e varchar2 ( 1 3 ) ,


a ge number , nom v a r c h a r 2 ( 3 0 ) )
/
create type emps type as t a b l e o f emp type
/
create t y p e d e p a r t e m e n t t y p e a s o b j e c t ( numdep v a r c h a r 2 ( 1 1 ) ,
b u d g e t number , e m p l o y e s e m p s t y p e )
/
create table departement of departement type
( p r i m a r y key ( numdep ) )
n e s t e d t a b l e e m p l o y e s s t o r e a s tabemp
/

135/193
Tables imbriquées (NESTED TABLE)
Exemple

SQL> d e s c d e p a r t e m e n t
Nom NULL ? Type
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−− −−−−−−−−−−−−−−−
NUMDEP NOT NULL VARCHAR2( 1 1 )
BUDGET NUMBER
EMPLOYES EMPS TYPE

SQL> d e s c e m p s t y p e
e m p s t y p e TABLE OF EMP TYPE
Nom NULL ? Type
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−− −−−−−−−−−−−−−−−
NINSEE VARCHAR2( 1 3 )
AGE NUMBER
NOM VARCHAR2( 3 0 )

136/193
Tables imbriquées (NESTED TABLE)
Insertion

Insertion des données dans une table imbriquée


i n s e r t i n t o d e p a r t e m e n t v a l u e s ( ’ D1 ’ , 1 0 0 0 0 0 , e m p s t y p e ( ) ) ;
i n s e r t i n t o d e p a r t e m e n t v a l u e s ( ’ D2 ’ , 2 0 0 0 0 0 , e m p s t y p e ( ) ) ;

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−
D1 100000 EMPS TYPE ( )
D2 200000 EMPS TYPE ( )

137/193
Tables imbriquées (NESTED TABLE)
Insertion

Attention : dans l’exemple suivant, la table vide est non


initialisée
i n s e r t i n t o d e p a r t e m e n t ( numdep , b u d g e t )
v a l u e s ( ’ D3 ’ , 3 0 0 0 0 0 ) ;

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 100000 EMPS TYPE ( )
D2 200000 EMPS TYPE ( )
D3 300000

138/193
Tables imbriquées (NESTED TABLE)
Insertion

Insertion des données dans une table imbriquée


i n s e r t i n t o d e p a r t e m e n t v a l u e s ( ’ D4 ’ , 400000 ,
e m p s t y p e ( e m p t y p e ( ’ N5 ’ , 25 , ’ B i b i ’),
e m p t y p e ( ’ N6 ’ , 26 , ’ C i c i ’),
e m p t y p e ( ’ N7 ’ , 27 , ’ D i d i ’),
e m p t y p e ( ’ N8 ’ , 28 , ’ F i f i ’ )));

139/193
Tables imbriquées (NESTED TABLE)
Insertion
SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 100000 EMPS TYPE ( )
D2 200000 EMPS TYPE ( )
D3 300000
D4 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’),
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’),
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’),
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ))

Remarque : Commande INSERT avec les constructeurs des types


de la NESTED TABLE
stocke un objet dans la table
initialise la table imbriquée associée avec des enregistrements

140/193
Tables imbriquées (NESTED TABLE)
Insertion
Insertion des données dans une table imbriquée
i n s e r t i n t o d e p a r t e m e n t v a l u e s ( ’ D5 ’ , 4 0 0 0 0 0 ,
e m p s t y p e ( e m p t y p e ( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
e m p t y p e ( ’ N8 ’ , 2 8 , ’ F i f i ’ ) ) ) ;

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 100000 EMPS TYPE ( )
D2 200000 EMPS TYPE ( )
D3 300000
D4 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

141/193
Tables imbriquées (NESTED TABLE)
Insertion avec l’opérateur TABLE

Insertion avec l’opérateur TABLE dans une table imbriquée


(D1 et D2 étaient initialisés à vides)
i n s e r t i n t o TABLE ( s e l e c t d . e m p l o y e s from d e p a r t e m e n t d
where d . numdep = ’ D1 ’ )
v a l u e s ( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) ;
i n s e r t i n t o TABLE ( s e l e c t d . e m p l o y e s from d e p a r t e m e n t d
where d . numdep = ’ D2 ’ )
v a l u e s ( ’ N2 ’ , 2 2 , ’CLEMENTINE ’ ) ;

NB : l’opérateur THE est obsolète et a été remplacé par l’opérateur


TABLE

142/193
Tables imbriquées (NESTED TABLE)
Insertion avec l’opérateur TABLE
SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 100000 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 200000 EMPS TYPE(EMP TYPE( ’ N2 ’ , 2 2 , ’CLEMENTINE ’ ) )
D3 300000
D4 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

Remarques :
Commande INSERT INTO TABLE (SELECT ...) : stockage d’un
enregistrement dans la table imbriquée désignée par TABLE
SELECT après le TABLE : Retourne un seul objet, ce qui permet de
sélectionner la table imbriquée associée

143/193
Tables imbriquées (NESTED TABLE)
Insertion avec l’opérateur TABLE

Insertion avec l’opérateur TABLE dans une table imbriquée


(D3 n’était pas initialisé à vide)
Insertion d’un employé dans le département D3
alors que celui-ci n’a pas été initialisé
i n s e r t i n t o TABLE ( s e l e c t d . e m p l o y e s from d e p a r t e m e n t d
where d . numdep = ’ D3 ’ )
v a l u e s ( ’ N3 ’ , 2 3 , ’NE MARCHE PAS ’ ) ;

144/193
Tables imbriquées (NESTED TABLE)
Insertion avec l’opérateur TABLE
SQL> i n s e r t i n t o t a b l e ( s e l e c t d . e m p l o y e s from d e p a r t e m e n t d
2 where d . numdep = ’ D3 ’ ) v a l u e s ( ’ N3 ’ , 2 3 , ’NEMARCHEPAS ’ ) ;
i n s e r t i n t o t a b l e ( s e l e c t d . e m p l o y e s from d e p a r t e m e n t d
where d . numdep = ’ D3 ’ )

ERREUR à l a l i g n e 1 :
ORA−22908: r é f é r e n c e à une v a l e u r de t a b l e NULL

Explications :
1 Le département D3 est bien un objet de la table Département
2 mais il ne possède pas de table imbriquée
3 car celle-ci n’a pas été créée lors de l’insertion.
Il faut détruire l’objet D3 puis le recréer !

145/193
Tables imbriquées (NESTED TABLE)
Modification
Mise à jour de la table principale
update departement d
set d . budget = d . budget ∗ 1.5
where d . b u d g e t <= 200000 ;

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−−− −−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150000 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300000 EMPS TYPE(EMP TYPE( ’ N2 ’ , 2 2 , ’CLEMENTINE ’ ) )
D3 300000
D4 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

146/193
Tables imbriquées (NESTED TABLE)
Modification (suite)
Mise à jour de la table principale selon un prédicat dans la
table imbriquée
u p d a t e d e p a r t e m e n t d s e t d . b u d g e t = d . b u d g e t + 777
where e x i s t s ( s e l e c t ∗ from
t a b l e ( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep =
d . numdep ) n t
where n t . ag e < 25 ) ;

Description :
Requête qui retourne les employés de chaque département
s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = d . numdep
Condition sur un attribut de la table imbriquée :
where n t . ag e < 25
Alias de la table imbriquée : nt
147/193
Tables imbriquées (NESTED TABLE)
Modification (suite)

Mise à jour de la table principale selon un prédicat dans la


table imbriquée

148/193
Tables imbriquées (NESTED TABLE)
Modification (suite)

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 2 2 , ’CLEMENTINE ’ ) )
D3 300000
D4 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400000 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

149/193
Tables imbriquées (NESTED TABLE)
Modification

Mise à jour de la table principale selon un prédicat dans la


table imbriquée
u p d a t e d e p a r t e m e n t d s e t d . b u d g e t = d . b u d g e t + 999
where exists
( s e l e c t ∗ from t a b l e
( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = d . numdep ) n t
where n t . ag e > 25 ) ;

150/193
Tables imbriquées (NESTED TABLE)
Modification

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 2 2 , ’CLEMENTINE ’ ) )
D3 300000
D4 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

Remarque : les mêmes employés sont dans deux départements

151/193
Tables imbriquées (NESTED TABLE)
Modification

Mise à jour dans la table imbriquée


update
t a b l e ( s e l e c t d . e m p l o y e s from d e p a r t e m e n t d
where d . numdep = ’ D2 ’ ) n t
s e t n t . ag e = 44
where n t . n i n s e e = ’ N2 ’ ;

152/193
Tables imbriquées (NESTED TABLE)
Modification

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )
D3 300000
D4 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

Remarque : Il est impossible de modifier plusieurs enregistrements


de différentes tables imbriquées avec une seule commande
UPDATE !

153/193
Tables imbriquées (NESTED TABLE)
Suppression

Suppression dans la table principale


d e l e t e from d e p a r t e m e n t
where numdep = ’ D3 ’ ;

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )
D4 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

154/193
Tables imbriquées (NESTED TABLE)
Suppression

Suppression à partir d’une valeur de la table imbriquée


Elimination des départements qui emploient une personne
dont le nom est FIFI
d e l e t e from d e p a r t e m e n t d
where e x i s t s ( s e l e c t ∗ from
t a b l e ( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = d . numdep ) n t
where u p p e r ( n t . nom ) l i k e ’%F I F I% ’ ) ;

155/193
Tables imbriquées (NESTED TABLE)
Suppression

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )

156/193
Tables imbriquées (NESTED TABLE)
Suppression

Suppression d’une table imbriquée


Elimination des départements qui emploient une personne
dont le nom est CLEMENT
d e l e t e t a b l e ( s e l e c t dt . employes
from d e p a r t e m e n t d t where d t . numdep = ’ D1 ’ ) n t
where n t . nom = ’CLEMENT ’ ;

SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )

157/193
Tables imbriquées (NESTED TABLE)
Interrogation

Quels sont les numéros et les noms des employés du


département D4 ?
SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )
D4 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

158/193
Tables imbriquées (NESTED TABLE)
Interrogation

s e l e c t n t . n i n s e e , n t . nom
from t a b l e ( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = ’ D4 ’ ) n t ;
NINSEE NOM
−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
N5 Bibi
N6 Cici
N7 Didi
N8 Fifi

159/193
Tables imbriquées (NESTED TABLE)
Interrogation

Quels sont les numéros et les noms des employés du


département D4 qui ont moins de 26 ans ?
SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )
D4 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

160/193
Tables imbriquées (NESTED TABLE)
Interrogation

s e l e c t n t . n i n s e e , n t . nom
from t a b l e ( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = ’ D4 ’ ) n t where n t . ag e < 2 6 ;
NINSEE NOM
−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
N5 Bibi

161/193
Tables imbriquées (NESTED TABLE)
Interrogation

Requête : Quel est le nombre d’employés du département


D4 ?
SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )
D4 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

162/193
Tables imbriquées (NESTED TABLE)
Interrogation

s e l e c t COUNT( ∗ ) ”Nombre d ’ e m p l o yé s ”


from t a b l e ( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = ’ D4 ’ ) n t ;
Nombre d ’ e m p l o yé s
−−−−−−−−−−−−−−−−−
4

163/193
Tables imbriquées (NESTED TABLE)
Interrogation

Quels sont les numéros et les noms des employés des


départements D1 et D2 ?
SQL> s e l e c t ∗ from d e p a r t e m e n t ;
NUMDEP BUDGET EMPLOYES( NINSEE , AGE , NOM)
−−−−−−− −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
D1 150777 EMPS TYPE(EMP TYPE( ’ N1 ’ , 2 1 , ’CLEMENT ’ ) )
D2 300777 EMPS TYPE(EMP TYPE( ’ N2 ’ , 4 4 , ’CLEMENTINE ’ ) )
D4 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N6 ’ , 2 6 , ’ C i c i ’ ) ,
EMP TYPE( ’ N7 ’ , 2 7 , ’ D i d i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )
D5 400999 EMPS TYPE(EMP TYPE( ’ N5 ’ , 2 5 , ’ B i b i ’ ) ,
EMP TYPE( ’ N8 ’ , 2 8 , ’ F i f i ’ ) )

164/193
Tables imbriquées (NESTED TABLE)
Interrogation

s e l e c t s e l e c t n t . n i n s e e , n t . nom from t a b l e
( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = ’ D1 ’ ) n t
union
s e l e c t n t . n i n s e e , n t . nom from t a b l e
( s e l e c t d t . e m p l o y e s from d e p a r t e m e n t d t
where d t . numdep = ’ D2 ’ ) n t ;
NINSEE NOM
−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
N1 CLEMENT
N2 CLEMENTINE

165/193
Plusieurs Tables imbriquées
Création
Regroupement des tables imbriquées Professeurs et Formations dans la
table Cours
NumC Titre Professeurs Formations
Nom Spécialité Filière Horaire

create type p r o f t y p e as o b j e c t
( nom v a r c h a r 2 ( 3 0 ) , s p e c i a l i t e v a r c h a r 2 ( 3 0 ) )
/
create type p r o f s t y p e as t a b l e of p r o f t y p e
/
create type f o r m a t i o n t y p e as o b j e c t
( f i l i e r e v a r c h a r 2 ( 3 0 ) , h o r a i r e number ( 5 ) )
/
create type f o r m a t i o n s t y p e as t a b l e of f o r m a t i o n t y p e
/

166/193
Plusieurs Tables imbriquées
Création
create type p r o f t y p e as o b j e c t
( nom v a r c h a r 2 ( 3 0 ) , s p e c i a l i t e v a r c h a r 2 ( 3 0 ) )
/
create type p r o f s t y p e as t a b l e of p r o f t y p e
/
create type f o r m a t i o n t y p e as o b j e c t
( f i l i e r e v a r c h a r 2 ( 3 0 ) , h o r a i r e number ( 5 ) )
/
create type f o r m a t i o n s t y p e as t a b l e of f o r m a t i o n t y p e
/
create type c o u r s t y p e as o b j e c t
( numc v a r c h a r 2 ( 5 ) , t i t r e v a r c h a r 2 ( 1 5 ) ,
professeurs profs type , formations formations type )
/
create table cours of cours type
( c o n s t r a i n t p k c o u r s p r i m a r y key ( numc ) )
n e st e d t a b l e p r o f e s s e u r s s t o r e as t a b p r o f s ,
n e st e d t a b l e f o r m a t i o n s s t o r e as t a b f o r m a t i o n s ;

167/193
Plusieurs Tables imbriquées
Insertion

Insertion d’un objet dans la table Cours, sans le lier à des


professeurs ou à des formations
i n s e r t i n t o c o u r s v a l u e s ( ’BD ’ , ’ B a s e s de Données ’ ,
profs type () , formations type ());

s e l e c t ∗ from c o u r s ;

NUMC TITRE PROFESSEURS(NOM, SPECIALITE ) FORMATIONS( FILIERE , HORAIRE )


−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
BD B a s e s de Données PROFS TYPE ( ) FORMATIONS TYPE ( )

168/193
Plusieurs Tables imbriquées
Insertion

Insertion, avec VALUES, dans 2 tables imbriquées :


i n s e r t i n t o c o u r s v a l u e s ( ’DW’ , ’ Data WareHouse ’ ,

p r o f s t y p e ( p r o f t y p e ( ’ Clémence ’ , ’BD ’ ) ,
p r o f t y p e ( ’ Adam ’ , ’BD ’ ) ) ,

f o r m a t i o n s t y p e ( f o r m a t i o n t y p e ( ’ Master1 ’ , 100) ,
f o r m a t i o n t y p e ( ’ DESS EID ’ , 2 0 0 ) ,
f o r m a t i o n t y p e ( ’DEA AIOC ’ , 2 0 0 ) ) ) ;

169/193
Plusieurs Tables imbriquées
Insertion

s e l e c t ∗ from c o u r s ;

NUMC TITRE PROFESSEURS(NOM, SPECIALITE ) FORMATIONS( FILIERE , HORAIRE )


−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
BD B a s e s de Données PROFS TYPE ( ) FORMATIONS TYPE ( )
DW Data WareHouse PROFS TYPE ( FORMATIONS TYPE(
PROF TYPE( ’ Clémence ’ , ’BD ’ ) , FORMATION TYPE( ’ M a s t e r 1 ’ , 1 0 0 ) ,
PROF TYPE( ’ Adam ’ , ’BD ’ ) ) FORMATION TYPE( ’ M a s t e r 2P ’ , 2 0 0
FORMATION TYPE( ’ M a s t e r 2R ’ , 2 0 0

170/193
Plusieurs Tables imbriquées
Insertion

Insertion, avec VALUES, dans 2 tables imbriquées


i n s e r t i n t o c o u r s v a l u e s ( ’BDA ’ ,
’ B a s e s de Données A v a n cé e s ’ ,

p r o f s t y p e ( p r o f t y p e ( ’ Clémence ’ , ’BD ’ ) ,
p r o f t y p e ( ’ T r a i f o r ’ , ’BD ’ ) ,
p r o f t y p e ( ’ Le Bon ’ , ’BD ’ ) ) ,

formations type (
f o r m a t i o n t y p e ( ’ M a s t e r 2P ’ , 2 0 0 ) ,
f o r m a t i o n t y p e ( ’ M a s t e r 2R ’ , 2 0 0 ) ) ) ;

171/193
Plusieurs Tables imbriquées
Insertion
Cours
NumC Titre Professeurs Formations
Nom Spécialité Filière Horaire
BD Bases de données
DW DataWareHouse Clémence BD Master 1 100
Adam BD Master 2P 200
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

L’affichage SQL+ est très mauvais ...


s e l e c t ∗ from c o u r s ;

NUMC TITRE PROFESSEURS(NOM, SPECIALITE ) FORMATIONS( FILIERE , HORAIRE )


BD B a s e s de Données PROFS TYPE ( ) FORMATIONS TYPE ( )
DW Data WareHouse PROFS TYPE (PROF TYPE( ’ Clémence ’ , ’BD ’ ) , PROF TYPE( ’ Adam ’ , ’BD ’ ) )
FORMATIONS TYPE(FORMATION TYPE( ’ M
FORMATION TYPE( ’ M a s t e r 2P ’ , 2 0 0 ) , FORMATION TYPE( ’ M a s t e r 2R ’ , 2 0 0 ) )
BDA B a s e s de Données A v a n cé e s PROFS TYPE (PROF TYPE( ’ Clémence ’ , ’BD ’ ) , PROF TYPE( ’ T r a i f
PROF TYPE( ’ Le Bon ’ , ’BD ’ ) )
FORMATIONS TYPE(FORMATION TYPE( ’ M
FORMATION TYPE( ’ M a s t e r 2R ’ , 2 0 0 ) )

172/193
Plusieurs Tables imbriquées
Insertion
Insertion, avec TABLE et VALUES, dans 2 tables imbriquées
Enregistrement des données : les professeurs Traifor et Parisi enseignent
les BD
i n s e r t i n t o t a b l e ( s e l e c t c . p r o f e s s e u r s from cours c
where numc = ’BD ’ ) v a l u e s ( ’ T r a i f o r ’ , ’ SI ’ ) ;
i n s e r t i n t o t a b l e ( s e l e c t c . p r o f e s s e u r s from cours c
where numc = ’BD ’ ) v a l u e s ( ’ P a r i s i ’ , ’DM’ ) ;

s e l e c t ∗ from c o u r s ;
NumC Titre Professeurs Formations
Nom Spécialité Filière Horaire
BD Bases de données Traifor SI
Parisi DM
DW DataWareHouse Clémence BD Master 1 100
Adam BD Master 2P 200
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

173/193
Plusieurs Tables imbriquées
Insertion
Insertion, avec TABLE et VALUES, dans 2 tables imbriquées
Le cours BD :
appartient au cursus INFO1
requiert un volume horaire de 70 heures
i n s e r t i n t o t a b l e ( s e l e c t c . f o r m a t i o n s from c o u r s c
where numc = ’BD ’ ) v a l u e s ( ’ INFO1 ’ , 7 0 ) ;

s e l e c t ∗ from c o u r s ;
NumC Titre Professeurs Formations
Nom Spécialité Filière Horaire
BD Bases de données Traifor SI INFO1 70
Parisi DM
DW DataWareHouse Clémence BD Master 1 100
Adam BD Master 2P 200
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

174/193
Plusieurs Tables imbriquées
Insertion

Insertion , avec TABLE et SELECT, dans 2 tables imbriquées

Le cours BD doit être enseigné désormais dans toutes les filières


concernées par la matière DW à condition que celle-ci aient un
volume de moins de 150 heures

i n s e r t i n t o t a b l e ( s e l e c t c . f o r m a t i o n s from c o u r s c
where c . numc = ’BD ’ )
select nestedf . f i l i e r e , nestedf . horaire
from t a b l e ( s e l e c t c . f o r m a t i o n s from c o u r s c
where c . numc = ’DW’ ) n e s t e d f
where n e s t e d f . h o r a i r e < 1 5 0 ;

175/193
Plusieurs Tables imbriquées
Insertion

s e l e c t ∗ from c o u r s ;

NumC Titre Professeurs Formations


Nom Spécialité Filière Horaire
BD Bases de données Traifor SI INFO1 70
Parisi DM Master 1
DW DataWareHouse Clémence BD Master 1 100
Adam BD Master 2P 200
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

176/193
Plusieurs Tables imbriquées
Modification – Exemple

Dans la matière Data WareHouse, le professeur Adam est remplacé


par le professeur Saitout et que les horaires pour le Master 2P
augmentent de 30%
u p d a t e t a b l e ( s e l e c t c . p r o f e s s e u r s from c o u r s c
where c . t i t r e = ’ Data WareHouse ’ ) n e s t e d p r f
s e t n e s t e d p r f . nom = ’ S a i t o u ’ where n e s t e d p r f . nom = ’ Adam ’ ;

u p d a t e t a b l e ( s e l e c t c . f o r m a t i o n s from c o u r s c
where c . t i t r e = ’ Data WareHouse ’ ) n e s t e d f r m
set nestedfrm . horaire = horaire ∗ 1.3
where n e s t e d f r m . f i l i e r e l i k e ’ M a s t e r 2P% ’ ;

177/193
Plusieurs Tables imbriquées
Modification

NumC Titre Professeurs Formations


Nom Spécialité Filière Horaire
BD Bases de données Traifor SI INFO1 70
Parisi DM Master 1
DW DataWareHouse Clémence BD Master 1 100
Saitou BD Master 2P 260
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

178/193
Plusieurs Tables imbriquées
Modification – Exemple

Explications :
Modification à l’aide de la commande UPDATE d’un ou
plusieurs attributs dans une des deux tables imbriquées de la
table cours
Modification d’un professeurs et une formation dans le cadre
d’une matière donnée : 2 requêtes UPDATE distinctes
(car les 2 tables imbriquées sont concernées)
Nécessite de recourir à un alias pour identifier l’objet dans la
table imbriquée

179/193
Plusieurs Tables imbriquées
Modification

Pour la matière DW, remplacement de la filière Master1 par la


filière MASTER 2 et enregistrement d’un volume horaire de 150
heures
u p d a t e t a b l e ( s e l e c t c . f o r m a t i o n s from c o u r s c
where c . t i t r e = ’ Data WareHouse ’ ) n e s t e d f r m

s e t nestedfrm . h o r a i r e = 150 , n e s t e d f r m . f i l i e r e = ’MASTER 2 ’


where n e s t e d f r m . f i l i e r e = ’ M a s t e r 1 ’ ;

180/193
Plusieurs Tables imbriquées
Modification

NumC Titre Professeurs Formations


Nom Spécialité Filière Horaire
BD Bases de données Traifor SI INFO1 70
Parisi DM Master 1
DW DataWareHouse Clémence BD MASTER 2 150
Saitou BD Master 2P 260
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

181/193
Plusieurs Tables imbriquées
Suppression
Suppression dans 2 tables imbriquées
Le professeur Parisi n’enseigne plus la matière BD. Enregistrement
de cette information
delete table ( select c . professeurs
from c o u r s c where c . numc = ’BD ’ ) n t
where n t . nom = ’ P a r i s i ’ ;

NumC Titre Professeurs Formations


Nom Spécialité Filière Horaire
BD Bases de données Traifor SI INFO1 70
Master 1
DW DataWareHouse Clémence BD MASTER 2 100
Saitou BD Master 2P 260
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

182/193
Plusieurs Tables imbriquées
Suppression
Suppression dans 2 tables imbriquées
La filière Master1 n’inclut plus la matière BD dans son cursus.
Enregistrement de cette information
delete table ( select c . formations
from c o u r s c where c . numc = ’BD ’ ) n t
where n t . f i l i e r e = ’ M a s t e r 1 ’ ;

NumC Titre Professeurs Formations


Nom Spécialité Filière Horaire
BD Bases de données Traifor SI INFO1 70

DW DataWareHouse Clémence BD MASTER 2 100


Saitou BD Master 2P 260
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

183/193
Plusieurs niveaux d’imbrication

NumC Titre Professeurs Formations


Nom Spécialité Filière Horaire Dates
Jour
BD Bases de données Traifor SI INFO1 70

DW DataWareHouse Clémence BD MASTER 2 100


Saitou BD Master 2P 260
Master 2R 200
BDA Bases de données avancés Clémence BD Master 2P 200
Traifor BD Master 2R 200
Le Bon BD

Oracle 8 ne permet pas d’implanter plusieurs niveaux d’imbrication


dans une table objet-relationnelle
?? dans oracle 9i et/ou 10g ??

184/193
Tableaux pré-dimensionnés (VARRAY)
VARRAY (Varrying ARRAY ) : collection ordonnée et limitée
d’éléments de même type
Si le nombre d’éléments maximum contenus dans une table
imbriquées est connu a priori
possibilité d’utiliser un tableau de type VARRAY à la place
d’une table imbriquée
Exemple : stockage de 3 numéros de téléphone maximum par
professeur
Professeurs :
NumP NomP Adresse Téléphones
AdrNum AdrRue AdrVille AdrCP NumTel

185/193
Tableaux de taille pré-dimensionnée (VARRAY)
Exemple
Stockage de 3 numéros de téléphone maximum par professeur

Création
create type AAdresse type as o b j e c t
( AdrNum v a r c h a r 2 ( 1 0 ) , AdrNom v a r c h a r 2 ( 3 0 ) ,
A d r V i l l e v a r c h a r 2 ( 2 0 ) , AdrCP v a r c h a r 2 ( 5 ) )
/
create t y p e t e l t y p e a s o b j e c t ( NumTel v a r c h a r 2 ( 2 0 ) )
/

create type t e l s t y p e as v a r r a y (3) of t e l t y p e


/

create type p r o f e s s e u r t y p e as o b j e c t
( nump v a r c h a r 2 ( 5 ) , nomp v a r c h a r 2 ( 2 0 ) ,
Adresse AAdresse type , Telephones t e l s t y p e )
/
create table professeurs of professeur type
( c o n s t r a i n t p k p r o f e s s e u r s p r i m a r y key ( nump ) ) ;

186/193
Tableaux de taille pré-dimensionnée (VARRAY)
Insertion : INSERT avec VALUES
Stockage de 3 objets de type Professeur avec respectivement aucun,
trois et deux numéros de téléphone (enregistrements du VARRAY)
i n s e r t i n t o p r o f e s s e u r s v a l u e s ( ’ P1 ’ , ’ Clémence ’ ,
A A d r e s s e t y p e ( 7 , ’ Avenue de l a P a i x ’ , ’ P a r i s ’ , ’ 75009 ’ ) ,
tels type ());

i n s e r t i n t o p r o f e s s e u r s v a l u e s ( ’ P2 ’ , ’ Adam ’ ,
A A d r e s s e t y p e ( 7 7 , ’ Rue de l a l i b e r t é ’ , ’ P a r i s ’ , ’ 75015 ’ ) ,
t e l s t y p e ( t e l t y p e ( ’ 01 53 80 07 99 ’ ) ,
t e l t y p e ( ’ 06 14 56 07 06 ’ ) ,
t e l t y p e ( ’ 01 49 40 07 40 ’ ) ) ) ;

i n s e r t i n t o p r o f e s s e u r s v a l u e s ( ’ P3 ’ , ’ S a i t o u ’ ,
A A d r e s s e t y p e ( 1 , ’ Rue de l a l i b e r t é ’ , ’ P a r i s ’ , ’ 75015 ’ ) ,
t e l s t y p e ( t e l t y p e ( ’ 01 53 80 53 80 ’ ) ,
t e l t y p e ( ’ 06 14 56 14 77 ’ ) , NULL ) ) ;

187/193
Tableaux de taille pré-dimensionnée (VARRAY)

NumP NomP Adresse Téléphones


AdrNum AdrRue AdrVille AdrCP NumTel
P1 Clémence 77 Avenue de la paix Paris 75009 NULL
NULL
NULL
P2 Adam 7 Rue de la liberté Paris 75015 01 53 80 07 99
06 14 56 07 06
01 49 40 07 40
P3 Saitou 1 Rue de la liberté Paris 75015 01 53 80 53 80
06 14 56 14 77
NULL

188/193
Tableaux de taille pré-dimensionnée (VARRAY)
Insertion : INSERT dans un VARRAY avec PL/SQL
Avec les tableaux VARRAY, l’opérateur TABLE n’est pas
opérationnel (Version 8 d’oracle – à vérifier sur les V9 et V10g)
Pour manipuler les tableaux, il est nécessaire d’utiliser un
programme PL/SQL

DECLARE
n e w t e l s t e l s t y p e := t e l s t y p e ( t e l t y p e ( ’ 01 55 55 55 55 ’ ) ,
t e l t y p e ( ’ 06 06 98 98 98 ’ ) ,
t e l t y p e ( ’ 01 40 40 40 40 ’ ) ) ;
BEGIN
update p r o f e s s e u r s
set telephones = new tels
where nump = ’ P1 ’ ;
END;
/

189/193
Tableaux de taille pré-dimensionnée (VARRAY)
NumP NomP Adresse Téléphones
AdrNum AdrRue AdrVille AdrCP NumTel
P1 Clémence 77 Avenue de la paix Paris 75009 01 55 55 55 55
06 06 98 98 98
01 40 40 40 40
P2 Adam 7 Rue de la liberté Paris 75015 01 53 80 07 99
06 14 56 07 06
01 49 40 07 40
P3 Saitou 1 Rue de la liberté Paris 75015 01 53 80 53 80
06 14 56 14 77
NULL

Remarque :
Insérer un seul numéro de téléphone pour le professeur P1 et
le placer au 2ème rang dans le tableau telephones
Rédaction ci-dessous de l’instruction d’affectation :
n e w t e l s t e l s t y p e := t e l s t y p e (NULL ,
t e l t y p e ( ’ 06 06 98 98 98 ’ ) , NULL ) ;

190/193
Conclusion
Comparaison entre NESTED TABLE et VARRAY

A vérifier selon les versions d’Oracle


Possibilité de définir un index dans un NESTED TABLE
Le nombre d’éléments n’est pas limité dans une table
imbriquée
Pas de possibilité de définir d’index dans un VARRAY
Le nombre d’éléments est limité dans une tableau
pré-dimensionné
Possibilité d’accéder directement aux enregistrements stockés
dans les deux structures de données
fonctions : EXISTS, FIRST, LAST, etc.
Performances ? : NestedTable > Varray

191/193
Bilan

192/193
To be continued...

193/193

Vous aimerez peut-être aussi