87
Page 1 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Module 3 Modèle Objet © Module 3 page 1 Modèle pour les Données non Normalisées Passage à la technologie objet de Oracle 2014-03-14 André Gamache, professeur associé Département d'informatique et de génie logiciel Faculté des sciences et de génie Université Laval. Québec, Qc, Canada, G1K 7P4 Courriel: [email protected] Modèle Objet (Oracle) Modèle Objet © Module 3 page 2 Modèle objet-relationnel (OR = relationnel + objet) Le modèle géré par Oracle est dit Objet-Relationnel parce qu'il peut faire cohabiter les modèles relationnel et objet . Il est hybride !! Seule la partie exclusivement objet sera utilisée. Avantages: - Gère les nombreuses bases relationnelles déjà en service (le data legacy ); - Conserve les notions de tables comme containeur d’objets. - Permet l'encapsulation des données : implémentation de l’interface (des méthodes) - Implémente les mécanismes associés à l'objet : héritage, redéfinition et surcharge. Normalise les accès sécurisés à la BD via les méthodes. - Capitalise sur les acquis (applications) permettant une migration évolutive du SGBD relationnel vers l’objet. Bémols et limites: - Objet est plus complexe découlant de structures disponibles dans les applications (langages de développement): usage d’outils de mapping des objets (JPublisher, …) - N'implémente pas l'héritage multiple. Idem pour Java sauf pour C++. Est-ce vraiment un inconvénient?? - N'est pas 100% conforme à la norme ODMG: ex. les structures d’ensemble limitées à 2 niveaux . Utilise la notion explicite de REF qui est en quelque sorte un pointeur logique lequel devrait être normalement être transparent au traitement.

3 Modele Objet

  • Upload
    ziedk

  • View
    34

  • Download
    0

Embed Size (px)

Citation preview

Page 1

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 1

Modèle pour les Données non NormaliséesPassage à la technologie objet de Oracle

2014-03-14

André Gamache, professeur associéDépartement d'informatique et de génie logicielFaculté des sciences et de génieUniversité Laval. Québec, Qc, Canada, G1K 7P4

Courriel: [email protected]

Modèle Objet (Oracle)

Modèle Objet © Module 3 page 2

Modèle objet-relationnel (OR = relationnel + objet)Le modèle géré par Oracle est dit Objet-Relationnel parce qu'il peut faire cohabiter les modèlesrelationnel et objet . Il est hybride !! Seule la partie exclusivement objet sera utilisée.Avantages:- Gère les nombreuses bases relationnelles déjà en service (le data legacy );- Conserve les notions de tables comme containeur d’objets.- Permet l'encapsulation des données : implémentation de l’interface (des méthodes)- Implémente les mécanismes associés à l'objet : héritage, redéfinition et surcharge.

Normalise les accès sécurisés à la BD via les méthodes.- Capitalise sur les acquis (applications) permettant une migration évolutive du SGBD

relationnel vers l’objet.

Bémols et limites:- Objet est plus complexe découlant de structures disponibles dans les applications (langages

de développement): usage d’outils de mapping des objets (JPublisher, …)- N'implémente pas l'héritage multiple. Idem pour Java sauf pour C++. Est-ce vraiment un

inconvénient?? - N'est pas 100% conforme à la norme ODMG: ex. les structures d’ensemble limitées à 2

niveaux . Utilise la notion explicite de REF qui est en quelque sorte un pointeur logique lequel devrait être normalement être transparent au traitement.

Page 2

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 3

Objet et Attribut

Dans l’univers des bases de données objets, il y a seulement quelques concepts clés: L’objet a un nom et est concrétisé par la création d’une structure (dorénavant appelée classe

ou type d’bjet). Un objet est donc à l’image d’une classe et cette dernière est munie d’une interface. En Oracle : la classe est synonyme du type d’un objet de table

L’attribut (propriété) a un nom et est utilisé pour représenter un aspect de l’objet réel permettant ainsi des traitements subséquents.

Le type: L’attribut et l’objet auront un type ( i.e. une structure de données) de manière à pouvoir stocker un d’objet et en permettre des traitements subséquents. Les objets sont regroupés dans un containeur d’objets. En OR, c’est la table. Dans d’autres systèmes objets, cela peut être une liste ou un set.

Les méthodes sont associées aux classes pour manipuler correctement les objets. Elles sont partagées entre les applications et peuvent être certifiées pour le maintien de la cohérence et de l’efficacité. Elles ne sont pas physiquement stockées avec les structures d’objets mais elles y sont fortement reliées via le dictionnaire de données.

Modèle Objet © Module 3 page 4

Hiérarchie des types d’objets (Oracle)

TYPE

User-Defined Build-In

Scalar Collection Relationship

CHAR(N), NCHAR(N)CHAR VARYING(N)NCHAR VARYING(N)RAW(N)NUMBER DECIMALINTEGER SMALLINTFLOAT REALDOUBLE PRECISIONDATEBLOB CLOB NCLOB BFILE

VARRAYNESTED TABLESet()Bag()List()

REF

Reference: JP Perez – Object Database using Oracle

tuple [ ]

Page 3

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 5

Types atomiques, complexes et d’usager

1. Atomique ou de base : int, number, string, varchar(), varchar2(), Date, ... (15 types en R).

2. Complexe : structure de tuple (1 seul objet), d’ensemble, liste, bag, ... identifiée par un nom

Ex.: tuple := [A1:t1, A2:t2,…] où A1 est un attribut et t1 un type primitif (ou d’usager).

3. Type défini par l’usager:Exemple : Sans faire référence à un SGBD objet particulier, le type pour un objet :employé estdéfini comme un tuple:

employe_t := [mat: int , nom: varchar2(50) , adresse : varchar2(50)] structure de tuple

Convention d’écriture pour le typeLe type d’un objet a par convention, le même nom que celui de l’objet suffixé par _t etdébutant par une lettre minuscule. C’est une convention d’écriture et non une syntaxe du DDL duSGBD objet.

Modèle Objet © Module 3 page 6

Oracle: Classe externe et Classe interne

Le lien simple est implémenté par imbrication dans la classe externe.

Personne: personne_t

no intnom varchar2(40)

mat intnom varchar(40) adresse

Une classe externe ou interne a un type généralement défini par l’usagerEx. Personne : personne_t

N.B. Dans le Mnav: un lien simple interne vers une classe interne est instantiée par un seul objet interne.

: adresse_t

Page 4

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 7

Classe interne et type Usager

Définition du type d’une classe interne (formulé via la notation d’un tuple)Exemple : l’attribut adresse réfère à une classe interne de l’objet :personne écrit sans référenceà un SGBD particulier.

adresse_t := [ no: int, nom : varchar2(50)] i.e. (formulation linéaire)adresse_t := tuple( no: int, nom : varchar2(50))

Un type déjà défini pour une classe interne peut être aussi utilisé dans la définition du type d’uneautre classe Externe Employe:

personne_t := [mat int, nom varchar2(40), adresse adresse_t]

En Oracle objet le type d’une classe interne est créé ainsi:(création d’un type via l’application SQLPlus):

Create type adresse_t as Object (no int, nom varchar(50)) /Create type personne_t as Object (mat int, nom varchar2(50), adresse adresse_t) /

*** Pas de shadowing: un type est défini qu’avec des types déjà créés ou prédéfinis.

Modèle Objet © Module 3 page 8

Partage des types entre les classes d’objets

IMPORTANT : un type peut-être partagé entre plusieurs classes d’objets créant ainsi une dépendance dont ilfaudra tenir compte par la suite lors de la suppression ou la modification du type existant. Le dictionnaire duSGBD signale cette dépendance.

Supprimer un type partagé est possible si la suppression se répercute aussi surles autres types dépendants:

Alter type adresse_t DROP codePostal varchar2(20) CASCADE ; Drop type adresse_t FORCE ; -- pour supprimer malgré la dépendance.

Alter type adresse_t ADD codePostal varchar2(20) CASCADE ;

Partage d’un type entre plusieurs schémas (BDO):Possible que si le compte-propriétaire Louise accorde le privilège EXECUTE auxautres:

Grant EXECUTE ANY TYPE ON TO Pierre; -- permission donnée par Louise-- Pierre peut maintenant utiliser les types de Louise en le préfixant : Louise.employe_t

Grant insert , update, …. To Pierre;Revoke insert, update , … to Pierre;

Page 5

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 9

Partage d’un type entre utilisateurs-DBA

Alors Pierre veut créer un type gerant_t en utilisant le type créé par Louise :

Create type gerant_t as Object ( noGerant int, personne Louise.employe_t )

/Describe Louise.employe_t;

Pour créer des types, Pierre doit avoir le privilège:Grant create type to Pierre; -- accordé par le DBA

ou avoir les privilèges du DBA.

N.B. Dans un cours vous avez normalement que le premier privilège .

Compte de Louise

Modèle Objet © Module 3 page 10

Validation des types

Lors de la création ou de la modification d’un type, le système doit vérifier que cette modification ne fait pas une action qui invalide les autres types ou autres entités de la base:

ALTER TYPE Personne DROP ATTRIBUTE (adresse) CASCADE; Exemple : un type est modifié en supprimant un attribut CASCADE: Le système doit vérifier que cette suppression ne se répercute pas

sur un autre type utilisé par un attribut est indexé ou utilisé par ex. pour le partitionnement ou le clustering des tables, …

*** Si le test passe alors le type est modifié, sinon refus du système.

INVALIDATE: le test est supprimé et les changements sont imposés quitte à ce que le clustering par exemple soit rendu inopérant. Pour le redevenir, il faudra réinstaller le type initialement supprimé!

Page 6

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 11

Partage en cascade des types

Le partage d’un type utilisant un autre type déjà défini se représente difficilement dansle Mnav. Avec le modèle graphique Mnav. Il y a alors dépendance du type etudiant_tsur adr_t

Create or Replace type adr_t as Object ( noRue int, rue varchar2(50), ville varchar(50), cPostal varchar(6))

/Create type etudiant_t as Object (matE int, adr adr_t) /Create type professeur_t as Object (matP int, assistant etudiant_t) /

Create Table Professeur of professeur_t ;

Le partage d’un type est pris en compte dans son ‘évolution ‘: CASCADE et INVALIDATE

Alter type etudiant_t ADD tel varchar(8) CASCADE ;

Modèle Objet © Module 3 page 12

Collection en Oracle (set)

Les objets d’une classe interne sont appelés objets-colonnes dans la terminologieOracle.

L’attribut lesJoueurs est un ensemble dont chaque élément est un objet-colonne (OC). Autrestypes d’ensemble : list(), bag() … mais non disponibles en Oracle:

employe_t := [mat : int , nom: string, lesAdresses : list(adresse_t)] (non Oracle)

L’attribut d’ensemble lesAdresses peut-être ordonné ou pas par la nature du typechoisi. Chaque adresse est un objet de cet ensemble lesAdresses:

avec adresse_t := [no int, rue varchar(50), ville varchar(50)]

N.B. Un type est défini en utilisant que des types déjà définis.

(Formulation linéaire)

Page 7

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 13

Avec Oracle, la déclaration de l’ensemble ordonné lesAdresses est la suivante:

Create employe_t as Object (mat int, nom varchar2(30), lesAdresses lesAdresses_t) /Create type lesAdresses_t as VARRAY(2) of adresse_t --ens. ordonné/

Create type adresse_t as Object (no int, rue varchar2(50), ville varchar2(50)) /Attention: La définition des types est faite dans l’ordre inverse puisque le shadowing n’est pas autorisé.

mat : int

nom : string

lesAdresses

Employe: employe_t

Mnav avec une structure interne implémentée avec le VARRAY()

Structure interne référéepar un lien interne multiple. Donc son type sera varray ou set avec des élément que sont les valeurs ou les objets adresse.

Modèle Objet © Module 3 page 14

Les attributs de Varray ( ≈ 10)

Le type Varray a quelques pseudo-méthodes prédéfinies et associés dans le traitement avecPL/SQL. Dans ce langage, le varray créé en PL/SQL a des attributs et non des pseudosméthdodes. Ce dernier a les structures nécessaires pour implanter un varray, mais pas SQL. Ce type s’utilise avec des valeurs stables et peu nombreuses.

Count : le nombre actuel d’éléments dans l’ensemble dont la structure est VARRAY : Declare lesAdresses lesAdresses_t ;Ex: nb := lesAdresses.count

Limit : nombre maximal d’éléments dans l’ensemble ordonné.+ autres méthodes spécialisées à venir

NB Impossible de supprimer uniquement une valeur ou un objet rangé dans un varray.

La struct PL/SQL varray est définie et dotés d’attributs en PL/SQL

Page 8

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 15

Constructeur d’objet (rappel de convention d’écriture)

Tout objet typé sera «construit » par un constructeur (implicite ou explicite) dont le nom est formé avec le nom du type suffixé par _t. Cette convention d’écriturepermet de distinguer plus facilement le nom d’un type de celui d’une table-objet.Nous verrons plus loin qu’il existe plusieurs constructeurs d’objets.

L’information sur cette convention sera transmise au SGBD lors de la création du type.

Chaque objet est construit et inséré dans une table-objet. Il acquiert de ce fait un oid unique et non réutilisable (persistance) par un autre objet. La table est son extension/containeur (ou container).

Pour le moment, considérons cet oid comme une sorte de référence unique et persistante à chaque objet.

Une définition plus précise et complète sera vue plus loin la composition de la REF.

Modèle Objet © Module 3 page 16

L’insertion d’un objet avec 2 objets de la classe interne se fera en construisant l’objetà insérer et en l’ajoutant dans la base par la clause DML Insert.

Insert into Employe values (employe_t (150, ‘Robert’, lesAdresses_t( adresse_t (5, ‘St-Louis’, ‘Québec’),

adresse_t(8, desPins, ‘Sorel’)))); - ajout de l’objet Employe avec ses adresses

Insertion suivante sera rejettée car il dépasse la capacité du Varray:Insert into Employe values (employe_t (225, ‘Lucie’,

lesAdresses_t (adresse_t (23, ‘Concorde’, ‘Québec’), adresse_t (42, ‘desSaules’, ‘Québec’),adresse_t (99, ‘des Pins’, ‘Québec’) )) );

L’insertion d’une 3 ème adresse génère une erreur à moins d’étendre au préalable le varray , ce que le PL/SQL peut faire.

Insertion des objets avec un ensemble Varray

Construction de la classe interne

mat : int

nom : string

lesAdresses

Employe: employe_t

Page 9

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 17

Différences entre le VARRAY et le Set (NESTED TABLE)

VARRAY (set) NESTED TABLE

Ensemble trié Ensemble non trié

Objets indicés (0rig. 1) Objets non indicés (accès direct)

Nombre limité d’objets Nombre illimité d’objets

Pas de SELECT sur les attributs de l’objet-colonne du varray

SELECT possible sur les attributs des objets-colonnes

Accessible avec PL/SQL (non accessible avec SQL)

Accessible avec SQL et PL/SQL

Objets du même type Objets sont tous du même type ou d’un sous-type du type déclaré

Ces deux types sont du genre ensemble et peuvent avoir comme éléments des références, des valeurs ou des objet-colonnes. (i.e. sans oid)

L’insertion, mise à jour, suppression et autres opérations avec ces types complexes exigent l’emploi de méthodes qui seront étudiées dans un chapitre ultérieur.

Modèle Objet © Module 3 page 18

Supplément sur les varrays (Contenu à différer au besoin)

Les éléments stockés dans un varray sont aussi des objets (du genre objet-colonne) L’insertion se fait par DML et la recherche avec SQL n’est pas permise avec un critère formé par un attribut de l’OC. Il faut donc parcourir le varray avec une application, par exemple développée en PL/SQL en utilisant les méthodes prédéfinies et associées au VARRAY.

Ce type (structure) est utile pour stocker un petit nombre d’objets de même type qui doivent être ordonnés exigeant un espace relativement important de stockage. Pas de suppression possible sinon via une lecture complète du varrayavec PL/SQL et la suppression effectuée via une structure de PL/SQL!

Page 10

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 19

Utilisation par appel de méthode prédéfinie

Les méthodes (fonctions) qui sont prédéfinies avec le type du varraysont appelées ainsi:

var_objet.nom_méthode

v_nb := v_liste_locaux. COUNT -- fonction qui retourne dans v_nb, le nb de locaux dans la liste.

v_nb est déclarée une variable entière.

Modèle Objet © Module 3 page 20

Quelques méthodes (fonctions) associées à Varray()

Méthode DescriptionExists (x) Retourne TRUE s’il existe une valeur au rang x du Varray

Count Retourne le nombre d’objets stockés dans l’ensemble

Limit Retourne la taille max du varray

First / Last Retourne le 1er et le dernier élément de la collection

ExtendExtend(m)Extend (x, i)

Ajoute un élément vide au varrayAjoute m éléments videsAjoute x copies de l’élément en position i

Delete Delere (i)Delete (i,j)

Supprime tous les objets du varraySupprime l’objet de position i dans le VarraySupprime les objets de rang 1 à j du Varray

Declarev_tableauGroupe groupes_t -- var. objet de type varray déjà définie dans le DDlimite int ;Beginlimite := v_tableauGroupe.LIMIT;DBMS_OUTPUT.PUT_LINE (To_Char(limite));End;

Page 11

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 21

Représentation graphique du Varray

noA : intlesEnfants

nasE intnomE: varcharageE : int

nasE intnomE: varcharageE : int

………

Assurance:assurance_tLe varray est un ensemble ordonné dont chaque élément a un rang i.

Cet ensemble ordonné est en quelque sorte une classe interne de type varray.

Les attributs du varray peuvent être vus comme des méthodes prédéfinies à tout varray.

La 3e entrée du varray sera valuée par un objet null.

Modèle Objet © Module 3 page 22

Création et utilisation du Varray() avec PL/SQL

Impossible de mettre à jour le varray avec le Update. Il faut le faire avec PL/SQL

Create type enfant_t as Object (nasE int, nomE varchar(50) , ageE int)/Create type lesEnfants_t AS VARRAY(3) of enfant_t/Create type assurance_t as Object (noA int, lesEnfants lesEnfants_t)/Create table Assurance of assurance_t;

Un type peut avoir plusieurs attributs de typeVarray :

Create type assuranceInternationale_t as Object (noA int, lesEnfantsCa lesEnfants_t, lesEnfantsUSA lesEnfants_t)

/

Page 12

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 23

Vision tabulaire avec 2 attributs d’ensemble ordonné

Création du containeur d’objets:Create table Assuranceinternationale of assuranceInternationale_t;

noA: Les EnfantsCA lesEnfantsUSA

nasE nomE ageE nasE nomE AgeE

102 1001 Paul 22 2003 Jane 34

2004 Peter 25

103 1002 Lise 25 null null null

Varray(3) (objets-colonnes sans oid)

Objet de la tableavec un oid

Modèle Objet © Module 3 page 24

Ajout des objets dans le varray

Revenons à Assurance:

Ajout d’une Assurance couvrant 2 enfant:Insert into Assurance values (assurance_t(102, lesEnfants_t(

enfant_t(2,'Louise', 22),enfant_t(3,'Jacques',25),enfant_t (null, null, null )

) );

NB L’ajout d’un autre objet-colonne (sur 3 possibles) ne peut pas se faire directement. Il faut lire l’objet de table qui le contient , en faire la mise à jour en RAM par l’applicatif et ensuite faire un UPDATE de la table qui le contient. Un inconvénient qui limite l’intérêt du varray!

Aucune lecture possible d’un seul attribut du varray avec SQL:

Select a.lesEnfants.ageFrom Assurance a

*** identificateur inconnu ****

Page 13

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 25

Lecture SQL du varray sans critère de sélection

La lecture des objets est possible avec SQL mais pas leur mise à jour, ni leur suppression

Select a.lesEnfants From Assurance a ;

LESENFANTS (NASE, NOME, AGEE)

LESENFANTS_T(ENFANT_T(2, 'Louise', 22))LESENFANTS_T(ENFANT_T(3, ‘Jacques', 25))

Modèle Objet © Module 3 page 26

Vision tabulaire utilisant un varray à 2 places

Create type assurance_t as Object (noA int, lesEnfants lesEnfants_t)

Insert into Assurance values (assurance_t(102, lesEnfants_t(enfant_t(2,'Louise', 22),enfant_t(3,'Jacques',25));

noA: Les Enfants : lesEnfants_t

nasE nomE ageE

101 1 Paul 20

null null

102 2 Louise 22

3 Jacques 25

Assurance:

Page 14

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 27

Lecture des objets-colonnes dans un tableau

-- Applicatif PL/SQL pour afficher le nombre des enfants assurés par la police d’assurance 102

Declare v_tableauE lesEnfants_t ; -- var. varray à 2 places

BeginSelect a.lesEnfants into v_tableauEFrom Assurance a Where a.noA = 102;

For i IN 1..v_tableauE.COUNT LoopIF v_tableauE.EXISTS(i) ThenDBMS_OUTPUT.PUT_LINE (v_tableauE(i).nasE|| v_tableauE(i).nomE); End IF;

End Loop; End;/

2 Louise3 JacquesProcédure PL/SQL terminée avec succès.

Modèle Objet © Module 3 page 28

Recherche d’un objet particulier dans un varray

-- Applicatif PL/SQL pour traiter l’assurance 101(SET SERVEROUTPUT ON)

Declarev_tableauE lesEnfants_t ;BeginSelect a.lesEnfants into v_tableauE From Assurance a Where a.noA =101;

DBMS_OUTPUT.PUT_LINE (v_tableauE(1).nasE ||' ' || v_tableauE(1).nomE) ;End;/

Réponse: 1 Paul

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

Cette procédure pourrait être intégrée dans une méthode plus générale de recherche et de mise à jour.

Page 15

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 29

Lecture de tous les objets (OC) d’un VARRAY peu importe l’objet hôte

Declarev_tableauE lesEnfants_t ; -- var locale de type varray v_nbPoAs int;Beginselect count(*) into v_nbPoAs from Assurance;For J IN 101..v_nbPoAs + 100 LoopBegin

Select a.lesEnfants into v_tableauE From Assurance a where a.noA= J ;For i IN 1..v_tableauE.COUNT LoopIF v_tableauE.EXISTS(i) ThenDBMS_OUTPUT.PUT_LINE (v_tableauE(i).nomE || ‘ ‘ || v_tableauE(i).ageE);End IF;

End Loop;End;End Loop;End;/

Paul 20Louise 22Jacques 25

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

Modèle Objet © Module 3 page 30

Modification de l’attribut d’un objet (OC) (ageE)

Exemple: Jacques titulaire de l’assurance 102, a 26 ans plutôt que 25.Pour modifier un objet ayant un attribut de type varray, il faut lire l’objet OC, le mettre à jour avec l’applicatif PL/SQL et l’insérer à nouveau dans la base-objet.

Declare v_tableauAssur assurance_t; -- type de la var. Idem à celui des objets de la table

v_lesEnfants lesEnfants_t; -- variable de type varray BeginSelect a.lesEnfants into v_lesEnfants From Assurance a

Where a.noA = 102; -- 1 seul objet OC doit être lu

v_lesEnfants(2).ageE := 26; -- mise à jour de la 2e entrée du varray ne RAM Update Assurance a SET a.lesEnfants = v_lesEnfants Where a.noA = 102;End;/sqlplus: select lesEnfants from Assurance;

LESENFANTS(NASE, NOME, AGEE)LESENFANTS_T(ENFANT_T(1, 'Paul', 20))LESENFANTS_T(ENFANT_T(2, 'Louise', 22), ENFANT_T(3, 'Jacques', 26))

Page 16

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 31

Affichage de la structure d’un type

sqlplus: Describe assuranceInternationale_t;

Nom NULL ? Type----------------------------------------- -------- -----------------------NOA NUMBER(38)LESENFANTS LESENFANTS_TNASE NUMBER(38)NOME VARCHAR2(50)AGEE NUMBER(38)

LESENFANTSUSA LESENFANTS_TNASE NUMBER(38)NOME VARCHAR2(50)AGEE NUMBER(38)

Modèle Objet © Module 3 page 32

Nature du type REF pour un attribut

Un attribut peut avoir un type REF ce qui signifie qu’il est valué avec une référence ciblant un autre objet. La REF permet d’associer les objets de classes différentes dans une même hiérarchie de classes (polymorphisme du Ref).

Le REF permet d’implanter le lien externe du Mnav.

La valeur de type REF est construite par le système en incluant l’oid et quelques autres métadonnées de la table-objet ….

Index: mécanisme d’accèsAvec une référence, un objet est obtenu via la consultation par le noyau du SGBD de l’index créé (automatiquement) sur les oid de chaque containeur (table-objet) et maintenu par le SGBD.

N.B. dans la technologie relationnelle:

Le ROWID joue un rôle similaire au OID dans Oracle-Objet mais il n’est pas un vrai oid ne serait-ce par le fait qu’il est visible, réutilisable et manipulable directement. (mais non modifiable directement).

Page 17

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 33

Type REF

Une valeur de type REF réfère seulement à un seul type objet (OT) via l'oid de l'objet ciblé. L’objet-colonne n’a pas de oid donc ne pas être référencé par indexation de son oid! Sa persistance et son accès passent par ceux de l’objet hôte!

Dans ce cours et par convention volontairement abusive : La valeur Ref sera considérée idem à l'oid du moins en ce qui a trait à son rôle.

Le rôle dévolu au type REF est d'améliorer la fonction de navigation avec le langage de requête SQL. Par exemple, accélérer les jointures.

Le oid (son identité) est de préférence (ou devrait être) non visible et obligatoirement non modifiable par programmation;

(variable selon les implémentations)

Modèle Objet © Module 3 page 34

Référence à un autre objet par l’oid obtenue par la fonction REF()

Create type service_t as object (nomS varchar(50)) /Create table Service of service_t; Insert into Service values(service_t(''analyse''));

Create Type employe_t AS Object (nomE varchar2(50), refService REF service_t ) / Create Table Employe OF employe_t;

INSERT Into Employe values ( employe_t ('Jacques', NULL));

Insert Into Employe values(employe_t (‘Louise', (select REF(s) FROM Service s WHERE s.nomS = ''analyse'')); ;

Select e.* From Employe e Where e.nomE = '‘Louise'';

Louise 0000220208424E801067C2EABBE040578CE70A0707424E801067C1EABBE040578CE70A0707

nomE*: varchar

refService

Employe: employe_tnomS*: varcharService: service_t

Page 18

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 35

REF et l’association UML

L’attribut de type REF est utilisé pour implémenter l’association de la classe UML.

Clé étrangère et clé primaire d’une table-objet:

- La clé primaire en objet n’est pas essentielle pour concrétiser l’unicité de l’objet car l’oid distingue tout objet. Elle est cependant utile pour la recherche d’un objet particulier puisque l’oid est non accessible ou inconnu pour la recherche.

- La clé spécifiée est une contrainte d’entité (toutes les valeurs sont donc distinctes)

La clé étrangère est implémentée via le lien de référence: REFERENCES qui peut être aussi défini en objet.

Modèle Objet © Module 3 page 36

Classe et table-objet

Classe: a un type dont les instances auront un oid (logique).

Ex: La classe Employe aura le type de ses objets soit employe_t

3 sortes de tables

1- **Table-objet dont les éléments sont des objets pouvant contenir d’autres objets dits objets-colonnes.

2- table-objet-relationnel dont les tuples peuvent contenir des objets et des tuples en cohabitation avec un SGBD OR

3- Table relationnelle dont les tuples ne sont pas des objets mais pouvant aussi avoir des objets-colonnes de type objet. (Ignorée dans ce cours)

Une table-objet est physiquement placée dans un TableSpace (TS)

Page 19

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 37

Containeur d’objets : table OR

Les objets sont stockés dans des containeurs (ou container) que sont les tables-objetsde la technologie objet-relationnelle de Oracle:

Containeur Table OR (environnement Oracle)

Une table-objet est associée à une classe i.e. un type généralement complexe qui façonne lesobjets du conteneur.

Rappel de la convention d’écriture:Le nom d'une table débute par une lettre majuscule et son type généralementcomplexe est composé de son nom débutant par une lettre minuscule et suffixé par _t

Exemple: La classe externe Employe a un type employe_t:employe_t := (nom: string, age :int, salaire: real)

Modèle Objet ©

Comment sont stockés les objets sur disque?

38

Page 20

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 39

TableSpace: page et objet

Plus il y a d’objets dans une page, plus rapide est la recherche des dits objets.Le tableSpace est l’unité de gestion de l’espace physique:

base objets <====> fichier(s) paginés <====> fichiers OS

Tablespace x + 1

9 objets/page6 objets/page

4 objets/page

Tablespace x

page

objet 9 objets/page6 objets/page

4 objets/page

Modèle Objet © Module 3 page 40

Rappel sur les tableSpaces de Oracle (TS)

tables, index, …<==> fichier(s) physique(s) paginé(s) <==> pages de 4Ko, 8Ko, 16Kotablespace(s) <==> fichier(s) paginé(s)

A la création, la base a quelques tableSpaces : System, Temp, User, … D’autres sont créés au besoin et nommées par le DBA:Ex: Create tablespace ts_employeActuels datafile '/dbf1/ts_sth.dbf' size 32m autoextend on next 32m maxsize 2048m extent management local;

System: pour le traitement, Temp : pour les tris, User: pour tables utilisateursSi à la création d’une table:

Aucune mention du TS : le tableSpace User par défautAvec mention d’un TS: les objets sont créés dans celui-ci

Create table T1 of type T1_t (a int, b int, c varchar(50)) (tableSpace User);Alter table T1 Move tableSpace espace_de table_T1;Create table Inscription of inscription_t (TableSpace TS_Registraire) ;

(table créée dans le tableSpace TS_Registraire)

Page 21

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 41

Ensemble imbriqué dans une classe (classe interne)

Un attribut ensembliste est spécifié avec Oracle comme (non pas comme un set) mais comme une Nested Table stockée par défaut dans le même tableSpace que celui de la table hôte.

Placement d’un containeur dans un tableSpace:

CREATE TABLE Etudiant of etudiant_t NESTED TABLE lesCours STORE AS Table_lesCours(TABLESPACE TS_Registraire2013);

(La table-objet Etudiant et la collection imbriquée lesCours sont créés dans le TS Registraire2013)

Une nested table bien que stockée comme une table physique séparée, cohabite par défautavec sa table mère dans le même tablespace.

Plus de détails à venir sur la table imbriquée …

Etudiant: matricule: varcher() nom: varchar() lesCours : lesCours_t

Modèle Objet © Module 3 page 42

Gestion des tables physiques au regard des TS

Déplacement d’une TS vers une autre TS:

ALTER TABLE Etudiant MOVE TABLESPACE Registraire A2013

Déplacement d’une collection imbriquée (sous-table) vers une autre TS:

Ce déplacement est possible car l’ensemble imbriqué est physiquement séparé de la table-objet.

Il faut utiliser le nom de la nested table assigné par la clause STORE AS:ALTER TABLE Table_Les Cours MOVE TABLESPACE Cours2013;

Page 22

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 43

Signature associée aux types de classes (externes et internes)

L’interface est spécifiée intégralement et solidairement ( important) dans le type

Un type peut avoir des procédures (méthodes) pour manipuler les donnéesdu type. Les types (avec leurs méthodes) peuvent être partagés entre plusieursclasses.Solidairement: à chaque ajout ou suppression d’une méthode, toute l’interface doitêtre recréée pour qu’elle soit modifiée!

Chaque méthode a une signature définie dans le type.

Signature := nom de la méthode et les paramètres typés, incluant celui de retour

Exemple:Calcul de la marge sur un produit: (une fonction est utilisée)

marge (cout: real, facteur: int, lieu varchar) : real (syntaxe théorique)

Modèle Objet © Module 3 page 44

Dépendance entre les types

En objet les types complexes sont extensibles:

Create type adresse_t as Object (no int, rue varchar2(50)) --sans signatures

/Create type coordonnees_ t as Object ( no int , adr1 adresse_t) /Create type localisation_t as Object ( coordGPS int, region coordonnees_t) /

dépendance: localisation_t - coordonnees_t adr_t

Voir Describe localisation_t -- pour obtenir une description avec les types imbriqués..

Imbrication des types et des tables: (Oracle 8, limitée à 1, illimitée avec les versions récentes: 11g et +.

Page 23

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 45

Actions combinées sur le type et leurs effets sur les objets stockés

2 ajouts et 1 suppression:

ALTER TYPE t1_t ADD ATTRIBUTE attr1 NUMBER, DROP ATTRIBUTE attr2,

ADD ATTRIBUTE attr4 NUMBER,

MODIFY ATTRIBUTE attr5 char(6) CASCADE option ;

• Un attribut ne peut-être modifié qu’une seule fois dans un même ALTER TYPE• Un attribut hérité ne peut pas être supprimé sauf dans sa classe source.

Options:

INCLUDING TABLE DATA : conversion des objets déjà créées. (le défaut)

NOT INCLUDING TABLE DATA : La colonne de l’attribut de l’objet est marquée UNUSED. Idem pour les données de la table ou celles stockées à l’extérieur.

Suppression des colonnes dont le type a été modifié:ALTER TABLE DROP UNUSED COLUMNS : pour supprimer les attributs marqués unused.

Modèle Objet © Module 3 page 46

Opérations avec les types: création, suppression, …

Création d'un type:Create or Replace type .. as Object (…) /Aucun type à définir avec les types primitifs : Boolean, rowid, Long, Long Raw, …

Description d'un type : Directive Describe fournit les attributs et leur typeDesc [ribe] personne_t ;

Suppression d'un type:Drop type personne_t [FORCE| VALIDATE];

Synonyme du type : Create Synonym inventaire_t FOR stock_t;

Page 24

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 47

Rappel: objet de table (OT) et objet colonne (OC)

Oracle gère (absent avec les autres systèmes) 2 types d’objets : Objet de table : objet typé à l’image du containeur et ayant un oid

Objet-colonne (sans oid): un objet d’une classe interne correspond à un objet-colonne logiquement

incorporé dans un objet de table. Ex. adresse adresse_t

Un attribut de type ensemble regroupe des objets-colonnes. Si l’étudiant a plusieurs adresses : l’attribut lesAdresses est de type ensemble dont les éléments sont des objets-colonnes.

Ex: Create type etudiant_t as object ( mat int, nom varchar(50), adresse adresse_t);

Une instance du type etudiant_t donne un objet contenant une instance de l’objet-colonne adresse_t.

Modèle Objet © Module 3 page 48

Définition du type ensemble dans le système O2

Intuitivement et avec le système objet O2 : (autorisant le shadowing)

Create class Etudiant as object ( mat int, nom varchar(50), lesAdresses Set of (adresse_t));

Où adresse_t est un type à créer.

Comparaison avec Oracle:

Create type etudiant_t as object ( mat int, nom varchar(50), lesAdresses lesAdresses_t);

où lesAdresses_t est un type d’ensemble qui sera rendu par une table imbriquée spécifiée parune syntaxe deTable Of (syntaxe à venir)

Page 25

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 49

Description du type et ses types composants

SET describe depth 2 -- commande Sqlplus pour contrôler le niveau de lecture de la structure

Describe employe_t

NOM Null type

MAT NUMBER(32)

NOM VARCHAR2(40)

ADRESSE ADRESSE_T

NO NUMBER(38)

RUE VARCHAR2(40)

VILLE VARCHAR2(40)

Modèle Objet © Module 3 page 50

Objet persistant (objet non persistant)Objet persistant := une paire (oid, valeur ou objet typé)

oid est l'identifiant unique d'un objet (Object Identifier); Le oid est généré par le système (auto) ou généré selon des contraintesformulées par le DBA.

L’oid ne change pas durant le cycle de vie d'un objet. Il est aussi inscritdans la structure de l’objet. L’oid limite donc le nombre total d’objets dans la base.

Valeur typéeoidInterfaces

Objet non persistant n’a pas de oid; c’est alors un objet transitoire.

Un objet créé par le NEW de PL/SQL est transitoire et devient persistant seulement lorsqueinséré dans un containeur i.e. dans une table ou dans un autre objet persistant.

N.B. L’oid est affiché uniquement avec l’application SQLPlus.

Objet persistant

InterfacesValeur typée

Page 26

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 51

Objet transitoire sans oid

Create type moteur_t as object(no varchar(10), puiss int, poids int)/Create table Moteur of moteur_t;

Declare --applicatifv_moteur moteur_t; -- type d’un objet

Beginv_moteur := NEW moteur_t('FG45S', 300, 1); -- oid absent,donc non persistantInsert into Moteur values(v_moteur); -- objet rendu persistant avec un oid v_moteur := NEW moteur_t('FG38', 100, 1); -- disparition de l’objet avec la fin de la procédure

End;/2 objets créés dont un seul, le premier rendu permanent (et stocké) avec son oid.

Modèle Objet © Module 3 page 52

Oid rangé comme un attribut caché

Où est stocké l’oid d’un objet?Il est stocké comme un attribut « caché» de l’objet dont le nom est SYS_NC_OID$. C’est généralement une valeur binaire de 16 octets (32 hex).

Exemple avec SqlPlus:

Select SYS_NC_OID$From Moteur mWhere m.puiss < 500;

SYS_NC_OID$ . 0627D6A9CEC34BEAB03D7F9D9B6F0D3B ( 32 hex 16 octets)

Impossible cependant de le manipuler et de l’Imprimer avec une variable objet!

Page 27

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 53

Mutation des oid : oid logique (ref) et physique

L’oid est augmenté pour devenir le oid-L au sens qu’il ne correspond pas à une adressephysique de la RAM, ni sur disque. Nous l’identifierons comme oid-L (logique).

L’oid-L est transformé par le noyau du SGBD pour y associer l’oid-P dès la 1ère lecture de l’objet (swizzling) et son placement dans la RAM du serveur.

La table de correspondance entre l’oid-L (persistent) et l’oid physique (variable) est géréedans la cache du noyau du SGBD (pour un serveur de pages ou un serveur d’objets).

Oid-L: oid + no de fichier, no page et un déplacement dans la page + oid type classe. Une table est construite avec les oid-L.

Oid-L: oid vol page Offset oid type classe

Oid-P

3A6F... 5 234 324 3FB2 FE245

Oid-P Données de l’objet …FE245 données de l’objet

L’oid-L est une REF qui a une taille plus importante que celle du oid-P.

L’oid-P doit demeurer inchangé aussi longtemps que l’objet n’est pas rapatrié de la cache vers le disque. Ce qui signifie que les pages d’objets dans la RAM sont clouées (pinned pages)!

Dans la RAM:

REF

Modèle Objet © Module 3 page 54

Oid physique et swizzling (mutation)

Tous les objets transférés en RAM (du serveur) ont leur oid-L mutés (swizzled) immédiatement.

La structure d’un objet sur disque est différente de celle en RAM afin de tenir compte des structures physiques particulières de chaque langage et de chaque machine (machine dependant object structure)

Lorsqu’un objet est ré-écrit sur disque, la dé-mutation n’est pas nécessaire car le oid-L esttoujours intact dans l’objet.

CAS SPÉCIAL: Partage du même type dans 2 bases distinctes (sur une même machine)Chaque type est aussi un objet qui a son propre oid. Pour le partager entre 2 bases, il faut recréer le type avec le même oid dans les 2 bases:

Génération d’un oid pour le type dans une base:SELECT SYS_OP_GUID() FROM DUAL;

SYS_OP_GUID() 19A57209ECB73F91E03400400B40BBE3

Création du type personne_t dans les 2 bases:CREATE TYPE personne_t OID '19A57209ECB73F91E03400400B40BBE3'

AS OBJECT (attrib1 NUMBER); (dans chaque base)

Page 28

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 55

Vue schématique du swizzling :Transfert de l’objet en RAM

1- La page de l’objet oid8 sur disque est transférée vers la cache RAM du serveur. L’adresse RAM de chaque objet de la page est inscrite dans une table OPé

2- Par la suite, la table OP est consultée pour trouver l’adresse RAM de l’oid-L oid8. L’écriture se fait via la page vers le disque.

oid8

oid4Objet

oid8

Pointeur RAM

OP (objet persistant)

Oid-L oid-P

oid2 FB234A

oid4 4AF2233

oid5 93422FF

oid8 F3B255

Pour accéder à une valeur de oid8 avec la variable objet x, il y a consultation de la table OP et accès àl’objet via l’adresse RAM (oid-P) et finalement à la valeur attrib1. Il y a en quelque sorte une indirectiondans l’accès via la table OP. La table OP s’agrandit et se retrécit avec le va et vient des pages d’objets.

Page sur disqueDans la cache RAM du serveur

(1) (2)

x.attrib1

oid obtenu de la REF

(3)

Page transférée en RAM

Modèle Objet © Module 3 page 56

Génération de l’oid

L’oid peut être généré par le système ou dérivé de la clé d’une table.L'oid peut être aussi dérivé des données selon la spécification définie pour chaque table-objet (à la génération de la BD).

Nombre fini de oid? Mot de 64 bits ou 128 bits …

--- la création d’un type génère un objet ayant son propre oid

La REF est donc construite ainsi:REF := oid + metadonnée . (total de 42 octets) avec une machine de 32 bits

Les métadonnées permettent au système d’identifier rapidement à quelle classe d’objets un oid appartient et cela en incorporant le oid du type de son containeur sans accéder au conteneur.

NB: Une table relationnelle n'a pas de oid pour les tuples, mais un rowid réutilisable.

Page 29

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 57

Génération de l’OID Oracle : système et dérivé

Implémentation de l'OID: Ex: variable selon le système: nombre sur 32 bits ou mieux sur 64 bits ( max objets 264-1 objets) ou +;

ORACLE: (oid généré:16 octets = 128bits soit 2 mots de 64 bits par oid).

Choix fait lors de la création de la table-objet:

Create Table Employe of employe_t ( contraintes ...) Object Identifier is

{SYSTEM GENERATED | PRIMARY KEY};

Indexation automatique des oids générés et des oid dérivés.

Oid jamais réutilisé (dans la même base) : oid ne devrait pas être un pointeur physique sur un objet (sauf par swizzling lorsque les objets sont dans la RAM) dont l'espace peut êtreréutilisé par un autre objet après suppression du premier. Finitude de l'espace objet!

Modèle Objet © Module 3 page 58

Affichage de l'oid d'un objet: fonction REF( )

Affichage de l'oid d'un objet de la table Employe ( avec d’autres donnéesd’accompagnement):

Select Ref(e)

From EmployeP e

Where e.mat = 350;

00002 8BC6FCA……………7654DD687DDAC23 0845 (32 car. Hex ou 16 octets)

En objet, l’alias est nécessaireStrictement exigé si la table Employe est

déclarée avec un oid SYSTEM GENERATED

Oid (Ref) visualisé (codé en hexadécimal); ne peut pas être modifié par programmation. Affichage exceptionnel que par SQLPlus.

Affichage de la valeur de l'objet sans son oid :

Select Value (e) -- l'objet fournit sa valeur (sans oid )From EmployeP e Where e.noE = 350;

Idem à un objet non persistant!

Page 30

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 59

REF à portée contrainte (scopée)

Une référence occupe au total 64 octets (plus encombrant que le oid (16 o.)!)

Il est possible de définir des références de 16 octets en définissant une référence dite SCOPÉE.

Une telle référence ne cible que des objets d’une table particulière pré-identifiée

Au niveau de la table-objet:… refChef REF SCOPE IS Ouvrier

Avantage de la REF scopée:

Une REF «scopée » référence obligatoirement un objet de la table cible dite « scopée ».

Modèle Objet © Module 3 page 60

Constructeur d’objet de type table

Création et insertion d’un objet–table avec SQL ** Le nom du constructeur est le type de la table.

Un objet est créé avec SQL au moyen de la clause INSERT INTO … utilisant unconstructeur d’objet dit implicite qui exige une valeur pour chaque attribut:

Insert into Employe values (employe_t ('Picard', 24, 'des Lilas', 'Québec') );

L’objet créé est inséré dans une table, le rendant persistant et lui attribuant un oid permanent. Le même objet défini avec un type comprenant une classe interne pourles objets-colonnes (avec 3 attributs):

Insert into Employe values (employe_t ('Picard', adresse_t( 24, 'des Lilas', 'Québec') ));

Page 31

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 61

Création d’un objet transitoire en PL/SQL

Création et initialisation d’un objet transitoire :

ex. : NEW employe_t ('Picard', 24, 'des Lilas', 'Québec');

Un objet-transitoire :employe devient persistant lorsqu’inséré dans une table-objet.

Les objets sont manipulés en PL/SQL par des variables de même type que ceux de la BDO:

v_employe_t : = NEW employe_t ('Picard', 24, 'des Lilas', 'Québec');

*** Couplage fort entre PL/SQL et le DD du SGBD Oracle.

Idem avec un attribut de type ensemble (pour la classe interne) :

v_employe_t := NEW employe_t ('Picard', 24, adresse_t( 'des Lilas', 'Québec'));

N.B. Il en est autrement avec les autres langages: la struct de l’objet est implémenté avec une struct du langage hôte et estgénéralement beaucoup plus complexe.

Un objet est aussi créé avec un type lorsque le constructeur de type est appelé par le NEW de PL/SQL suivi du constructeur de type.

Modèle Objet © Module 3 page 62

Pseudo shadowingCréation de type incomplet et d'une référence inverse

c_t ( c1: int , c2: ref)

d_t ( d1:int , d2: ref)

La référence inverse est cependant possible en

utilisant un type incomplet.

Create type c_t -- type incomplet

/

Create type d_t as Object ( d1 int, d2 REF c_t) -- le type d_t est créé

/-- mise à jour du type incomplet par un Create :

Create type c_t as Object ( c1 int, c2 REF d_t) -- type complété

/

Utile pour les références circulaires.

Avec Oracle, un type peut utiliser un autre type que s’il est déjà existant dans le DD.

Aucune définition anticipée, aucun shadowing de type.

Page 32

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 63

Exemple d’un type mutuellement dépendant

CREATE TYPE employe_t AS OBJECT ( nomE VARCHAR2(20), dep REF dep_t) -- le type dep_t est absent de la base

/** ERREUR ***

CREATE or REPLACE TYPE dep_t AS OBJECT ( noD int, gerant REF employe_t) /-- le type employe_t est absent de la base

*** IDEM***Le type employe_t ne peut pas être créé car le type dép_t n’existe pas. Idem pour le type dep_t

La solution est d’utiliser un type incomplet:

Create type dep_t -- un type incomplet n’a aucun attribut/Par la suite il faudra le compléter par un Create (et non un update):

Create type dep_t as Object (noD int , gerant REF employe_t) /

Modèle Objet © Module 3 page 64

Visibilité des attributs et Encapsulation

Encapsulation des objets : Les données sont manipulées que par les méthodes sans notion de visibilité explicite pour les attributs et les méthodes contrairement à lavisibilité implantés dans les L3G objet ou avec les SGBD objets qui adhèrent à lanorme ODMG.

*En Oracle , le droit d'accès est accordé à un usager via le type. L'utilisateur voittout : les attributs et méthodes du type sur lequel il a les droits.

Les méthodes sont présumées toujours présentes dans le diagramme de classe, même si elles sont absentes dans les exemples UML et Mnav et cela , pour des raisons pratiques d’allégement des figures.

En principe, un objet de table-objet devrait se comporter comme un véritable objetde classe et être accessible que par son interface. (Rappel)

-Une signature est la liste typée de ses paramètres incluant s’il y a lieu, celui de retour.

- L’interface de classe est l'ensemble de ses signatures.

Page 33

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 65

Comparaison entre les modèles Relationnel et Objet

Le nombre de types dans le Relationnel est environ 15. En objet, nombre illimité (car il y a les TAD ou les UDT).

Le R est basé que sur les valeurs pour implémenter les associations entre tables : partage d'attributs ayant un même domaine. L’objet utilise les REF pour la navigation entre les classes et parcourir les associations. La jointure par valeur n’est cependant pas interdite.

En R, la contrainte référentielle peut être implémentée par la clé étrangère FK; en objet pas de FK obligatoire, la contrainte est remplacée par le REF.

A la création d'un objet et son insertion dans une table (typée et avec oid), la persistance est assurée.

Le oid est muté en pointeur physique dans la RAM : le swizzling accélère l'accès aux objets. Cette transformation est gérée par le SGBD.

* Une référence perdue est une référence dangling (danger d’incohérence) Elle pointe sur un emplacement ne correspondant pas à un objet.

Modèle Objet © Module 3 page 66

Implémentations de quelques modèles navigationnels avec

la technologie de l’objet

Page 34

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 67

Du diagramme de classe UML au Mnav (Rappel)

Transposition du navigationnel à l'objet:

Essentiellement la création des types et des containeurs

Instantiation d’objet:La classe externe instantie un objet qui sera stockée dans une table-

objet, tandis que la classe interne instantie des objets-colonnes (OC).

Les contraintes de multiplicité ne sont pas toutes renforcées par le Mnav (objet). Il faut avoir recours à la logique propre des méthodes pour compléter la validation notamment celles des multiplicités.

Modèle Objet © Module 3 page 68

Implémentation de l’association (1..1 – 1..1) en Objet

EmployeP:

noE*: int

nomE: varchar(50)

Domicile:

no*: int

rue : varchar(50)

telD : varchar(8)

1..11..1

n.b. 1,1 ≡ 1

Exemple: implantation d’un modèle UML simple avec des multiplicités contraignantes:

A_un >

En raison des multiplicités 1..1L’ajout d’un domicile est possible que si les contraintes du modèle sont vérifiées à la fin de la transaction logique d’ajout.

Page 35

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 69

Mnav: implantation des associations avec REF (OR)

REF : une référence vers un ou des objets d’une classe .

Create type domicile_t as object ( no int, rue varchar(30), telD varchar(8))

/

Create type employeP_t as Object (noE int, nomE varchar(50), refAdresse REF domicile_t)

/

Create table EmployeP of Type employeP_t -- création du containeur d’objets (de la table)

La contrainte (not null) sur refAdresse reste à définir ou sera renforcée par la méthode d’ajout.

*** La REF doit toujours avoir un valeur valide pour renforcer la multiplicité.

EmployeP : employeP_t

noE*: int

nomE: varchar(50)

refAdresse

Domicile : domicile_t

no*: int

rue : varchar(50)

telD : varchar(8)

Modèle Objet © Module 3 page 70

Définition des contraintes

Les contraintes sur les attribut et celles définies avec plusieurs attributs se définissent au niveau de la table i.e. du containeur.

Page 36

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 71

Les contraintes définies sur les objets au niveau des tables

Une contrainte est toujours définie via la table et non au niveau du type. Ce dernierest partageable avec d'autres tables qui n'ont pas nécessairement les mêmescontraintes même si elles partagent le même type.

Contraintes de table: clé primaire, clé étrangère, Unicité, Check, …

Create table Employe of employe_t(Constraint pkEmploye Primary Key (mat), Constraint c_salaire Check(salaire is not null and salaire < 99999.00));

Rappel:La définition de clé est INTERDITE via le type: (est définie au niveau de la table)

Create type employe_t (mat int, salaire number (8,2),Constraint pkEmploye Primary Key (mat)

/

Modèle Objet © Module 3 page 72

Création de la table-objet avec des contraintes

REF : une référence vers un objet est construite avec l'oid.

Create table EmployeP of type employeP_t

( constraint pk_noE primary key (noE),

constraint c_nomE check ( length (nomE) <= 50),

constraint c_refAdresse check ( refAdresse is not null) ,

constraint c_verifEmpl check (noE * length (nomE) ) > 56000));

Create table Domicile of type domicile_t ; -- aucune contrainte définie

La multiplicité (1,1) pour Domicile n’est donc pas renforcée avec ce Mnav

EmployeP : employeP_t

noE*: int

nomE: varchar(50)

refAdresse

Domicile : domicile_t

no*: int

rue : varchar(50)

telD : varchar(8)

Contrainte de table vérifiée en dernier

Page 37

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 73

Insertion en violation de multiplicité d’un objet de type Domicile

Insert into Domicile values( domicile_t(500, "des Lilas " , '41854506787 ' ));

Le commit implicite (le défaut) à la fin du DML fait en sorte que l’ajout de cet objet se fera en violation de sa multiplicité i.e. que le domicile ne sera pas associé à un employé comme l’exige le modèle! Il faudra le faire avec un update de l’attribut de référence sans avoir comme dans cet exemple, la garantie de l’atomicité des actions: Insert + insert

Solutions :

A- Faire l’insertion de l’employé et de son domicile avec deux DML Insert mais dans la même transaction définie dans l’application avec report de la vérification des contraintes par le noyau.

B- Faire l’ajout du domicile et de l’employé par une seule méthode exigeant aussi la définition d’une transaction au sein de la méthode.

Modèle Objet © Module 3 page 74

Association: Interrogation avec navigation par le REF

Navigation possible entre les tables en utilisant le type REF: formulation d'une requête plus simple et calcul plus rapide .

Select E.nomE, E.refAdresse.telDFrom EmployeP EWhere E.refAdresse.rue = 'desPignes‘ ;

Multiplicité 1..1 du côté Domicile: La contrainte sur refAdresse exige de référer à un et un seul objet de Domicile.

Une contrainte IS NOT NULL étant définie sur l’attribut refAdresse. L’ajout d’un employé doit se faire obligatoirement avec un domicile! N.B. L’utilisation de l’alias est obligatoire.

EmployeP : employe_t

noE*: int

nomE: varchar(50)

refAdresse

Domicile : domicile_t

no: int

rue : varchar(50)

telD : varchar(8)

Chemin de navigation

Page 38

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 75

Interrogation avec une sélection exploitant la navigation

** La colonne refAdresse n’est pas une donnée de l’usager => écart avec le relationnel

Select E.nomE, E.refAdresse.telDFrom EmployeP EWhere E.refAdresse.rue = 'desPignes‘

and E.refAdresse.no = 450and E.noE = 100;

Cette navigation est rendue possible par l’oid

Renforcement de la multiplicité 1..1 du côte EmployeP avec ce Mnav:

Par la méthode dont le code permet de vérifier qu’à l’ajout d’un domicile, il y a obligatoirement un employé et un seul qui l’habite.

Modèle Objet © Module 3 page 76

Autre Mnav équivalent: une ref vers Employe

EmployeP : employe_t

noE*: int

nomE: varchar(50)

Domicile : domicile_t

no: int

rue : varchar(50)

telD : varchar98)

refEmp

Select d.refEmp. nomE, d.telDFrom Domicile d Where d.rue = 'desPignes‘

La multiplicité 1..1 de la classe Domicile renforcée par la ref qui ne peut avoir qu’une seule valeur non nulle.Avec une seule ref, une seule multiplicité est donc renforcée!

La multiplicité (1,1) pour Employe n’est pas renforcée avec ce Mnav autrement que par une méthode.

Page 39

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 77

Mnav avec deux REF (parcours non privilégié) et type incomplet

REF : une référence vers un objet, construit avec l'oid.

Create type employeP_t / -- type incompletCreate type domicile_t as object ( no int, rue varchar(30), telD varchar(8), refEmploye REF employeP_t) /

Create type employeP_t as Object (noE int, nomE varchar(50), refAdresse REF domicile_t)

/

EmployeP : employeP_t

noE*: int

nomE: varchar(50)

refAdresse

Domicile : domicile_t

no*: int

rue : varchar(50)

telD : varchar(8)

refEmploye

Les multiplicités (1,1) pour Employe et Domicile sont renforcées (via la définition des contraintes au niveau table) au prix d’une gestion plus complexe des ajouts, suppressions et mises à jour faites dans une même transaction.

Modèle Objet © Module 3 page 78

Mnav avec 2 références : complexité accrue des actions sur le modèle

Create table EmployeP of employeP_t (constraint c_refAdresse check ( refAdresseis not null));

Create table Domicile of domicile_t ( constraint c_refEmploye check (refEmploye si not null));

Insert into EmployeP e values (employeP_t( 109, ‘Jules’,null));

Insert into Domicile values (domicile_t(567, ‘des Fleurs’, ‘3456789’, null));

Update EmployeP e set e.refAdresse = (Select ref(d) from Domicile d Where d.telD = ‘3456789’) Where e.noE = 109;

Update Domicile d set d.refEmployeP = (Select ref (e) from EmployeP e where e.noE = 109)Where d.no = 567;

N.B. Avec 2 refs, les deux multiplicités peuvent être renforcées dans une même transaction avec report de la validation des contraintes. La mise à jour du modèle devient plus complexe et doit se faire dans une transaction non interruptible.

Interdit pas la contrainte

Page 40

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 79

Commentaires sur l’usage des 2 références inverses

1. Avec 2 références obligatoires les 2 multiplicités 1..1 sont renforcées dans une même transaction avec report de la vérification des contraintes.

2. La non interruption (une propriété ACID) dans un contexte d’accès concurrentiel (multi usager) exige que ces actions soient intégrées dans une transaction du genre TL (Transaction Logique) définie par le développeur. (voir plus loin comment définir une TL)

3. Tout ajout d’un objet doit être suivi (sans interruption) de celui d’un autre objet: l’ajout d’un employé doit être suivi de l’ajout d’un domicile et dans les 2 cas les références sont nulles. Les ajouts se font dans la même TL.

4. Les insertions d’objets doivent être suivies sans interruption par 2 ordres Update de la référence donc dans la même TL

5. Cette complexité est cependant masquée au développeur si les clauses sont intégrées dans une méthode définissant une transaction et cela avant d’effectuer cette mise à jour.

Modèle Objet © Module 3 page 80

Les transactions avec les objets

Les propriétés ACID d’une transaction doivent être renforcées par le moteur SGBD, notamment avec les objets:

1- Atomicité: tout ou rien

2- Cohérence préservée : avant et après la transaction

3- Isolation: transaction exécutée comme si elle était seule

4- Durabilité (persistance): au commit (validation) d’une transaction les données modifiées ou ajoutées sont persistantes.

Pour y arriver, le SGBD a un système de verrous utilisé selon un algorithme précis pour autoriser la concurrence sans interférence avec les autres transactions.

Page 41

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 81

Cohérence et transaction logique

Un modèle représente les objets dans leur état stable i.e. qu’il modélise l’état de l’ensemble des objets à un moment t lorsqu’il y a aucune action ou manipulation en cours.

Transaction logique (TL)Les manipulations des objets (ajout, mise à jour et suppression sur un ou plusieurs objets declasses différentes) sont exécutées par une suite d’actions élémentaires non interruptiblesprésumant la validation ultérieure réussie des contraintes, notamment celles des multiplicités.

Exemples:Ajout d’un employé : une seule action d’insertion dans la BD compose la transactionlogique; à la fin de cette action les contraintes de multiplicité seront vérifiées et la BD est laisséedans un état stable et cohérent.

Ajout d’un employé et d’un département dans la même transaction logique; à la fin de la TL les contraintes de multiplicité seront vérifiées.

Important: Si la cohérence est mise en péril, la TL doit être annulée. Le principe du Tout ou Rien s’applique!

Modèle Objet © Module 3 page 82

Exemple d’incohérence avec une TL

Professeur:

matP* : string

nomP : string

statutP : char

Cours:

noCours* : string

titreC : string

nbCr : integer

EstResponsable >

1..11..*

1- Si un applicatif veut ajouter seulement un professeur dans la base:TL1 : Ajout professeur ( 'mat45 ', ' Tremblay’, ' P') ;

Cet ordre Ajout constitue une transaction logique simple (implicite). Si l’additionest autorisée par le SGBD, la base sera alors dans un état incohérent au regarddu MCD dont la multiplicité est 1..1 du côté Cours.

Il faut ajouter obligatoirement un cours au prof dans la même transactionavant la vérification des contraintes du modèle objet par le noyau du SGBDO.

Page 42

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 83

Actions dans le cadre d’une transaction logique

2- Si les deux actions sont incorporées dans une même transaction logique soit:

TL2: Ajout professeur ( 'mat45 ', ' Tremblay ', ' P ') ;Ajout cours values (45, ' C++ ', 3);

** la création de la référence est supposée se faire dans cet exemple

A la fin de la TL2, la cohérence du modèle est respectée (donc celle de la BDO) parceque les multiplicités sont validées conformément au modèle. Cette cohérence découle de latransaction logique (TL).

Dans le cas contraire, la transaction en cours sera défaite (retour au point de cohérence deDépart: atomicité)

Comment alors définir une transaction ?

Modèle Objet ©

Contrainte Deferrable définie pour la table-objet

84

Create Table Stage of stage_t

(Constraint Pk_Stage Primary Key (noS) Deferrable, (1)

Constraint U_matricule Unique (matriculeE) immediate Deferrable, (2)

Constraint PK_non_null Check( noS is NOT NULL), (3)

Constraint FK_non_null Check( matriculeE is NOT NULL) Deferrable); (4)

(1 ) contrainte qui peut-être reportée, mais à l’ouverture de la BDO, elle est active

(2) contrainte qui est reportée à l’ouverture de la BDO, elle est active

(3) contrainte non reportée, validée dès que l’attribut est modifié

(4) contrainte qui peut-être reportée, mais à l’ouverture de la BDO, elle est active

Page 43

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 85

Transaction logique et transaction physique

Une transaction logique devient une transaction (physique) avec un SGBDO particulier par un marquage spécial du début et de la fin de la transaction. Ce marquage varie selon le SGBD. Avec Oracle :

• Début : l’exécution d’un 1er DML• Fin: Commit

Les contraintes de table sont vérifiées qu’à la fin de la transactionsi et seulement si les contraintes de table dont dites reportables (Deferrable) dans le schéma de la BDO.

Le report de la vérification des contraintes du schéma s’applique à chaque transaction. Exemple : SET Constraints ALL Deferred (pour toutes les contraintes reportables)dans SqlPlus: SET Constraint c1_xxxxx DEFERRED ; -- avec contrainte nommée

SET Constraint c2_yyyyy DEFERRED ;

Dans l’applicatif PL/SQL: Execute Immediate ‘Set All Constraints Deferred’;

Modèle Objet © Module 3 page 86

Intégrité d’une transaction avec la méthode

La cohérence peut être assumée à deux niveaux:Niveau méthode: La logique interne d’une méthode peut sous-tendre plusieurs actions et pour maintenir la cohérence, la méthode doit définir la transaction sans égard à l’application.

ex.: début TL par la méthode Ajout objetajout d’un objet o1;ajout d’un objet o2; - pour ainsi valider la multiplicité

fin de la TL par la méthode Ajouto1o2

Niveau application (source d’incohérence?):L’application a la responsabilité de maintenir la cohérence du modèle en définissant le début et la fin de la transaction.

ex.: début de la TL par l’applicationajout objet o1;ajout objet o2;

fin la TL par l’application**** Dans ce cas, le contrôle sur la transaction assumé par l’application est une source potentielle d’erreurs.

Page 44

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 87

La clé primaire avec le modèle objet

L’oid généré avec la clé primaire est plus compact que celui généré par le système.

Un attribut de type REF avec un oid dérivé de la clé primaire est connuecomme une primary-key-based REF ou pkREF et occupe moins d’espace que l’oidgénéré par le système.

Une REF du genre pkREF doit avoir une contrainte de type REFERENCES pour

éviter les REFs indéterminée (non valide) (dangling).

** dangling : référence qui ne pointe pas sur un objet valide.

Modèle Objet © Module 3 page 88

Racine de persistance d'un objet de table (OT)

Un objet est créé dans un applicatif et devient persistant lorsque:

- inséré dans une table typée (OT):

Insert Into EmployeP values (v_empl);Insert into EmployeP values (employeP_t ( 235, ‘Paul’, ……..));

- inséré dans un objet de table qui est persistant (le cas du OC). Dans ce cas l’objet imbriqué n’a pas d’oid propre.

-- NB: Les objets des langages L3G objets ne sont pas persistants à moins que le langage le soit i.e. génère et gère la création d'objets persistants.

Page 45

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 89

Couplage avec le DD et ré-Insertion d’un objet avec Value()

Declare /* avec une proc PL/SQL dans l’environnement sqlplus */

v_empl employe_t; -- variable pl/sql dont le type objet défini dans le dictionnaire (DD)-- Couplage fort entre le langage procédural et le dictionnaire de données

Begin/* v_empl := NEW employe_t (234, ‘Julie’, null)) */Select value(e) into v_empl from EmployeP e Where e.noE = 234; -- voir 1

Insert into EmployeLibere values (v_empl); -- voir 2 nouvel objet avec même valeur…

Delete Employe e Where e.noE = 234; End;/1- recherche un objet par sa clé primaire. Chargement dans la variable objet v_empl mais sans son oid2- chargement de l’objet dans la table EmployeLibere ce qui lui donne un nouvel oid; c’est donc un nouvel

objet même s’il est idem par ses valeurs.

Modèle Objet © Module 3 page 90

Accès à un objet: Fonction DEREF()

La fonction REF(x) (où x est un objet) donne l'oid de l'objet x persistant.

De façon similaire, la fonction DEREF(a) (où a est une référence incluant le oid) rend l'objetcorrespondant et l'assigne à une variable du type de l’objet.

Exemple: applicatif PL/SQL: Set serveroutput ON Declarev_ref REF client_t; -- var. de type refv_client client_t; -- variable objet de type client_tv_clientA client_t

BeginSelect REF(x) Into v_ref from Client x Where x.matC = 10000;Select DEREF(v_ref) Into v_clientA From Dual;

Insert into ClientAncien Values(v_clientA); -- partage du type client_tDBMS_OUTPUT.PUT_LINE(v_clientA.nomC);…..End;

/

Page 46

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 91

À propos du type REF et le swizzling

La référence REF pointe sur (identifie) un objet sans égard à son placement physiquesur le disque. (location independancy).

Rappel:Le Ref ne peut donc pas pointer directement un objet dans la RAM comme un

véritable pointeur physique sait le faire.Un objet dans la cache RAM voit ses Refs transformées en pointeurs physiques pour accélérer l'accès: c'est la transformation ou mutation des Refs (le swizzling)

Cette mutation est prise en charge par le serveur (pour l’approche serveurd'objets (Oracle). Dans un système serveur de pages d’objets, la mutation peut êtrefaite par un module installé sur chaque client .

page

objet

Des objets sont échangés entre l’application et le client

Modèle Objet © Module 3 page 92

Définition claire et simple d’une classe d’objets (Système O2)

Définition d'une classe avec la technologie objet d système O2 sans référence explicite vers un objet.

Class Personne typetuple ( nom : string,

age : integer,conjoint : Personne, enfants : set (Enfant),ville : tuple ( nom: string, code : integer),

pays : Pays)End;

Classe objet

* Structure complexe de type tuple.

Personne: Enfant:0..*

0..1

< Conjoint_de

Page 47

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 93

(cohabitation: objet avec technologie relationnelle)

Une table relationnelle peut maintemant contenir aussi un objet-colonne ((OC). Le tuple de la table qui contient un OC n’est cependant pas un objet!

Table-objet (table typée):Create Type bourse_t as Object (noB int, nomB varchar2(50))/Create Type etudiant_t as Object (nom varchar2(50), age int, bourse bourse_t)/

Create Table Etudiant of etudiant_t; -- table-objet

Table relationnelle: Chaque tuple de la table n’a pas de oid!

Create table Etudiant (nas int, bourse bourse_t); -- table relationnelle avec OC

Cette dualité de la technologie permet de faire un passage en douce vers l’objet en préservantl’acquis relationnel!

Objet- colonne

Modèle Objet © Module 3 page 94

Différentes initialisation des objets de table (Oracle)

Page 48

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 95

Insertion d’un objet OT et OC avec Oracle

Objet de table (OT) créé et initialisé dans un Insert en utilisant d’un constructeur.

Cas 1: Un objet de table (OT) a le type d’une classe du Mnav

Insert into Employe values (employe_t(‘Dupont’, 35, ‘Québec’, 4000.00));

*** Le type de la table doit être défini au préalable:

Cas 2: Incluant un objet de colonne (OC): Insert into Employe values (employe_t

(‘Dupont’, 35, salaire_t( ’ Québec’, 4000.00)));

Même info rangée dans la table mais structurée différemment.

Modèle Objet © Module 3 page 96

Interface OT et OC

Quelle est la différence entre les deux insertions précédentes?

Dans les deux cas, la même information est insérée dans des tables objets mais avec des structures différentes.1er cas: l’objet peut être traité que par les méthodes de l’interface de OT

2ème cas: l’objet de table ajouté comporte un objet–colonne. Une manipulation particulière de cet OC pourra se faire par son interface propre. Les méthodes OT demeurent toujours disponibles pour les objets de la table.

Exemple : Pour mettre à jour les nom et salaire des employés. L’interface de la classe n’offrepas de méthode adéquate pour modifier le salaire tandis que l’interface de la classeinterne ou OC a une telle méthode.

Page 49

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 97

Procédure PL/SQL d’initialisation d'un objet de table (OT)

Create type employe_t as Object (no int, nom varchar(45), adresse varchar(60) /

Un objet est initialisé à sa création soit: Par des valeurs fournies au constructeur d'objet ou au NEW de PL/SQLEx. employe_t (‘Delphine’, 35, 45000) -- création avec le constructeur

Soit par défaut selon les valeurs formulées dans le schéma objet

Si aucune valeur n'est fournie, il y a erreur. Declarev_emp emp_t; -- ce type est connu car présent dans le DDbeginv_emp := NEW employe_t( ); -- le constructeur n’a pas de valeur par défaut.

insert into Employe values (v_emp);End;

PLS-00306: nombre ou types d'arguments erronés dans appel à ‘EMPL_T‘v_emp := NEW employe_t(345, ‘Gustave’, null); L’employé 345 n’a pas encore d’adresse.

N.B. En Java un objet de travail est cependant créé avec des valeurs implicites par défaut.

Modèle Objet © Module 3 page 98

Méthode de l'objet OC

Un objet-colonne peut avoir ses propres méthodes. Le partage du type, avec la création d'une autre table-objet ayant le même type de l'OC est possible et les méthodes de OC du type deviennent alors celles de la classe interne ou de la sous-table imbriquée.

Les méthodes de l’interface d’un OC ne s'appliquent pas à un objet nil , mais s’appliquent aux objets NULL (ceux qui peuvent pas être mis à jour par la suite).

Page 50

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 99

Création et initialisation par défaut des objets de table (OT) et des objets-colonnes (OC)

ImportantEn mode exploitation, les création, suppression et mise à jour seront réalisées par des méthodes et non directement avec les DML comme dans les exemples qui suivent.

Modèle Objet © Module 3 page 100

Objet null et nil (atomically null)

Create type adr_t as object (no int , rue varchar(40))/Create type emp_t as object (nas int, adr adr_t)/Create table Emp of emp_t;

Insert into Emp values (emp_t(1, adr_t(null, null))); -- objet null qui peut être mis à jour

Insert into Emp values (emp_t(2, null)); -- objet null qui ne peut pas être mis à jour

Page 51

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 101

Exemple de mise à jour des objets nils et nulls

Mise à jour des objets nil et null

Create type adr_t as object (no int , rue varchar(40))/Create type emp_t as object (nas int, adr adr_t)/Create table Emp of emp_t;Insert into Emp values (emp_t(1, adr_t(null, null)));Insert into Emp values (emp_t(2, null));Update Emp e set e.adr.no = 20 where e.nas=2;Update Emp e set e.adr.no = 20 where e.nas=1;Delete Emp;SQL> Update Emp e set e.adr.no = 20 where e.nas=2;Update Emp e set e.adr.no = 20 where e.nas=2

*ERROR at line 1:ORA-02309: violation de NULL atomique

SQL> Update Emp e set e.adr.no = 20 where e.nas=1;

1 row updated.

Modèle Objet © Module 3 page 102

Affichage des objets de la table-objet et de ses valeurs

Affichage des objets OT dépourvus de leur oid mais avec leur constructeur: Select value(e) From Emp e ;

** La fonction value() fournit l’objet sans oid. Le constructeur est affiché avec sqpplus pour rappeler que c’est un objet qui est affiché. Normalement, les objets étant lus et manipulés par une application au moyen de varaiables –objets.

VALUE(e) (MATE, NOME, ADR(NO, RUE, VILLE))EMP_T(1, 1 , NULL) -- objet OC nil est perdu à jamaisEMP_T(2, ADR_T(null, null)) – OC Null

Cas spécial: affichage avec SQLPlus:Affichage des valeurs des objets OT sans leur constructeur.Pour la mise au point des clauses SQL, il est possible d’afficher que les valeurs:

SQL> Select * From EmployeSup;MAT ADR(NO, RUE, VILLE)1 ---objet nil2 ADR_T(NULL, NULL)

Page 52

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 103

Création et initialisation des objets: null et nil dans PL/SQL

Create type metier_t as Object(metier varchar2(25), classe char(1))/ Create type employeU_t as Object (mat int, metier metier_t)/Application PL/SQL pour la création: Declare -- dans un bloc anonyme PL/SQL

v employe_t ;n employe_t ;o employe_t ;Begin -- le constructeur implicite employe_t() exige une valeur pour tous ses paramètres.

v := NEW employeU_t(250, NULL); -- OC niln := NEW employeU_t (500, metier_t(null, null)); -- OC nullo := NEW employeU_t (500, metier_t('technologiste', 'A')); -- OC initialiséInsert into EmployeU values(o); -- objet o rendu persistant et assignation d’un oidEnd;

L'objet-colonne v est nil donc non modifiable. L'objet n est null et modifiable. L'objet colonne de oest initialisé par le constructeur.

Modèle Objet © Module 3 page 104

Cas particulier: mise à jour de l'objet-colonne (OC)

Avec Création de l’OC:Update EmployeSup p SET p.adr = adr_t (99, null, null)

Where p.matE = 104; -- identifie 1 seul OT

SQL> Select * From EmployeSup;

MATE NOME ADR(NO, RUE, VILLE)104 Desbiens ADR_T(99, NULL, NULL) -- OC est mis à jour101 Desbiens -- objet nil

Mise à jour de l'objet OT 101 avec création de l’objet colonne OC (matE = 101)Update EmployeSup p SET p.adr = adr_t(88, null, null)

Where p.matE = 101;

MATE NOME ADR(NO, RUE, VILLE)104 Desbiens ADR_T(99, NULL, NULL)101 Desbiens ADR_T(88, null, null)

Page 53

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 105

Indexation et persistance des OT et OC (Oracle)

Objet de table: indexation automatique avec les oids dérivés SYSTEM.

Création avec le INSERT et un constructeur de type approprié.

Indexation de l’objet-colonne par valeur: Insertion de l'objet hôte dans une table rend son objet-colonne (qui n'a pas de

oid) persistant. Indexation des objets-colonnes est possible mais par valeuri.e. pour chaque attribut de la classe interne.

Create index employeAdresse_idx on Employe(adresse.rue);

Attribut de l’OC

Modèle Objet © Module 3 page 106

Les triggers (Oracle) associés à une table-objet: ses limites

Un trigger Oracle peut-être associé à une table-objet mais il y a des limites:

1- Un trigger ne peut pas définir normalement une transaction (donc se terminer par un commit).

2- Un trigger ne peut pas être associé à une table imbriquée (OC) soit la table physique correspondant à la nested table, ni à un de ses attributs.

3- Aucun trigger ne peut aussi modifier un LOB.

4- Un trigger n’est pas reporté (DEFERRABLE ) comme peut l’être les contraintes de table et d’attributs.Leur usage est aussi restreint car il hypothèque la performance du SGBD recherchée dans le cadre du paradigme objet.

Page 54

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 107

Suppression d'objets : plusieurs approches

Via la suppression d'une table : DROP Table Employe;Entraîne la suppression des objets, du containeur, des privilèges et des index

éventuels définis sur cette table Employe.Rend aussi inopérant les composants dépendants : déclencheurs (triggers), vues.

TRUNCATE TABLE Employe [DROP | REUSE STORAGE ]Supprime que les objets sans supprimer le containeur ni créer desegments de rollback. N’enregistre aucune entrée dans une vue matérialisée ….Les objets sont supprimés mais l’espace peut-être conservé (REUSESTORAGE).

Invalidation des objets par la suppression forcée d'un typeDROP TYPE employe_t FORCE;

Suppression, même si d’autres objets utilisent le type!!! Les objets restent dans la base et sont temporairement invalides!!!

Modèle Objet © Module 3 page 108

Quelques infos rangées dans le dictionnaire

Page 55

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 109

Dictionnaire Oracle des objets (DD)

Le dictionnaire est composé de tables-objets don’t chaque objet décritnotamment les types. Celles-ci sont accessibles via les vues statiquessuivantes :

USER_COLL_TYPES : pour décrire les collections (sous-tables)USER_INDEXTYPES : pour décrire les indexUSER_TRIGGERS : pour obtenir le texte d’un triggerUSER_TYPES : pour décrire les typesUSER_TYPE_ATTRS : pour décrire les attributs des typesUSER_TYPE_METHODS : pour décrire les méthodes des typesUSER_TYPE_VERSIONS : pour décrire les versions des types

USER_SOURCE : décrit notamment le texte des types d’un utilisateur;USER_TYPES

Select * from User_Types;Select * From type_name, attributes, methods from User_Types;

Modèle Objet © Module 3 page 110

Information sur les types avec le dictionnaire (DD)

La table (en réalité une vue) du dictionnaire, USER_TYPES fournit des informations sur la hiérarchie des types :

SQL> describe User_types --- fournit les attributs de la table User_tupesNom (attributs) NULL ? Type

TYPE_NAME NOT NULL VARCHAR2(30)TYPE_OID NOT NULL RAW(16)TYPECODE VARCHAR2(30)ATTRIBUTES NUMBERMETHODS NUMBERPREDEFINED VARCHAR2(3)INCOMPLETE VARCHAR2(3)FINAL VARCHAR2(3)INSTANTIABLE VARCHAR2(3)SUPERTYPE_OWNER VARCHAR2(30)SUPERTYPE_NAME VARCHAR2(30)LOCAL_ATTRIBUTES NUMBERLOCAL_METHODS NUMBERTYPEID RAW(16) (oid du type)

Select *From USER_TYPESWhere type_name = 'ETUDIANT_T'; --- NB le nom du type est stocké en majuscules

Page 56

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 111

Quelques tables utiles inscrites au dictionnaire

Le dictionnaire de données est présent en RAM, chargé avec la tableSpaceSYSTEM et ce dès le lancement du noyau du SGBD.

Schéma des tables du DD:Desc User_Object_Tables; -- pour les tables objets

Les tables objets sont affichées:Select table_nameFrom User_Object_Tables;

Modèle Objet © Module 3 page 112

Information pratiques sur les clauses de création des objetsSQLPlus

Pour voir le texte source utilisé pour créer (via le constructeur) les objets:

Sqlplus : SET long 600 -- affichage jusqu’à 600 caractères

Select * from User_Source ; -- liste de la définition des types

Affiche le texte:

Select name, text From User_Source Where name = ‘VILLE_T’;

NAME TEXTVILLE_T Type ville_t As Object (noV int, nomV varchar(50)) …

Page 57

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 113

Recouvrement du texte d’un trigger

Une table dans le dictionnaire appelée user_triggers a un attribut : « trigger_body ».

Il suffit donc de faire :Select trigger_body From USER_TRIGGERSWhere trigger_name = le nom du trigger

Attention :L‘application SQLPlus affiche par défaut que les 80 premiers caractères du texte.

Il faut donc l'élargir : avec la directive de SQLPlus: Set long 300

Modèle Objet © Module 3 page 114

Évolution de la table-objet versus celle non typée

Une table non typée évolue plus facilement : ex. Ajout d'un attribut age dans la table non typée Employe .

Raison: le MR normalisé sous-tend la présence d'un attribut non primairedans une seule table.

Création d'une table temporaire avec le schéma de EmployeCreate table Tempo (matricule int, nom varchar(50) adresse adr_t);

Insert into Tempo Select * from Employe; Création de la nouvelle table : (Drop table Employe)Create table Employe (matricule int, nom varchar(50) adresse adr_t, age int); Rangement des tuples stockés dans la table Tempo ***:

Insert into Employe Select * from Tempo;

*** Les valeurs pour le nouvel attribut age sont absentes et représentées par des indicateursde NULL.

Page 58

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 115

Évolution du schéma de la table-objet : Cascade

Plus difficile (?) en raison essentiellement du partage des types:

Ajout de age dans la table-objet Employe:

Il faut modifier le type employe_t avec des effets collatéraux possibles:

Répercussion possible sur d'autres tables-objets (du même proprio) partageant le type employe_t ou sur un autre type défini avec employe_t (comme un sous-type).

Create table Employe of employe_t;

Alter type employe_t ADD Attribute age int CASCADE; (recompilation du type par défaut)

Modèle Objet © Module 3 page 116

Évolution du schéma de la table-objet

Describe employe_t;

Très important en pratique:*** la modification sur le type se fait directement dans le dictionnaire et non sur la

copie du type en cache. Pour l’actualiser dans la cache , il faut quitter la session SQL/Plus et se connecter à nouveau au SGBD. La cache est alors rafraîchie.

Répercussion suite à un changement de type:Si le type employe_t est utilisé par des objets-colonnes :

cadreSup_t delegue_t chef_t

Page 59

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 117

Navigabilité et indexation avec les clés primaires

Par défaut: toute association a un parcours bidirectionnel. Il est possible de privilégier une direction par le symbole ou >

ClubDeSport :

noCS* : int

siteCS:

abonnementCS:

Abonne :

nasA* :string

nomA:

periodeA:

< Est_Inscrit0..* 1..*

Navigabilité

Dans ce modèle l'accès au club de sport peut se faire via un abonné autant que par unclub de sport. Au niveau du Mnav, il y a un lien multiple vers ClubDeSport.

L’accès à l’abonné sera fait via un index défini sur nasA. Idem pour un accès dans le sens inverse.

N.B. L’ajout d’un nouveau club se fait dans une TL qui doit aussi comprendre l’ajout d’au moins 1 abonné à ce nouveau club! A la fin seulement de la TL, la multiplicité 1..* du côté Abonné est ainsi vérifiée.

Modèle Objet © Module 3 page 118

Report de la validation des contraintes : DEFERRABLE

Contraintes de ce modèle:

1. ** L’ajout seulement d'un étudiant dans une TL sous-tend une violation de la multiplicité 1..1!

2. La suppression de l'étudiant entraîne celle de son stage.

3. Idem pour l’ajout et la suppression d’un stage.

Pour valider ces contraintes il faut utiliser une TL avec report de la vérification des contraintes.

EtudiantmatriculeE* : int

nomE : string

Stage:noS* : int

themeS : string

respS: string

1..1 1..1

EffectueUn >

Page 60

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 119

Report des contraintes

Create type etudiant_t as Object (……….) /

Create type stage_t as Object (……)/Create Table Stage of stage_t

(Constraint Pk_Stage Primary Key (noS) Deferrable, -- par défaut immediateConstraint U_matricule Unique (matriculeE) immediate Deferrable, (1)Constraint PK_non_null Check( noS is NOT NULL),Constraint FK_non_null Check( matriculeE is NOT NULL) Deferrable);

(1) La contrainte est en vigueur immédiatement au moment de la création du schéma, mais peut-être reportée par la suite dans une procédure.

Modèle Objet © Module 3 page 120

Définition en PL/SQL de la transaction avec report des contraintes

Pour réaliser ces ajouts dans l’applicatif il faut utiliser une TP et reporter la validation des contraintes au Commit:

SET Constraints ALL Deferred; --En SQLPus ; toutes les contraintes Deferrable sont reportées y compris le Check spécifié comme une contrainte de table.

SET Constraint c1_verif_asso_oblig DEFERRED ;

Début de TP: Insertion d’un stage sans titulaire étudiant;BeginExecute Immediate ‘Set Contraints ALL Deferred’ ;Insert into Etudiant values (etudiant_t( 200, 'Jacques' null));/* Insertion d’un étudiant titulaire du stage 120: */Insert into Stage values (stage_t(120. ‘testing’, ‘S. F.’)); Update Etudiant e Set e.refnoS = (select REF(s) From Stage s where s.noS = 120)

Where e.matriculeE = 200; COMMIT – lancement de la validation de toutes les contraintes;End;

Après le commit, toutes les contraintes sont réactivées.Ou par l’exécution du Execute Immediate: ‘Set constraints immediate’; réactive toutes les contraintes

Une telle transaction sera éventuellement encapsulée dans une méthode.

Page 61

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 121

Implantation du lien multiple: interne et externeTable imbriquée

Modèle Objet © Module 3 page 122

matricule *: int

nom: varchar

lesSalnet

Employe: employe_t

annee: Date

salNet : real

Salnet : sal_t

SalNet: salnet_t

annee: int

salNet : int

Employe: employe_tmatricule *: int

nom: varchar

lesSalnetM2

Liens multiples : interne et externe

M1

M1: avec une classe interne; M2 : avec une classe externe Quelles sont les caractéristiques de chaque modèle au regard de l’insertion , la suppression et de la modification ?

LesSalnet est un attribut d’ensemble dont les éléments sont des références à la classe externe salNet. lesSal := { salNet_t}.Ce lien multiple peut être réalisé avec une classe interne pour les références.

Page 62

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 123

Caractéristiques des deux modèles navigationnels

Action sur la calsse Employe

M1 (1 classe avec imbrication) M2 (2 classes)

Ajout Ajout 1 employé sous-tend aussi l’ajout d’un salaire.

Idem mais avec un échange éventuel de pages d’objets pour obtenir les salaires.

Modification Sous-tend la lecture des objets de Employe et de Salaire dans un même accès: partage possible de la même tablespace mais de pages différentes.

Sous-tend la lecture seulement de l’objet à modifier: :employe

Suppression Une lecture et une suppression de l’employé et salaire.

2 lectures + suppression pour la même opération

Modèle Objet © Module 3 page 124

Représentation tabulaire de M1 avec une table imbriquée

matricule* :int nom :varchar(50) lesSalnet: lesSalnet_t

1234 Savoie

1456 Lachance

annee salNet2000 45K$2001 46K$2001 46K$

1. La table-objet typée par employe_t a 3 attributs: matricule, nom et lesSalnet;

2. Chaque attribut a un nom et un type.

3. L'attribut lesSalnet correspond à une classe interne donc un ensemble dont chaque élément a comme les attributs: [annee et salNet] . Chaque objet identifiépar un matricule incluant un ensemble d’objets de type lesSalnet_t.

Employe: employe_t

Une 1ère collection (set)

Avec lesSal_t := { sal: sal_t}

Page 63

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 125

M1 : Objet de table comportant une Collection (d’objets)

La table précédente Employe contient 2 objets :

Le 1er objet de table : a une collection formée de deux objets-colonnes :

oid1 : [1234, 'Savoie', { [2000, 45K$], [2001, 46K$]}

le 2e objet a aussi un OC formé avec une collection composée d’un seul objet-colonne.

oid2 : [1456, 'Lachance', { [2001, 46K$] }

Modèle Objet © Module 3 page 126

Création des tables pour M1

Create or Replace type salnet_t as object (annee Date, salNet number (8,2)) /Create type lesSalnet_t AS TABLE OF salnet_t/Create type employe_t as object ( matricule int , nom varchar(40), lesSalnet lesSalnet_t)

/

Création du containeur:

Create table Employe of employe_t NESTED TABLE lesSalnet STORE AS Table_lesSalnet ;

Page 64

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 127

Ajout de OC dans la table imbriquée de M1

Insert into Employe values (employe_t(1234, 'Savoie', lesSalnet_t (salnet_t(to_date(2000,'YYYY'), 45000),salnet_t(to_date(2001,'YYYY'), 46000) )

));

Insert into Employe values (employe_t(1456, 'Lachance', lesSalnet_t(salnet_t(to_date(2001,'YYYY'), 46000)

)));

Les objets-colonnes sont imbriqués dans la table hôte. La suppression d’un objet de table Employe entraîne aussi l’historique de ses salaires.

Modèle Objet © Module 3 page 128

Représentation de M2 avec une classe externe pour l’historique des salairesDescription graphique de la table typée employe_t avec des références REF défnies comme un attribut d’unetable imbriquée des références.:

Matricule* :int nom :varchar(50) lesrefSal: lesrefSal_t

REF salnet_t

1234 Savoie

1456 Lachance

L’historique des salaires est rendue par l’attribut lesSalnet qui correspond à une table externe dont les objets ont leur propre. Attention: La sous-table intégrée est une vision logique, l’implantation physique est différente: 3 tables sont crées.

Salnet : salnet_t

annee*: montantBrut:

2000 45K$2001 46K$

Employe : employe_t

2 ref à des

objets-

externes

Page 65

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 129

M2: Création de la table-objet pour un modèle avec une classe externe

Create type salnet_t as object (annee int , montantBrut number (8,0) ) /Create type lesrefSal_t AS TABLE OF REF salnet_t/Create type employe_t as object ( matricule int , nom varchar(40), lesrefSal

lesrefSal_t) /Create table Employe of employe_t NESTED TABLE lesrefSal STORE AS Table_lesrefSal ;

Create table Salnet of salnet_t ;

Insert into SalNet values(salNet_t(2000, 45000));Insert into SalNet values (salNet_t(2001, 46000));

Modèle Objet © Module 3 page 130

Insertion avec un ensemble de REF

Insert into Employe values (employe_t( 1234, 'Savoie', lesrefSal_t( (select Ref(s) from SalNet s Where s.annee = 2000), (select Ref(s) from SalNet s Where s.annee = 2001))));

sqlplus: select * from Employe;

MATRICULE NOM LESSAL1234 Savoie LESSAL_T(000022020827069D438A094D459F9B0A77E1E3CECB044502A1952C44AF9AAA83353B6724F2,

000022020865C2EAAB650E450D9A122570529AB24D044502A1952C44AF9AAA83353B6724F2)

Insert into Employe values (employe_t( 1456, ‘Lachance', lesrefSal_t( (select Ref(s) from SalNet s Where s.annee = 2001))));

Page 66

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 131

Avantages du modèle M2

- Toute recherche se limitant à des informations nominales des employés (ex. matricule et nom ) sera effectuée plus rapidement s’il y a plus d’objets sont dans la même page en raison de la taille la table

- Plus il y aura d’objets de type Employe dans une page ==> le balayage du « genre table scan » sera plus rapide.

- Donc un avantage pour certaines interrogations et mises à jour: « full table scan » avec des mises à jour de nombreux objets de la même table-objet

Modèle Objet © Module 3 page 132

Modèle M3 avec liens interne multiple et externe simple

SalNet: salnet_t

montantBrut:

chargesSoc:

Employe: employe_t

matricule *: int

nom: varchar

lesSal

Sal :sal_t

annee: int

refSalNet:

M3

Page 67

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 133

Vision tabulaire de M3 et lien mono externe

Ajout d’un attribut (annee) à la table typée employe_t en sus des références REF:

matricule :int nom :varchar(50) lesSal: lesSal_t

1234 Savoie

1456 Lachance

annee refSal200020012003

1. L'attribut lesSal a un type collection défini par les attributs annee et le lien refSal

2. L'attribut refSal est une référence (type Ref) vers un objet de la table SalNet;

SalNet : salNet_t

montantBrut chargesSoc

45K$ 4K$46K$ 5K$

Employe : employe_t

2 objets-colonnes

dans le 1er set

Modèle Objet © Module 3 page 134

Création de la BDO du modèle M3

Solution :Create type salNet_t as object (montantBrut number (8,2) , chargeSoc Number (8,2) ) /

Create or Replace type Sal_t as object (annee int , refSal REF salNet_t) /

Create type lesSal_t AS TABLE OF sal_t/Create type employe_t as object ( matricule int , nom varchar(40), lesSal lesSal_t)

/Create table SalNet of salNet_t;Create table Employe of employe_t NESTED TABLE lesSal STORE AS Table_lesSal ;

Page 68

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 135

Traitement des objets-colonnes avec un curseur

noA : intlesEnfants

nasE intnomE: varcharageE : int

Assurance:

Enfant:

Les objets de la classe interne sont imbriqués dans la classe externe. Les premier peuvent-être traités par une application en utilisant un curseur.

Create type enfant_t as object (nasE int, nomEvarchar(40), ageE int)/Create type lesEnfants_t as table of enfant_t/Create type assurance_t as object (noA int, lesEnfants lesEnfants_t )/

Create table Assurance of assurance_t nestedtable lesEnfants store as Table_LesEnfants;

Modèle Objet © Module 3 page 136

Affichage des objets colonnes avec SQLPlus

Avec SQLPlus:Select a.lesEnfantsFrom Assurance a Where a.noA = 10;

Il y a affichage de l’ensemble des objets :

LESENFANTS(NASE, NOME, AGEE)

LESENFANTS_T(ENFANT_T(10, 'Paul', 20), ENFANT_T(15, 'Louise', 30))

Comment obtenir la valeur de noA et le nom des enfants assurés?

Insert into Assurance values (assurance_t (10, lesEnfants_t (enfant_t(10, ‘Paul’, 20), enfant_t(15, ‘Louise’, 30))));

Page 69

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 137

Application avec curseur et unnesting de l’ensemble

Set serveroutput onDeclareCursor enfantsAss is

Select a.noA, b.nomEFrom Assurance a, Table(a.lesenfants) b -- unnesting et pseudo jointureWhere a. noA = 10;

v_noA int;v_nomE varchar(40);Beginopen enfantsAss;LOOPExit when enfantsAss%NOTFOUND;Fetch enfantsAss into v_noA, v_nomE;DBMS_OUTPUT.PUT_LINE (v_noA || ‘ ‘|| ‘ ‘ || v_nomE);End LOOP;Close enfantsAss;End;/

10 Paul10 LouisePL/SQL procedure successfully completed.

Modèle Objet © Module 3 page 138

Notation pointée avec un attribut et une méthode)

Pour accéder à la valeur d'un attribut (ou à une méthode via un objet) d'un type, utilisezla notation pointée.

Ex.: Create Type atelier_t (noA int adrA varchar2(5), refD REF description_t) /

nomObjet.nomAttribut

Ex.: Atelier.noA

nomObjet.nomAttributRef.nomAttribut

Ex.: Atelier.refD.texte -- navigation vers l'autre classe

varObjet.nomMethode – appel de la méthode d’un objet

Ex.: x.modifAtelier() où x est une variable objet de Atelier

Atelier: noA*

adrA

refD

noD : int

texte : varchar

photo: lob

refA

Description :

modifAtelier()

Page 70

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 139

La recherche du no d‘atelier spécialisé en informatique ne nécessite pas de jointure explicite grâce à la REF. Il y a navigation entre les tables. Dans le relationnel, la formulation de la jointure doit être explicite.

Select A.noA (R) -- calcul de jointure

From Atelier A, Description D

Where A.noA = D.noA And D.texte = 'IFT';

Jointure implicite navigationnelle versus calcul de jointure relationnelle

Select a.noA (OR) -- jointure navigationnelleFrom Atelier A

Where A.refD.texte = 'IFT';

En relationnel il faut l'ajout de l'attribut nomB (dans Etudiant) partageant un domaine commun (ex: clé étrangère) avec les tables R correspondantes afin de formuler explicitement une jointure:

Modèle Objet © Module 3 page 140

Table-objet et les contraintes(Pas d’héritage pour (entre) les tables)

Page 71

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 141

TABLE-OBJET avec une contrainte référentielle et une REF SCOPÉE

Personne :nas*: int

nom:varchar(50)

refBac

Chercheur :theme: varchar(50)

Bac: bac_tnoB* : char(3)

univ: varchar(50)

annee: Date

nbCr : int

ajoutMail(…)

Create Table Personne of personne_t(Constraint pk_Personne Primary Key (nas), Constraint c1_bac Check (refBac is not null),Constraint c2_bac refBac REFERENCES Bac ) ;

table-objet

SCOPÉE

Create type bac_t as Object (noB char(3), univ varchar(50), annee Date, nbCr int) /

Create type personne_t as Object ( nas int, nom varchar(50), refBac REF bac_t) /

(c,e)

Modèle Objet © Module 3 page 142

SCOPE IS

Un index UNIQUE peut être défini avec un attribut de type Ref à la condition que cet attribut soit Scopé.

Create Table Personne of personne_t

(Constraint pk_Personne Primary Key (nas),

Constraint c_bac Check(refBac is not null),

Constraint c1_bac refBac SCOPE IS Bac ) ;

Comment obliger que l’attribut refBac réfère bien à un objet de type Bac?

En effet rien n’interdit que refBac pointe sur un objet d’une autre classe.

La contrainte SCOPE IS règle ce problème forçant une référence à avoir un oid appartement à une classe donnée.

Une table cible

Page 72

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 143

Insertion dans une table-objet scopée : contrainte sur le nouvel objet

Insertion d'une référence contrainte dans un objet Personne:

Insert into Personne values (personne_t(10, 'Gingas', (Select Ref(b) From Bac b where b.noB = 'IFT')));

- Par le SCOPE : la ref de l’objet inséré doit être non null et obligatoirement du type bac_t

Personne: nas*: int

nom:varchar(50)

refBac

Chercheur:theme: varchar(50)

Bac :noB* : char(3)

univ: varchar2(50)

annee: Date

nbCr : int

ajoutMail(…)

Table typéeTable typée

Modèle Objet © Module 3 page 144

Table temporaire avec/sans préservation des objets ( à une session)

GLOBAL TEMPORARY : pour la création d'une table temporaire avec des donnéesvisibles que par une session durant laquelle des objets sont ajoutés dans la table.

Le schéma et la structure de la table persistent comme les tables ordinaires.

La persistance des données dépend des paramètres suivants appliqués aux tables temporaires:

- ON COMMIT DELETE ROWS (Objects): les objets de la table temporaire sontgardés pour la durée de chaque transaction et supprimés à la validation i.e. à la fin de la transaction;

- ON COMMIT PRESERVE ROWS (Objects) : les objets sont préservés pour la durée de la session et pour toutes les transactions. Ils sont supprimés à la fin de la session.

Page 73

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 145

Syntaxe pour la création d'une table-objet dite temporaire

Création d'une table-objet :(les hauts et bas de case sont confondus par Oracle)

Ex: Create Global Temporary Table Personne of personne_t( Constraint c_age (Check age > 18 and …) ) On COMMIT Delete RowsObject Identifier is System GeneratedOidindex nom_idx TableSpace TS_Client ;

Create [GLOBAL TEMPORARY] TABLE [schema.] nomTable OF [schéma.] (Contraintes de table ) [ON COMMIT {DELETE | PRESERVE} ROWS]

[OBJECT IDENTIFIER IS ({SYSTEM GENERATED | PRIMARY KEY}][OIDINDEX [index] ({descriptionPhysiqueIndex | TABLESPACE

nomEspaceDonnees}]);

Modèle Objet © Module 3 page 146

Différences entre une contrainte de table et une contrainte d'attribut dans une table-objet

Contrainte d'attribut (in-line constraint) Contrainte définie avec un attribut de la table-objet. Elle permet SEULEMENT la comparaison de l’attribut avec une ou plusieurs valeurs. Un attribut est testé par un prédicat au regard d'un domaine sémantique. Les contraintes d'attribut sont vérifiées avant celles de table (out-of-line) (et dans l'ordre des attributs du schéma)Formulée au niveau de chaque attribut (technologie relationnelle) :Certaines fonctions SQL peuvent être utilisées dans la condition du Check( ).Exemples: Check(salaire < 50000.00 and age > 25) -- permis

Check (Round(prixVente) < 2500.20 -- permisCheck (Round(prixVente) < Round(prixAchat)) -- interdit (2 attributs)

Pour les tables objets

Contrainte de table (out-of-line constraint) : peut être formulée pour comparer plusieurs attributs de la même table-objet.

Exemple: Check (prixVente < prixAchat) -- autorisé si formulée au niveau de la même table

Page 74

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 147

Évaluation des contraintesLogique à 3 valeurs avec le système de contraintes de table-objet

Evaluation d'une condition peut fournir une valeur parmi les 3 suivantes: True False (échec) F Null ou ? (ou ne peut dire si T)

Une contrainte échoue si l'expression évaluée fournit un False, sinon (True ou Null), il y a succès donc True.

Exemple: Constraint c_salaire Check ( salaire > 45000.00)

Pour tout tuple dont le salaire est null, le check est null, donc True car le salaire pourrait être > 45000.00 dans une mise à jour ultérieure (donc T)!

Insert into t1 values (emp_t (null, null)); -- insère un objet qui vérifie donc les contraintes ci-dessus, car le check est considéré un succès!

Modèle Objet © Module 3 page 148

Les index oid d'une table-objet

Quelques remarques:

OIDINDEX : si la table a des oid générés par le système, un index est crééautomatiquement.

OBJECT IDENTIFIER : méthode de génération des oid System avec 16 octets (32 Hex) et avec Primary Key (< 16 o. car est fonction de la longueur de la clé.)

-- Attention à la clé primaire déclarée longueur variable avec le type varchar() : ellene génère pas nécessairement un oid plus petit en raison de la longueur variable de la chaîne!

Page 75

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 149

Indexation d'une table-objet avec les oid

Définition du nom de l’index créé automatiquement avec les oid générés par lesystème:

Create GLOBAL TEMPORARY Table Personne of personne_t(Constraint pk_Personne Primary Key ( nas)) ON COMMIT Preserve rowsObject Identifier is system generatedOIDINDEX PersonneIoiddx (Storage (Initial 100K Next 50K Minextents 1

Maxextents 20 PCT increase 10));

Personne:nas*: int

nom: varchar(50)

refBac :

Bac : bac_tnoB* : char(3)

univ: varchar(50)

annee: Date (Parent)(enfant)

NB Une table-objet qui réfère (enfant) à une autre table-objet (parent)

Modèle Objet © Module 3 page 150

Génération de l’oid d'une table-objet en utilisant la clé primaire

Create Table GLOBAL TEMPORARY Personne of personne_t(Constraint pk_Personne Primary Key (nas)) On commit preserve rowsObject Identifier is PRIMARY KEYOIDINDEX PersonneIoiddx (Storage (Initial 100K Next 50K Minextents 1 Maxextents

20 PCTincrease 10));

** Avec une BD centralisée, il est conseillé de privilégier la génération de l'oid à partir de la clé primaire (car cet oid est moins encombrant lorsque la clé est numérique).

Personne :nas*: int

nom:varchar2(50)

refBac

Bac: bac_tnoB* : char(3)

univ: varchar3(50)

annee: Date (parent)(enfant)

Page 76

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 151

Comment retrouver le mode de génération de l'oid?

Dans la table (vue) USER_OBJECT_TABLES du dictionnaire, plus précisément l'attribut OBJECT_ID_TYPE

Select table_name, object_id_typeFrom Object_ID_TABLES;

TABLE_NAME OBJECT_ID_TYPEPersonne USER_DEFINEDAtelier SYSTEM DEFINED

Oid généré par dérivation avec la clé primaire de Personne

** Par défaut, la génération de l'oid est effectuée par le système

Modèle Objet © Module 3 page 152

Implémentation de la contrainte référentielle avec les objets

Page 77

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 153

Contrainte référentielle en objet

La cohérence d'une BD relationnelle est renforcée par l'intégritéréférentielle.

En objet, une telle cohérence est définie par REFERENCES

Deux cohérences à assurer:

Insertion dans la table enfant: un objet de la table enfant ne peut pas référer a un objet parent absent. (cohérence enfant)

Suppression dans la table parent: un objet parent ne peut pas êtresupprimé si une REF de la table enfant y est faite; (cohérence parent)

Modèle Objet © Module 3 page 154

Cohérence et intégrité référentielles des tables Atelier et Ouvrier

Cohérence de suppression (parent) dans Atelier

Cohérence d’insertion (enfant): ajout dans Ouvrier

Atelier:nomA*:

adrA:

matO*: int

nomO:

villeO:

Ouvrier:

1..*1..1<Travaille

Atelier:nomA*:

adrA:

matO*: int

nomO:

villeO:

refA

Ouvrier:

(enfant)(parent)

DC-UML

Mnav

(table enfant)

(table parent)

Mnav

Page 78

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 155

Absence de la contrainte référentielle dans une table-objet

Create type atelier_t as Object (nomA varchar2(50), adrA varchar2(50))/]

Create type ouvrier_t as Object (matO char(6), nomO varchar2(50), villeO varchar2(50), refAREF atelier_t)

/Create Table Atelier of atelier_t

(constraint pk_Atelier Primary Key (nomA));Create Table Ouvrier of ouvrier_t

(Constraint pk_Ouvrier Primary Key (matO), Constraint c1_refAtelier check( refA is not null));

Cohérence enfant:Insert into Atelier values ( 'Atelier-Québec', null); (objet parent)Insert into Ouvrier values ( ‘123456’, ‘Dupont’, ‘Québec’, (select ref(a) from Atelier a

where nomA = ‘Atelier-Québec’)); (objet enfant)

** Ces insertions doivent être effectuées dans une même transaction, terminée par un Commit.

Atelier <-- Ouvrier

Modèle Objet © Module 3 page 156

Suite … intégrité référentielle avec les oid et table-objet

Cohérence du parent:Delete from Atelier Where nomA = 'Atelier-Québec'; -- cet objet existant est supprimé!

select count(*) from Ouvrier where refA is dangling

Donc aucun blocage de la suppression de l’objet parent assuré : incohérence de suppression non renforcée

Il peut y avoir un ouvrier qui référence un atelier disparu (parent). Donc unatelier est supprimé même s'il y a des ouvriers qui y travaillent !

C’est la même incohérence que celle affichée avec le modèle relationnel.

Cohérence de l’enfant: insertion d’un ouvrier non associé à un atelier?Le not null de l’attribut refA bloque cet ajout.

Count(*)1

Atelier <-- Ouvrier

Page 79

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 157

Suite … Renforcément de la contrainte référentielle objet avec REFERENCES

Avec la technologie objet, cette incohérence du parent est corrigée avec la clause REFERENCES dans l’objet-enfant:

Create Table Ouvrier of ouvrier_t (Constraint pk_Ouvrier Primary Key (mat), Constraint c_Atelier Check ( refA IS NOT NULL),Constraint c1_ref_Atelier refA REFERENCES Atelier) ;

La suppression de l'atelier est alors bloquée par la contrainte ref_Atelier assurant la cohérence de Ouvrier.

*** NB la suppression n’est cependant pas bloquée avec le une contrainte scopée sur refA :…refA is scope Atelier

Atelier<-- ouvrier

Modèle Objet © Module 3 page 158

Suite … intégrité référentielle utilisant l’oid et la table-objet

Insertion d'un fils (cohérence de l'enfant Ouvrier)

Insert into Ouvrier values (ouvrier_t( '123', 'Ferland', 'Québec', (Select Ref(a) From

Atelier a Where a.nomA = 'Atelier-Qc')));

*** Erreur *** l'atelier (parent) recherché n'existe pas.

Le Select ne trouvant pas un objet retourne un null, alors l'insertion estinterdite par la contrainte c1_refAtelier dans l’objet Ouvrier (cohérence d’insertion)

Atelier <-- Ouvrier

Page 80

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 159

Suite …. Cohérence référentielle du parent

Cohérence du parent (Atelier référé par un ouvrier)

Delete From Atelier Where nomA = 'Mécano' ;** ERREUR à la ligne 1ORA-02292 > Referential Constraint Violation …

En supprimant cet atelier la contrainte d’objet ci-dessous est enfreinte:Constraint c_refA refA References Atelier

*** Erreur violation de la contrainte c_refA

A tout moment l'attribut refA doit se référer à un oid valide de la table Atelier, soit un oid d'objet présent dans la base.

Atelier <-- Ouvrier

Modèle Objet © Module 3 page 160

Actions référentielles en objet

Les actions qui découlent de la suppression d’un objet parent sont lesmêmes que celles de la technologie relationnelle:

ON DELETE CASCADE et ON DELETE SET NULL.

(parent) Create Table Atelier of atelier_t (constraint pk_Atelier Primary Key (nomA));

(enfant) Create Table Ouvrier of ouvrier_t(Constraint pk_Ouvrier Primary Key (matO), Constraint c1_refAtelier check( refA is not null),Constraint c2_refAtelier refA REFERENCES Atelier ON DELETE CASCADE);

Toute suppression d'un atelier supprime aussi les ouvriers qui y travaillent.

Atelier <-- Ouvrier

Page 81

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 161

Eviter les contraintes contradictoires: Action ON DELETE SET NULL

(enfant): Create Table Ouvrier of ouvrier_t(Constraint pk_Ouvrier Primary Key (mat), Constraint c1_refAtelier check( refA is not null),Constraint c2_refAtelier refA REFERENCES Atelier

ON DELETE SET NULL);

Atelier: 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 estcontradictoire avec la sémantique de l’action SET NULL.

Atelier <-- Ouvrier

(Contrainte contradictoire)

Modèle Objet © Module 3 page 162

Méthode incluse dans le type

Ajout et suppression d'une seule signature dans le type qui en a déjà une:

Alter type employe_t ADD Member Procedure augmentationSal (aug IN number);

Alter type employe_t DROP Member Procedure augmentationSal (aug IN number);** Le type dans la signature n’inclut pas la longueur du type : Number et non Number(8,2), varchar2 et non varchar2(50), …

NB : L'évolution d'un type avec le ALTER change le type dans la base mais pas celui placédans la cache du SGBD. Pour voir le changement, il faut vider la cache en se déconnectant et en créant une nouvelle connexion (nouvelle session)!!

Page 82

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 163

Signature d'une méthode définie dans un type Fonction et procédure (Pl/SQL et JAVA) constituent les méthodes du type.

Create type produit_t as Object(noP int, nom varchar2(25), prix number(5,2), joursValides int, rabais int,

Member Function lireDateLimiteProduit Return Date, (signature)Member Procedure rabaisProduit (noPr IN int, prixReg IN number,

rabais Out number, nom OUT varchar2))/

La signature de la fonction / procédure est incluse dans la déclaration du type d'un objet (ajoutée éventuellement avec Alter type).

Le code de chaque méthode (bloc PL/SQL, C++, C, JAVA) i.e. le body est créé par un énoncé DDL Create Body produit_t …

Une méthode Member est appelée explicitement par un objet du type ( soit unevariable objet:v_article.rabaisProduit(25, prixReg, rabais, nomP);

Sans longueur

Modèle Objet © Module 3 page 164

Oracle JPublisher :mapping des objets Oracle en des classes Java

JPublisher génère une classe Java pour chaque type de la base-objet

For each object type, whether an ORAData or a SQLData implementation, JPublisher generates a

<type>.sqlj file for the class code (or a <type>.java file if wrapper methods were suppressed or do not

exist, or depending on the JPublisher -methods option setting) and a <type>Ref.java file for the code for the

REF class of the Java type. For example, if you define an EMPLOYEE SQL object type, JPublisher

generates an employee.sqlj file (or an employee.java file) and an employeeRef.java file. Note that the

case of Java class names produced by JPublisher is determined by the -case option. Méthods are also

included.

Create the object type EMPLOYE:E_t

CREATE TYPE employee_t AS OBJECT ( name VARCHAR2(30), empno INTEGER, deptno NUMBER, hiredate DATE, salary REAL );

Jpub -user=angam/tigre -dir=demo numbertypes=objectjdbc -builtintypes=jdbc-package=corp -case=mixed-sql= employee_t

Page 83

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 165

Références

1- Christian SOUTOU, Programmer Objet avec Oracle: concepts et pratiques, Vuibert, 2004, 394 p. ISBN 2-7117-4822-7

2- Paul BROWN, Object-Relational Database Development: A Plumber's Guide, Prentice-Hall , 2001, ISBN 0-13-019460-3

3- Kevin Loney, Oracle Database 11g. The Complete Reference ISBN 978-0- 07-159875-0, 2009

** Le WEB publie des articles et documents sur les BD objets notamment sur les BD objets de Oracle.

Modèle Objet © Module 3 page 166

SURVOLType non structuré : LOB

Les objets de grande taille non structurés (4 Go et +) :1- LOB interne (internal LOB avec un locator conduisant au LOB interne) , stocké

dans la base, plus précisément dans un tablespace.

BLOB : objets de grande taille binaire : ex. sons, images, vidéo, …CLOB: Objets de grande taille de type caractères : ex. textesNCLOB: Objets de grande taille avec caractères nationaux UNICODE) : Ex. textes en caractères asiatiques ou en cyrillique

2- Externe: LOB externe stockés à l’extérieur comme un fichier mais dont le nom et le chemin sont stockés dans la base.

BFILE: type pour stocker une référence vers des fichiers externes sur le serveur et non sur le poste client.

Page 84

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 167

Exemple de création d’un objet avec une photo et un LOB externe

Dans la table-objet , un LOB interne est représenté par un locator (une sorte de pointeur logique) :

1- locator de LOB interne : à la création doit être initialisé par les fonctions EMPTY_CLOB() et EMPTY_BLOB() du package DBMS_LOB;

2- locator de BFILE : inititialisé par la fonction BFILENAME(‘nom_répertoire_sur_serveur’, ‘nom_fichier’); *

* Le répertoire et le fichier sont créés sur le serveur et le développeur obtient les droits de lire et écrire. Le lob est à l’extérieur de la BD.

Modèle Objet © Module 3 page 168

Exemple

Ex. création d'une table avec le type CBLOBCreate type carteID_t as Object (noC int , photo CLOB)/Create table CarteID of carteID_t;

L’insertion d’un objet ayant un attribut de type CBLOB mais sans valeur doit se faire avec une initialisation au moyen de la fonction EMPTY_CLOB():

Insertion dans CarteID:Insert into carteID values (carteID_t( 1, Empty_CLOB()));

Update CarteID set photo = 'Photo_en_format_JPEG' where noC = 1/Insert CarteID values (2, ‘photo_ en format_Tiff‘)/

Page 85

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 169

Insertion de LOBs

Insertion d’un LOB externe:

Insert into CarteIDD values ( 10, ‘Photo_en_format_GIF’, BFILENAME(null, null));

La fonction BFILENAME() a 2 paramètres : le nom du répertoire sur le serveur et le nom du fichier sur le même serveur.

Modèle Objet © Module 3 page 170

Recherche et traitement d’un LOB avec un applicatif PL/SQL

Avec un locator pour un LOB externe:Create type carteIDD_t as Object (noC int , photo CLOB, dossier BFILE)/Insert into CarteIDD values (10, 'VVVVVVVVVVVVVV', NULL);

Applicatif PL/SQLDeclare photo CLOB;noC integer ;BeginSelect photo into photo From CarteIDD where noC = 10;DBMS_OUTPUT.PUT_LINE(‘ ***Taille de la photo est : ' || DBMS_LOB.GETLENGTH(photo)); /* traitements de la photo */ END;

*** Taille de la photo est : 19Procédure PL/SQL terminée avec succès.

Page 86

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 171

Exemple de création d’un objet avec un LOB

1- BLOB : données binaires stockées dans la BDCreate type photoB_t as Object ( photo BLOB) /Create type personne_t as Object ( mat int, nom varchar2(30), age int,

photo photoB_t) /

Create table Personne of personne_t;** le chargement d’un LOB se fera avec une procédure PL/SQL provenant d’un package

spécialisé.

2- CLOB : Données en caractères stockées dans la BD.Create type photoC_t as Object ( photo CLOB) /

3- BFILE : Fichier de données binaires en lecture seulement stockées en dehors de la BD, dans le système de fichiers de l’OS

Create photoBF_t_as Obect (photo BFILE ( ‘répertoire’ ,‘fichier‘)) /

N.B. le chargement des LOBs est fait notamment pas le package DBMS_LOB() de Oracle

Modèle Objet © Module 3 page 172

Locator

Une donnée de type LOB peut être stockée physiquement dans la table ou en dehors de la table en utilisant un locator qui réfère à un tableSpace de la BD ou à un fichier externe.

Pour les BLOB, CLOB et NCLOB, le locator pointe sur un espace dans la BD où la donnée Lob est stockée (tableSpace).

Insert into Personne values (personne_t(314, ‘Viorel’, 28, BFILENAME (‘nom_complet_répertoire’, ‘nom du fichier’))

);

Avec le type BFILE, le locator est une référence à un fichier externe à la base-objet. Ce fichier est cependant géré par le OS du serveur.

Page 87

André Gamache professeur associé, Département d'informatique et de génie logiciel

Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4

Module 3

Modèle Objet © Module 3 page 173

Exercices

Modèle Objet © Module 3 page 174

Fin