Professional Documents
Culture Documents
Chapitre 2-a
Les bases de données relationnelles objets
mohamedali.benhassine@fst.utm.tn
© Med Ali Ben Hassine 2017 (FST) 1
Introduction
2
Introduction
Sy
do
3
Le paradigme Objet : notion d'objet
Identité d’objet :
Chaque objet a une identité indépendante de sa valeur.
L’identificateur est géré par le système (correspond à une clef interne).
Deux objets sont identiques s’ils ont le même identificateur, et sont égaux
s’ils ont la même valeur.
Les objets peuvent être représentés par un graphe de composition, qui peut
comporter des cycles.
4
Le paradigme Objet : Classe
5
Le paradigme Objet : Encapsulation
6
Le paradigme Objet : Héritage
8
Le paradigme Objet : Surcharge & Polymorphisme
Surcharge
Le fait de redéfinir une propriété, dans une sous-classe, qui serait héritée
d'une superclasse.
Polymorphisme
Le fait de disposer d'opérations ayant un même nom mais avec des
paramètres différents en nombre et/ou en type.
Liaison dynamique
Mécanisme de sélection du code correspondant à l'opération concernée en
fonction des paramètres passés pendant l'appel.
9
BD Objet (BDO)
La différence essentielle entre les objets manipulés dans les programmes et
dans les BD est la persistance:
La durée de vie d'un objet dans une BD objet ne doit pas limitée à celle du
programme qui le crée.
Si on gère les objets par l'approche classique des fichiers, les programmes
deviennent très coûteux et ne permettent pas de gérer la concurrence.
La gestion des accès concurrents aux données est bien rodée dans les BD
BD Objets
Organisation cohérente d'objets persistants partagés par plusieurs utilisateurs
concurrents.
10
Les « Manisfesto »
Codd, 1969
Modèle relationnel
Codd, 1990
Modèle relationnel V2
11
L'Objet dans les BD : deux Approches
OODBMS SQL
SQL2
ODMG 93
ODMG II SQL3 SQL 2003, 2008, 2011
ODMG (97) ANSI X3H2
Convergence SQL4 ISO/IEC JTC1/ SC21/WG3
CA-Jasmine, ?
ObjectStore, O2, Oracle, Informix,
Versant, POET, ... Sybase, IBM, DB2,
CA-OpenIngres
12
Les Propriétés RICE (Miranda) 1,2
Réutilisation
Finalité du paradigme objet : héritage, généralité, composition, polymorphisme
Identification
Identifier un objet de manière unique
Complexité
définition de objets complexes et/ou fortement structurés
Encapsulation
boîte noire avec des méthodes de manipulation
13
Les Modèles Objets et les Propriétés RICE
15
LES BD RELATIONNELLES OBJETS
16
Introduction
17
Modèle de données NF2 (Non First Normal Form)
18
Exemple : la table Personne
{enfant} {voitures} …
Date_
Nom prénom
naissance
prénom_enfant Modèle photo année no
Tarek
2ch 1980 128
Salah
Ben
Ali 16-05-1963
Amor
Hajer
Riahi Rim 29-02-1944 GOLF 7 2013 17
Ines
19
Relationnel-objet ou Object Pure ?
Le relationnel-objet
Gère les bases relationnelles déjà en service, très nombreuses (le data legacy );
⇒ Capitalise sur les acquis permettant une migration évolutive (en douceur) du SGBDR vers l’objet.
Conserve les notions de tables comme container d’objets.
Permet l'encapsulation des données : implémentation de l’interface (des méthodes)
⇒ Moins de jointures, références directes ⇒ Meilleures performances ! (en théorie)
Permet de définir de nouveaux types utilisateur simples ou complexes (ADT)
Concepts NF2 : structure complexe avec collection +
Possibilité de référencer les données (similaire à la notion d'oid)
Extensions du langage SQL (SQL3) pour la recherche et la modification des données
L’objet pure
Manque de normalisation pour les SGBDO / trop de solutions propriétaires.
SGBDOO moins souple que le relationnel pour s’adapter à plusieurs applications et
à l’augmentation de charge.
Peu d'informaticiens formés aux SGBDO. 20
Les problèmes de l'OR
21
SQL99 (SQL3)
Cette partie du cours s’appuie autant que possible sur les spécifications de SQL99.
Le langage SQL99 ajoute à SQL2 des variables et instructions de contrôle pour en
faire un langage procédural complet ; ce cours ne porte pas sur ces extensions.
Les exemples concrets sont donnés dans le langage SQL de la version 10g
d’Oracle ; les différences avec SQL99 seront signalées.
SQL3 intègre les 2 Manifestes OR ! Avec 2 possibilités de créer des CLASSES
d OBJETS
CREATE TYPE (« Date »)
CREATE TABLE (« Stonebraker »)
22
Concepts SGBDRO (Oracle)
Le modèle géré par Oracle (8i, 9i, 10g et +) est dit OR parce qu'il peut
gérer simultanément les modèles relationnel et objet . Il est hybride !!
●Persistance ●Objet
●Gestion du disque ● Encapsulation
●Partage des données ● Identité complexe
●Fiabilité ● Identité d’objet
●Sécurité ● Classe Table
●Langages de requête d'objet
●Indépendance Logique ●Héritage
/ Physique ● Redéfinition
Extension de SQL
Définition des types complexes avec héritage
Appels de méthodes en résultat (Select) et qualification (Where)
Imbrication des appels de méthodes
Surcharge d'opérateurs 23
Le SGBDRO Oracle
Pas de classe
Il faut créer un type abstrait de données (TAD), puis une table ayant ou
utilisant ce type.
Implémentation des méthodes liées au TAD
25
1. Les TAD
26
1. Les TAD
27
1. Les TAD
28
1. Les TAD
Construction
1. Création d'un type,
2. Création d'une table contenant ce TAD.
29
1. Les TAD
1.1 Composition de types Utilisation du type dans un autre type
personne_t
noP nomP prénomP date_naissance voiture_t
modèle année no 30
1. Les TAD
1.1 Composition de types
Instances de TAD
Une table d’un TAD est une table d’objets.
Uniquement créable avec la commande :
Attention,
Les autres tables (non directement construite sur un TAD) ne sont pas
des tables d’objets.
Les instances des autres tables n’ont pas d’oid sortie de leur table.
● portée de l’oid locale à la table.
31
1. Les TAD
1.1 Composition de types Création d'une table non typée
Personnes
noP nomP prénomP date_naissance voiture : voiture_t
modèle année no
32
1. Les TAD
1.1 Composition de types Insertion dans une table non typée
Personnes
voiture : voiture_t
noP nomP prénomP date_naissance
modèle année no
101 Riahi Khalil 16-05-1963 2ch 1975 12
33
1. Les TAD
1.1 Composition de types Insertion dans une table non typée
34
1. Les TAD
1.1 Composition de types Création d'une table d'objets
La table Personnes a une colonne supplémentaire invisible, gérée par le SGBD qui
contient l'oid de chaque objet. 35
1. Les TAD
1.1 Composition de types Insertion dans une table d'objets
36
1. Les TAD
1.1 Composition de types Insertion dans une table d'objets
A chaque TAD créé est associé un constructeur (même fonctionnement qu’en BDOO)
du même nom que le TAD (obligatoire de donner une valeur à tous les attributs).
⇒ Insertion des données dans une table avec TAD :
Personnes
personne_t
Table Personnes :
noP nomP prénomP date_naissance voiture: voiture_t
(select * from Personnes)
modèle année no
101 Riahi Khalil 16-05-1963 2ch 1975 128
102 Sassi Heithem 29-02-1944 Megane 1998 371
37
1. Les TAD
Exemple :
TAD personne_t utilise voiture_t, et TAD voiture_t utilise personne_t.
38
Différences entre table typée et non typée du OR
Table typée réfère à un stock non ordonné d'objets (avec chacun un oid). Chaque
objet peut avoir en plus une ou plusieurs colonnes d'objets (objets-colonnes).
2 tables possibles:
Create table Personnes of personne_t; -- (table typée )
Tuple de la table typée est un objet avec son oid.
Create table Personnes (matricule int, nom varchar(50), voiture voiture_t);
(table non typée, non 1FN)
Tuple de la table non typée a un rowid seulement
Objet de colonne (OC) : instance de voiture_t dans un tuple de Personnes (sans
OID propre). Il est persistant via l'objet hôte. C'est une caractéristique de l’OR et
non pas de l’OO.
39
Différences entre table typée et non typée du OR
Evolutivité plus difficile avec table typée : Ajout de âge dans la table typée
Personnes Répercussion possible sur d’autres tables utilisant le type
personnne_t ou sur un autre type défini avec personne_t (sous-type).
CREATE TABLE Personnes OF personne_t;
ALTER TYPE personne_t ADD attribute âge int default 999;
ALTER TYPE personne_t MODIFY attribute âge char(2);
Seule la table typée peut avoir des méthodes (Member Procedure) :ajout et
suppression d’une méthode;
ALTER TYPE personne_t ADD Member Procedure ajouter(n IN number);
ALTER TYPE personne_t DROP Member Procedure ajouter;
40
Utilisation d’un type partagé entre utilisateurs et DBA
Ali veut créer un type gerant_t en utilisant dans sa définition le type créé par Hajer:
Pour créer des types, Ali doit avoir l’autorisation ou le privilège du DBA :
41
1. Les TAD
1.2 Les collections
Personnes
lesEnfants :{ } voiture
noP nomP prenomP date_naissance
noE prenomE ageE modèle année no
1 Sarra 12 2ch 1975 128
101 Riahi Khalil 16-05-1963
2 Hajer 15 407 2011 280
102 Sassi Heithem 6 Med 16 29-02-1944 Megane 1998 371
42
1. Les TAD
1.2 Les collections - VARRAY
Manipulation :
dans une requête SQL, on manipule le VARRAY entier
dans un bloc PL/SQL, on manipule des éléments particuliers du VARRAY
43
1. Les TAD
1.2 Les collections - VARRAY
44
1. Les TAD
1.2 Les collections - VARRAY
Là encore on utilise le constructeur pour les listes :
Personnes
lesEnfants :{ } voiture
noP nomP prenomP date_naissance
noE prenomE ageE modèle année no
1 Sarra 12
101 Riahi Khalil 16-05-1963 2ch 1975 128
2 Hajer 15
102 Sassi Heithem 6 Med 16 29-02-1944 Megane 1998 371
La lecture est possible avec SQL mais pas la mise à jour et la suppression.
45
1. Les TAD
1.2 Les collections - VARRAY
La lecture est possible avec SQL mais pas la mise à jour et la suppression.
Select P.lesEnfants From Personnes P ;
LESENFANTS(NOE, NOME, AGEE)
LESENFANTS_T(ENFANT_T(1, 'Sarra', 12))
LESENFANTS_T(ENFANT_T(2, 'Hajer', 15))
LESENFANTS_T(ENFANT_T(6, ‘Med', 16))
-- Applicatif PL/SQL pour afficher le no des enfants assurés par la personne 101
Declare
v_tableauE lesEnfants_t ;
Begin
Select P.lesEnfants into v_tableauE
From Personnes P Where P.noP = 101;
For i IN 1..v_tableauE.COUNT Loop
IF v_tableauE.EXISTS(i) Then
DBMS_OUTPUT.PUT_LINE (v_tableauE(i).noE);
End IF;
End Loop; 1
End; 2
/ Procédure PL/SQL terminée avec succès .46
1. Les TAD
1.2 Les collections - VARRAY
Declare
v_tableauE lesEnfants_t ;
Begin
Select P.lesEnfants into v_tableauE From Personnes P Where P.noP =102;
DBMS_OUTPUT.PUT_LINE (v_tableauE(1).noE ||' ' ||
v_tableauE(1).nomE) ;
End;
/
Réponse:
6 Med
Procédure PL/SQL terminée avec succès.
47
1. Les TAD
1.2 Les collections - VARRAY
-- Modification de l’attribut d’un objet-colonne (ageE)
Exemple: Sarra titulaire du numéro 1 (fille de Khalil), a 26 ans plutôt que 12.
Pour modifier un objet ayant un attribut de type varray, il faut lire l’objet , le
mettre à jour dans l’applicatif PL/SQL et l’insérer à nouveau dans la base-objet.
Declare
v_tableauAssur assurance_t; -- type des objets de la table
v_lesEnfants lesEnfants_t; -- type varray
Begin
Select P.lesEnfants into v_lesEnfants From Personnes P
Where P.noE = 101;
v_lesEnfants(1).ageE := 26; -- mise à jour de l’objet-colonne
Update Personnes a SET a.lesEnfants = v_lesEnfants Where a.noP = 101;
End;
/
sqlplus: select lesEnfants from Personnes;
LESENFANTS(NOE, NOME, AGEE)
LESENFANTS_T(ENFANT_T(1, 'Sarra', 26), ENFANT_T(2, 'Hajer', 15),)
LESENFANTS_T(ENFANT_T(6, 'Med', 16))
48
1. Les TAD
1.2 Les collections - Nested Table
Personnes
lesEnfants :{ } Voitures :{}
noP nomP prenomP date_naissance
noE prenomE ageE modèle année no
1 Sarra 12 2ch 1975 128
101 Riahi Khalil 16-05-1963
2 Hajer 15 407 2011 280
102 Sassi Heithem 6 Med 16 29-02-1944 Megane 1998 371
49
1. Les TAD
1.2 Les collections - Nested Table
– INSERT INTO Table (select p.voitures from Personnes p where p.nom= ‘Riahi’)
VALUES (‘206’, ‘2000’, 3);
Insertion d'un objet sans valeur dans la table imbriquée (vide au début)
Pour parcourir des collections libres ou liées : voir une collection comme une table.
THE (SQL3) ou TABLE (Oracle) est une fonction qui retourne un seul
objet (colonne). C'est l'opération Unnesting !
THE désigne une table imbriquée et apparaît dans une clause FROM.
THE est suivi :
d'une requête ne renvoyant qu'un seul objet,
d'un alias (pas de manipulation directe avec THE)
Select v.No
from THE (select p.voitures
from personnes p
where p.nomP='Riahi') v
La sous requête (THE) fournit la table d'objets (références) de la sous-table associée à
personnes 'Riahi' 53
1. Les TAD
1.2 Les collections - Nested Table
Personnes
lesEnfants :{ } voiture
noP nomP prenomP date_naissance
noE prenomE ageE modèle année no
1 Sarra 12 2ch 1975 128
101 Riahi Khalil 16-05-1963
2 Hajer 15 407 2011 280
102 Sassi Heithem 6 Med 16 29-02-1944 Megane 1998 371
55
1. Les TAD
1.2 Les collections
Impossible dans l'absolu, mais des tableaux fixes (Varray) peuvent être
imbriqués grâce aux références.
Create type panne_t as object ( typep varchar2(20), datep date, detail varchar2(200)); /
Create type pannes_t as Varray(10) OF REF panne_t; /
Create type voiture_t as object (modele varchar2(15), annee date, no integer,
sespannes pannes_t); /
Create type voitures_t as Varray(10) OF REF voiture_t;/
REMPLACE "Create type liste_voiture_t as Varray(10) of voiture_t"
57
1. Les TAD Varray vs. Nested Table
1.2 Les collections
L’insertion, mise à jour, suppression et autres opérations avec ces types complexes
exigent l'emploi de méthodes qui seront étudiées ultérieurieurement.
58
1. Les TAD
Les contraintes définies au niveau des tables
59
1. Les TAD
1.3 Les références - Type REF
On peut indiquer dans la définition d’un type qu’un attribut contient des
références (et non des valeurs) à des données d’un autre type ; la syntaxe
est « REF nom-du-type » :
60
1. Les TAD
1.3 Les références - Type REF
Un attribut peut avoir un type REF ce qui signifie qu’il est valué avec
une référence (qui pointe) à un autre objet et qui inclut l'oid de l'objet
ciblé d'une table typée.
C'est une référence vers un objet, construit avec l'oid (+ le rowid)
Le oid (son identité) est de préférence (ou devrait) être non visible (variable
selon les implémentations);
Le REF permet de :
implanter le lien externe du Mnav (une représentation graphique du MOR)
améliorer la fonction de navigation avec le langage SQL (Par exemple,
accélérer les jointures).
61
1. Les TAD
1.3 Les références - Type REF
Une valeur de type REF réfère seulement à un objet de table; elle inclut
l'oid de l'objet ciblé, lequel est stocké dans une table-objet. L’objet colonne
n’a pas de oid.
Dans ce cours et par convention volontairement abusive :
Valeur Ref sera considérée idem à l'oid
Objet de travail: Il est toujours possible de créer un objet sans oid (Oracle).
C'est le cas de l'objet créé par le NEW() de PL/SQL qui génère un objet de
travail non persistant puisque pas encore chargé dans une table.
62
1. Les TAD
1.3 Les références – Fonction DEREF()
La fonction REF(x), ou x est un objet, rend l'oid de l'objet x.
De façon similaire, la fonction DEREF(a), où a est un oid, rend l'objet correspondant et l'assigne à une
variable du type.
Exemple PL/SQL:
Declare
vref REF client_t;
v_client client_t;
Begin
Select REF(x)
Into vref
From Client x
Where x.matC = 10000;
Select DEREF(vref)
Into v_client
From Dual;
DBMS_OUTPUT.PUT_LINE(v_client.nomC);
End;
/
63
1. Les TAD
1.3 Les références
Référencer une voiture dans une table sans l’expliciter à chaque fois.
Attention, impossible de référencer une collection !
64
1. Les TAD
1.3 Les références - Exemple
Référencer la voiture d’une personne :
Create type voiture_t as object (modele varchar2(15), annee date, No number)
/
Personnes : personne_t
Voitures : voiture_t
noP number
nomP : varchar(20) modele : varchar2(15)
prenomP : varchar(20) annee : Date
lesEnfants: {lesEnfants_t} No : number
date_naissance : Date
voiture
Create table Voitures of voiture_t;
Create or replace type personne_t as object
(noP number, nomP varchar2(15), prénomP varchar2(15),
lesEnfants lesEnfants_t,
-- Rq : impossible de référencer une collection !
-- lesEnfants REF les Enfants_t est illégal.
date_naissance Date,
voiture REF voiture_t)
/
Create table Personnes of personne_t;
65
1. Les TAD
1.3 Les références – Exemple (suite)
Personnes : personne_t
Voitures : voiture_t
noP number
nomP : varchar(20) modele : varchar2(15)
prenomP : varchar(20) annee : Date
lesEnfants: {lesEnfants_t} No : number
date_naissance : Date
voiture
Select p.nom, p.date_naissance
From Personnes p
Where p.voiture.modele = ‘Golf-6';
voiture est un attribut de Personnes de type REF référant à une autre table
typée Voitures.
67
1. Les TAD
1.3 Les références – Insertion avec références
personne_t
lesEnfants
noP nomP prénomP date_naissance @voiture
{lesEnfants_t}
voiture_t
Voitures
modèle année no
voiture_t
modèle année no
2ch 1975 128
Megane 1998 371
Personnes
lesEnfants :{ }
noP nomP prenomP date_naissance @voiture
noE prenomE ageE
1 Sarra 12
101 Riahi Khalil 16-05-1963
2 Hajer 15
102 Sassi Heithem 6 Med 16 29-02-1944 68
1. Les TAD
1.3 Les références – Requêtes avec références
Personnes
lesEnfants :{ }
noP nomP prenomP date_naissance @voiture
noE prenomE ageE
1 Sarra 12 03F43970135A39847C…
101 Riahi Khalil 16-05-1963 -- adresse du pointeur.
2 Hajer 15
Ne veut rien dire!
102 Sassi Heithem 6 Med 16 29-02-1944 03F43970135A39848E…
Changer de voiture :
UPDATE Personnes p SET p.voiture =
(SELECT REF(v) FROM Voitures v WHERE v.modele = ‘Mégane’)
WHERE p.noP = 101;
71
1. Les TAD
1.3 Les références – Références du Vide
Exemple :
Update Personnes set voiture = NULL
Where voiture IS DANGLING
73
1. Les TAD
1.3 Les références – Limitation de portée d'une référence
CREATE type etudiant_t (no NUMBER, bac REF bac_t, adr adr_t)
CREATE type bac_t (nomB CHAR(20), anCreationB DATE,
moyResultats99 NUMBER)
75
1. Les TAD
1.3 Les références – Avantage du REF dans une recherche
76
1. Les TAD
1.3 Les références – Le type REF et le swizzling
L'OID est muté en pointeur physique dans la RAM (dès la 1ère lecture
de l’objet): c'est la transformation ou mutation des Refs (le swizzling).
le swizzling accélère l'accès aux objets. Cette transformation est gérée par le SGBD. 77
Comparaison entre la référence et le oid
78
1. Les TAD
1.3 Implémentation de la contrainte référentielle en OR
80
Contrainte référentielle en OR
81
Contrainte référentielle en OR (Exemple avec table typée)
82
Suite … Intégrité référentielle avec les oid et table typée
DELETE from Atelier where nomA ='AtelierTunis'; -- cet objet existe est supprimé!
84
Cohérence référentielle du parent avec une table typée
85
Suite … Intégrité référentielle avec une table non typée
Toute suppression d'un atelier met à null la ref des ouvriers qui y travaillent.
Cette action référentielle exige la suppression de la contrainte c1 qui est
contradictoire avec la sémantique de l’action SET NULL.
89
LMD et TAD
90
Création des objets: NULL et VIDE dans PL/SQL
CREATE TYPE voiture_t AS OBJECT (modele varchar2(15), annee date, no integer)
/
CREATE TYPE personne_t AS OBJECT (noP number, nomP varchar2(15), prenomP
varchar2(15), date_naissance date, voiture voiture_t)/
Update Personnes p SET p.voiture = voiture_t(‘2ch’, null, null) Where p.noP = 104;
102 Sassi Heithem 29-02-1944 -- voiture_t (‘2ch’, NULL, NULL) -- OC est mis à jour
Mise à jour de l'objet OT 101 avec création de l’objet colonne OC (noP = 101)
Update Personnes p SET p.voiture = voiture_t(‘2ch’, null, null) Where p.noP = 101;
Mise à jour impossible ***
noP nomP prenomP date_naissance voiture (modèle, année, no)
102 Sassi Heithem 29-02-1944 -- voiture_t (NULL, NULL, NULL)
l'OC est possible et ses méthodes deviennent celles de la nouvelle table objet.
Les méthodes propres au type voiture_t ne s'appliquent pas à un objet vide, v !
Les méthodes de voiture_t peuvent s'appliquer aux objets nuls et les objets
initialisés à la création.
94
Dictionnaire des objets
Modification d’attribut ….
Ajout : Alter type personne_t ADD attribute sexe varchar2(10) Cascade;
* Cascade pour répercuter ce changement pour tous les types qui utilisent le type personne_t;
Seules la table typée peut avoir des méthodes (member procedures) : modifications possibles
(insertions, suppressions, modifications)
Options:
INCLUDING TABLE DATA : entraîne la conversion des données selon le type modifié
NOT INCLUDING TABLE DATA : le dictionnaire est modifié mais pas les données.
Ex: si un attribut est supprimé par un DROP, la colonne reste dans la base
(containeur) mais est marquée comme supprimée.
97
LDD et TAD
FORCE : force la suppression du type même si des objets l'utilisent; les objets
demeurent dans la BD mais deviennent inaccessibles;
VALIDATE : si ce type est un super_type alors il y a substitution de type.
98
Les méthodes
99
Accès à l'objet : encapsulation
La création, la suppression et la modification d'un objet doivent se faire
par le biais d'une méthode associée à l'objet via son type (classe).
Objet
L'accès aux objets avec le LMD est toujours possible, mais normalement
remplacé par les méthodes (donc accès direct interdit). Les méthodes font
appel aux ordres LMD sans restriction. 100
L'encapsulation
Dans Oracle, le droit d'accès est accordé à un utilisateur au regard d'un type et
l'utilisateur voit tous les attributs et méthodes du type sur lequel il a les droits.
Les méthodes sont associées aux données tandis que les fonctions et les
procédures SQL stockées sont rangées en dehors de toute association aux
types puisqu'elles sont stockées dans le dictionnaire et sont appelées pour
traiter les données peu importe leur origine.
Une méthode Oracle peut être une procédure ou une fonction PL/SQL (ou C, C++, Java,..)
101
1.4 Les méthodes
En principe, un objet de table–objet devrait se comporter comme un
véritable objet de classe et être accessible que par son interface.
1. Une signature est la liste typée de ses paramètres incluant celui de retour.
2. L’interface de classe est l'ensemble de ses signatures
Un objet-colonne est aussi un objet mais sans oid, Cet objet peut avoir sa propre interface. 102
1.4 Les méthodes
Avec
type1 ou type_var1 défini par l’utilisateur ou prédéfini
Nom_méthode différent de celui du TAD et de ses attributs.
103
1.4 Les méthodes (Corps )
Le code des méthodes (body) est définie séparément dans le corps du TAD.
Syntaxe : Create or replace type body nom_type as …
Si uniquement des attributs dans un TAD, corps inutile.
Possibilité d’utiliser le paramètre SELF dans le corps des méthodes (idem qu’en OO)
105
1.4 Les méthodes
Création d’un type avec son interface
L’âge sera calculé par la méthode GetAge sur appel par un objet ou une variable de type personne_t.
L'appel se fait par un objet (transitoire ou pas) de son type. Tous les attributs sont alors
visibles à une application.
106
1.4 Les méthodes
Création d’un type avec son interface
108
1.4 Les méthodes
Notes sur l'implémentation du corps du type: ajout des méthodes à un type
109
1.4 Les méthodes (Appel)
Avec notation pointée (comme pour les attributs)
Le select peut-être autorisé sans restriction, car il ne met pas en danger la
cohérence de la base. Sauf le Select …FOR UPDATE.
Chaînage des appels de méthodes possible
Exécution des méthodes de gauche à droite,
⇒ Pas d’appel à droite d’un appel de procédure
⇒ Si chaînage, la 1ère fonction doit renvoyer un objet pouvant être passé à la 2ème.
Exemple :
SQL> Select p.getAge()
From Personne p --alias nécessaire pour représenter l'objet
Where p.nasP = 2345;
P.GETAGE()
23
La fonction getAge() n’exige pas de curseur explicite puisque que le ResultSet ne contient
qu’un objet . Il faut donc faire une sélection avec la clé pour avoir qu'un seul objet dans la
réponse de la sélection.
Sans paramètre, les parenthèses sont quand même essentielles avec SQL (comme en Java) ,
tandis qu'elles sont absentes en PL/SQL. 110
1.4 Les méthodes (Appel)
111
1.4 Les méthodes
Méthode incluse dans le type
NB : L'évolution d'un type avec le ALTER change le type dans la base mais
pas celui placé dans la cache. Pour voir le changement, il faut vider la cache
en se déconnectant et en créant une nouvelle connexion (nouvelle session) !!
112
1.4 Les méthodes
Opérations légales sur les objets
Les méthodes sont associées aux objets et implémentent que les opérations
légales sur les objets de la table-objet tout en respectant les contraintes.
Une méthode peut être ajoutée par la suite à l’interface existante.
113
1.4 Les méthodes
Suppression et ajout des signatures et/ou des méthodes dans le type
Cascade sous-tend que la modification au type sera propagée aux sous-types d’une
hiérarchie d’héritage.
La suppression du body d’une signature doit cependant précéder celle d’une signature.
obligatoire
Ajout de la signature putDateNaiss:
Alter type personne_t ADD Member Procedure putDateNaiss Cascade;
Alter type personne_t COMPILE ; -- en l'absence de sa table-objet
114
1.4 Les méthodes
Sortes de méthodes (résumé)
Méthode MEMBER
Appel par une variable objet instanciée au préalable (usage du SELF
possible, voire nécessaire).
Les méthodes MEMBER :
function: Member nomFonction(…) RETURN type IS
... code de la fonction … RETURN var ou self
End;
procedure: Member nomProc (…) IS
... code de la procédure (PL/SQL, Java, …)
End;
115
1.4 Les méthodes
Méthode STATIC
Une telle méthode est invoquée par le nom du type et non pas par un objet.
L’appel est similaire à un appel de fonction ou de procédure classique.
Exemple d’appel: nom_type.nom_méthode (liste param)
Avantage ???
Il n’est pas nécessaire de créer un objet transitoire inutile pour appeler une méthode.
116
1.4 Les méthodes
Méthode STATIC
Une table-objet Labo existe et son type est labo_t, sans méthode constructor
(explicite) pour la création des objets.
Create or Replace Type labo_t as Object (noL int, nomL
varchar2(50), nbBrevet int,
STATIC Function changeNomL (nouvNomL IN varchar2, ancNomL
IN varchar2) RETURN number )
/
Create table Labo of labo_t;
La méthode changeNomL a une signature comprenant 2 paramètres IN et un
paramètre de retour pour la fonction. (Notez l’absence de la longueur du type)
Ajout d'un objet:
Insert into Labo values ( labo_t(50, 'nom1', 123)) ;-- constructeur implicite
117
1.4 Les méthodes
Méthode STATIC
Create or Replace type body labo_t as
STATIC Function changeNomL (nouvNomL IN varchar2, ancNomL IN varchar2)
RETURN number IS
Begin
Update Labo Set nomL = nouvNomL Where nomL = ancNomL;
Return 1; -- succès
End;
End;
/
Une méthode STATIC est appelée comme une fonction classique sans exiger la
création ou la recherche d'un objet pour l'appeler:
Appel dans un bloc PL/SQL
Declare -applicatif
res int; nomDuType.nomDeLaFonction
Begin
res := labo_t.changeNomL('nom2', 'nom1'); --retour 1si bien exécutée
If res = 1 Then COMMIT; Else ROLLBACK;
End if;
End;
/; 118
1.4 Les méthodes
Méthode Constructor
Méthode pour les objets non persistants et pour tout nouvel objet instancié
qui doit être initialisé par défaut.
Deux genres de constructeur d'objets
1. Par défaut (ou implicite ou attribute constructor) qui ne nécessite pas de définition
dans la classe et demande l’initialisation obligatoire de tous les attributs de
personne_t . Le constructeur porte aussi alors le nom du type.
Ex. NEW personne_t ( ….)
avec même nombre d’attributs et dans le même ordre
2. Explicite et concrétisé par une méthode constructor définie par l’utilisateur dans le
type de la classe , (le constructeur porte aussi le nom du type est connu comme le user-
defined constructor); Un constructeur explicite peut assumer des valeurs par défaut.
Ex. personne_t (….)
Le type du retour d’une méthode Constructor est celui de l'objet d'appel : SELF
Si aucun constructeur explicite n’est défini dans un type, alors la création
des objets est faite obligatoirement par le constructeur implicite, soit le nom
du type :
employe_t (345, 'Pierre', 2) pour un objet de la table
Employe (nas, poste, expProf).
120
1.4 Les méthodes
Définition de deux constructeurs
Il y a un taux horaire conventionné à 25DT si la ville n’est pas fournie ; sinon le taux horaire est 40DT.
La procédure calculSal a 1 ou 2 paramètres fournissant le salaire basé sur le taux horaire par défaut
(25DT) et effectue le calcul des charges
121
1.4 Les méthodes
Création d’objets avec un constructeur implicite surchargé
ERREUR à la ligne 1 :
ORA-04067: type body "ANGAM5.PERSONNEL_T" n'existe pas - non exécuté
ORA-06508: PL/SQL : unité de programme nommée :
"ANGAM5.PERSONNEL_T" introuvable
Absence du body ! Et de la table!
122
1.4 Les méthodes
Body des constructeurs surchargés
Create or Replace type body personnel_t as
Constructor Function personnel_t(nas int, nom varchar, ville varchar)
return SELF as Result IS
Begin
Self.nas := nas;
Self.nom := nom;
Self.ville := ville;
Self.tauxH := 40.00;
Return;
End;
Constructor Function personnel_t(nas int, nom varchar) return SELF as
Result IS
Begin
Self.nas := nas;
Self.nom := nom;
Self.ville := ‘inconnue’ ;
Self.tauxH := 25.00;
Return;
End; 123
1.4 Les méthodes
Body des constructeurs surchargés – suite -
Member procedure calculSal (s1 out real) IS
Begin
Null;
End;
124
1.4 Les méthodes
Ajout d’objets avec des constructeurs distincts
127
1.4 Les méthodes
Persistance des modifications
Plusieurs inconvénients :
choix précoce sur le fait que la méthode a un effet persistant ou non
on pourrait par exemple fournir systématiquement deux versions de
chaque procédure, une persistante et l’autre non.
128
Rappel: Accès aux méthodes par un utilisateur autre que le DBA
129
Attribution et révocation des privilèges
Chaque table-objet de la base est identifiée par un nom préfixé par le
compte du propriétaire:
User2:
Insert into dba.Usine values (usine_t(25, ‘Tunis’, 1200));
Il faut passer par les méthodes dont le droit d’exécution est donné par le DBA:
Grant Execute on usine_t to user2;
131
L'héritage
Pour créer un sous-type d'un type non final, il faut rajouter la clause
UNDER nom-sur-type. Le sous-type héritera alors des attributs et
méthodes du sur-type.
Attention, l'héritage multiple est interdit : un type ne peut avoir qu'un seul sur-type.
Il n’est pas possible de faire évoluer un type NOT FINAL en FINAL si ce type a des sous-types.
133
L'héritage
L’héritage est spécifié dans le type avec le CREATE TYPE :
Create type adr_t as object (no int, rue
varchar2(50), ville varchar2(50))
/
CREATE TYPE personne_t as Object (nas NUMBER,
nom VARCHAR(20), adr adr_t) INSTANTIABLE NOT
FINAL
/
CREATE TYPE chercheur_t UNDER personne_t
(sujet varchar2(50)) INSTANTIABLE FINAL
/
Create type etudiant_t UNDER personne_t (pgm
varchar2(50)) Final Instantiable;
/
Create Table Etudiant of etudiant_t ...
Create Table Chercheur of chercheur_t
(Constraint pk_Chercheur Primary key (nas));
Comment les objets de la hiérarchie sont-ils rangés? 134
L'héritage (Directive INSTANTIABLE)
Les directives INSTANTIABLE et NOT INSTANTIABLE indiquent la
capacité d’instancitation d’un type
Tous les types crées sont par défaut INSTANTIABLE
Chaque type dispose d’un constructeur permettant de créer des objets (persistants
ou non) à l’aide de la commande NEW ou au sein d’une commande INSERT.
La commande ALTER TYPE permet sous certaines condition de modifier les opérations FINAL et INSTATIABLE
Il n’est pas possible de faire évoluer un type INSTANTIABLE en NOT INSTANTIABLE si : des objets sont
rattachés au type (persistant ou non) ou si une table ou vue dépend du type
135
Rangement et Substitution de types : 2 cas
1) Les objets sont rangés (par 3 clauses INSERT) dans leur table respective:
les objets de type personne_t dans la table Personne
les objets de type chercheur_t dans la table Chercheur
les objets de type etudiant_t dans la table Etudiant
Trois tables distinctes et éventuellement dans des espaces de table distincts.
Insert into Personne values (personne_t(….));
Insert into Chercheur values (chercheur_t (….);
Insert into Etudiant values (etudiant_t( ….));
2) Les objets d’une hiérarchie peuvent être rangés dans une même table du
type de la racine par une clause DML Insert:
– Tous les objets : personne, chercheur et etudiant cohabitent dans le
containeur de la classe Personne et donc dans le même table-space
Create Table Personne of personne_t ;
Insert into Personne values (personne_t(….));
Insert into Personne values (chercheur_t (….);
Insert into Personne values (etudiant_t( ….)); 136
Substitution des types : cohabitation de divers objet
dans la même table
137
Structure de stockage des tables -objets dont les types sont
en relation d’héritage (cas sans substitution des types)
1. Chaque objet est rangé dans sa table et dans son espace de données propre.
(tablespace).
Pour fouiller tous les objets de la hiérarchie, une requête doit débuter par une
consultation du dictionnaire pour générer un plan d’exécution qui sous-tend le parcours
des 3 tables dans autant d’espaces de données utilisés par la hiérarchie.
138
Structure de stockage des tables
Cas avec substitution des types (cohabitation)
2. L’interrogation de la table T1 dont le type est la racine de la hiérarchie
d’héritage permet de fouiller aussi tous les objets des sous-tables de la
hiérarchie rangés dans la table T1 créée dans le tablesapce ts1.
Une requête sur T1 débute par une consultation du dictionnaire pour générer un plan
d’exécution qui sous-tend le parcours d’une seule table T1 rangée dans un seul espace de
données. T1 stocke tous les objets de la hiérarchie. 139
Insertion d’objets de types différents dans la même table-objet
(cohabitation dans la même table d’objets différents de la même hiérarchie)
Un chercheur étant une personne, cet objet peut alors être inséré dans la
table Personne malgré la différence dans la structure!
140
Sélection des objets de table à un niveau de la hiérarchie
lorsqu'il y a substitution des types d'objets de table
● Fonction IS OF
Traite à un niveau de la hiérarchie les objets pour sélectionner que ceux
des niveaux inférieurs de la hiérarchie (la racine étant le niveau 0).
141
Héritage de type et non pas de table (en Oracle)
Une table-objet typée avec un sous-type n'hérite pas des contraintes d'une
table parent-objet typée avec un sur-type (de la même hiérarchie).
Create table Personne of personne_t (
Constraint pk_personne Primary Key (nasP));
Cela est possible car la contrainte de clé primaire dans la table Personne n’est pas
l'objet d'un héritage entre les tables. --- l’héritage concerne les types et non les tables ---
142
Clin d’oeil sur la définition de l’héritage avec le LDD
Héritage (spécialisation et généralisation)
Create type personnel_t as Object (nas int, nom varchar(50), …) NOT Instantiable NOT final/
Create type enseignant_t as object UNDER personnel_t ( noCours int) Final Instantiable/
Create type chercheur_t as object UNDER personnel_t (nomLabo varchar2(50), nbArticle int) FINAL Instantiable /
NB : La surcharge (même nom mais signature différente dans la même classe ou non) et la redéfinition
(même signature mais body différent dans classes différentes) sont implémentées dans Oracle … qui
devient donc un peu plus OO. 143
Redéfinition (Overriding)
NOT FINAL : méthode dont le body peut être redéfini dans un sous-type (overriding).
146
Combinaisons possibles pour les types et méthodes
● Un type Not Instantiable n'a pas de valeurs pour ses attributs mais l'héritage de
ses attributs et méthodes est possible. Une méthode d'un tel type n'a pas de body.
● Dans une interface, une méthode Instantiable doit avoir un body pour traiter les objets.
● Le défaut *
148
Redéfinition du body de modif()
(conservation de la signature)
● Avant la création des body, les tables objets doivent être crées:
● Dans la sous-classe:
Le mot clé OVERRIDING signifie que cette méthode a un body
redéfini mais la signature héritée doit être exactement la même
Declare
e etudiant_t;
rep int;
Eu etudiantUniv_t;
Begin
Select value(o) into e From Etudiant o
where o.nasE = 1 ; --chargement d’un objet
rep := e.modif(200); -- modifie le pgm d'un étudiant.
Select value(ob) into eu from EtudiantUniv ob where ob.nasE =1;
rep := eu.modif(200);
End;
152
Surcharge : Exemple dans un héritage avec
une méthode STATIC
154
Appel de la méthode surchargée Affiche()
● L'appel est fait par un objet et c'est la signature qui permet d'obtenir le
bon body.
● Appel dans un bloc PL/SQL:
Begin
etudiantG_t.affiche(50,200); -- méthode affiche() dans le type etudiantG_t
END;
● Réponse:
Jamel
>> Procédure PL/SQL terminée avec succès.
155
Dictionnaire de données et les méthodes
● Dans la réponse:
Final: si la méthode peut être redéfinie: (Yes/No)
Overriding: indique que la méthode (corps) est redéfinie: (Yes/No)
Inherited: si la méthode est héritée d'un sur-type:(Yes/No)
156
Info du dictionnaire sur la hiérarchie des types
Personne-Etudiant-Employe
157
Conclusion : Relationnel vs Relationnel Objet
Le nombre de types dans le R est environ 15. EN OR, nombre illimité (!)
Le MR est basé que sur les valeurs pour matérialiser les associations entre
tables : partage d'attributs partageant un même domaine. Le RO utilise les
REF pour la navigation entre les tables et implémenter les associations.
A la création d'un objet (tupe avec oid), la persistance est assurée. Sans oid un
objet est transitoire!
160
Requête multitable avec
Exercice corrigé une solution relationnelle
161
Requête multitable avec
Exercice corrigé une solution relationnelle
Quelle est la longueur du segment sur lequel sont connectés les postes
W7 ? -- (avec jointure relationnelle explicite)
162
Requête multitable avec
Exercice corrigé une solution OR
163
Requête multitable avec
Exercice corrigé
une solution OR
Quelle est la longueur des segments sur lesquels sont connectés les
postes W7 ?
La formulation est légèrement plus simple et surtout, leur exécution plus rapide.164
Requête multitable avec une solution
Exercice corrigé OR : Table imbriquée de REF
165
Requête multitable avec une
Exercice corrigé solution OR : Table imbriquée
Création du schéma PTS avec une table imbriquée
Les types :
Create Type posteTravail_t as Object (noSerie varchar2(15),
adrIP varchar2(15), typePT varchar2(15)) /
Create Type poste_t as Object (refPT REF posteTravail_t) /
Create type lesPostes_t as TABLE OF poste_t /
Create type segment_t as Object (noS varchar2(15), nomS
varchar2(50), longS int, lesPostes lesPostes_t) /
Les tables:
Create table PosteTravail of posteTravail_t ;
Create table Segment of segment_t NESTED TABLE lesPostes Store
AS table_LesPostes ;
166
Requête multitable avec une
Exercice corrigé solution OR : Table imbriquée
Insertion dans la table imbriquée de Segment
Insert into PosteTravail values('p4', 344013, 'TX'); --relié au segment 130.40.30
168
Requête multitable avec une
Exercice corrigé
solution OR : Table imbriquée
Quelle est la longueur du segment sur lequel
sont connectés des postes de type TX ?
La réponse requiert un unnesting de la
sous-table avec jointure implicite:
169
Requête avec
Exercice corrigé association réflexive
Solution relationnelle
170
Requête avec
Exercice corrigé association réflexive
Solution relationnelle
171
Requête avec
Exercice corrigé association réflexive
Solution objet relationnelle : usage de REF
172
Requête avec
Exercice corrigé association réflexive
Solution objet relationnelle : Requête OR
173
Exercice corrigé Requête avec
association réflexive
Solution objet relationnelle : Requête OR
174
LES BD ORIENTÉES OBJETS
175