L'objet Relationnel
L'objet Relationnel
L'objet Relationnel
Citroën 2CV
Objet Personne 3
Les concepts
• Extensibilité des types de données
– Définition de types abstraits
– Possibilité de types avec ou sans OID
• Support d’objets complexes
– Constructeurs de types (tuples, set, list, …)
– Utilisation de référence (OID)
• Héritage
– Définition de sous-types
– Définition de sous-tables
4
Le modèle SQL3 (ANSI99)
Extension objet du relationnel, inspirée de C++
– type = type abstrait de données avec fonction
– objet = instance de type référencée par un OID (défaut)
– collection = constructeur de type
• table, tuple, set, list, bag, array
– fonction
• associée à une base, une table ou un type
• écrite en SQL, SQL3 PSM (Persistent Stored Module)
ou langage externe (C, C++, Java, etc.)
– sous-typage et héritage
– association = contrainte d'intégrité inter-classe 5
Types atomiques (SQL3 Oracle)
• Types atomiques
– Varchar2(<longueur>)
– Number(<longueur>)
– Date
Ex :
create type nsecu varchar2(15);
create type taille number(3) ;
create type datenais Date;
6
Types objet (SQL3 Oracle)
Types objet
Create type <nom-type> as Object (
(<nom-attribut> [ref] <type>, )+
(<declaration-methodes>,)*
);
Ex :
create type personne as Object (
nom Varchar2(10),
nss nsecu, % type défini par l’utilisateur
datenais Date) ;
7
Types ensemblistes (SQL3 Oracle)
Types ensemblistes :
– Table (ensemble avec doublons)
– Varray (collection ordonnée avec doublons)
Create type <nom-type> as
(Table | Varray(<longueur>)) of <type>;
Ex:
create type retraités as Table of
personne;
create type centenaires as Varray (50)
of personne ;
8
Méthodes (déclaration)
• Fonctions ou procédures associées à un type d’objet.
• Modélisent le comportement d’un objet
• Ecrites en PL/SQL ou JAVA, et sont stockées dans la
base.
10
Exemple
create type personne as Object (
nom Varchar2(10),
nss nsecu,
datenais Date,
member function age return Number) ;
- comme n-uplet,
12
Exemple
Stockage d’objet comme n-uplet :
Remarques :
- On déclare des ‘nested table’ pour le type ensembliste table
uniquement;
- Pas de ‘nested table’ pour le type ensembliste Varray.
- On déclare une ‘nested table’ pour chaque champ ensembliste de la
table.
14
Exemple
Create type ens-enfants as table of personne;
15
Références (type REF)
• Le type REF est un pointeur logique sur un objet. Il
permet de référencer un objet par son OID (permet le
partage d’objets). L’objet peut être consulté, modifié.
19
Obtenir une REF à un objet
Create table LesPersonnes of type personne;
21
Fonction Deref
• Il n’est pas possible de naviguer via les références dans les
procédures PL/SQL. On utilise alors la fonction deref, qui
prend une référence à un objet et renvoie sa valeur.
Declare
p1 Personne;
Begin
Select deref(p.conjoint) into p1 from
dual;
...
End;
22
Sous-typage et héritage
create type personne
(nom varchar2(10), adresse varchar2(30), datenais
date) ;
23
Langage de requête
Standard SQL étendu à l’objet-relationnel :
SELECT [distinct] … FROM … [WHERE …]
24
Exemple
create type adresse as object
(num number, rue varchar2(20), ville
varchar2(20));
create type personne as object
(nom varchar2(10), habite adresse,
datenais date) ;
create table LesPersonnes of personne;
Remarque : la notation pointée ne peut être utilisée que pour les associations 1-1
28
(pas de collection)
Appels de méthode
• Type avec méthode
create type personne as Object (
nom varchar2(10),
nss nsecu,
datenais Date,
member function age return Number) ;
create table LesPersonnes of personne;
• Appel de méthode
SELECT p.age
FROM LesPersonnes p
WHERE p.name = 'Joe‘;
29
Création d’instances
Les instances sont créées avec des instructions SQL (insert ou update).
insert into <table> values
(<constructeur>( <valeur>,<valeur> …));
Ex :
create type personne as object(
nom varchar2(10),
datenais date) ;
create table LesPersonnes of personne;
31
Création d’instances dans les collections(2)
create type musiciens as varray(10)
of personne;
create table stage (
lieu varchar(10),
date date,
participants musiciens);
33
Interroger des collections
create type ens-enfant as table of personne;
create type classe as Object (
niveau varchar2(10),
responsable varchar(20),
enfant ens-enfant) ;
create table LesClasses of classe
Nested table enfant store as les-enfants;
35
Expression Table
L’expression table peut contenir une sous-requête d’une collection.
Select *
From table (select c.enfant
from LesClasses c where niveau=‘CM1’)
Renvoie la collection des enfants du CM1
Remarques :
la sous-requête doit renvoyer un type collection
la clause select de la sous-requête doit contenir un seul attribut
la sous-requête doit renvoyer une seule collection
36
Mises à jour d’éléments d’une collection
38
Interrogation de collections imbriquées
create type ville as object (
nom varchar(20),
population number);
create type villes as table of ville;
create type region as object (
nom varchar(20),
agglomérations villes);
create type regions as table of region;
create table pays (nom varchar(15), reg regions, …);
La relation pays contient une table imbriquée de régions, chaque région ayant une
table imbriquée de villes.
La requête suivante donne le nom de toutes les villes :
Select v.nom
From pays p, table(p.reg) r,
table(r.agglomerations) v;
39
Mise à jour des collections
multiniveaux
Les modifications dans les collections multiniveaux peuvent être
faites de façon atomique, sur la collection en entier, ou sur des
éléments sélectionnés.
INSERT INTO pays
VALUES(‘France’,
regions (region(‘Auvergne’,
villes (ville(‘Clermont’,63),
ville(‘Moulins’,03))),
region(‘Rhône-Alpes’,
villes(ville(‘Chambéry’,73),
ville(‘Lyon’,69))
)
));
40
Insertion dans une table imbriquée
d’une table imbriquée
Ajouter une ville à une région.
On sélectionne la table imbriquée au niveau interne à l’aide d’une
sous-requête dans l’expression TABLE.
UPDATE pays p
SET p.regions = :v_regions
WHERE p.nom = ‘France’;
43