Vous êtes sur la page 1sur 19

Bases de donnes objet

Introduction
Rfrences bibliographiques Georges GARDARIN, Bases de donnes, Editions Eyrolles Jeffrey ULLMAN, http://www-db.stanford.edu/~ullman A quoi servent les bases de donnes ? Stockage des informations : sur un support informatique pendant une longue priode de taille importante accs multi-utilisateurs Il faut donc : grer de manire efcace les accs aux disques proposer une dnition structure des donnes viter les redondances Le Systme de Gestion des Bases de Donnes (SGBD) : simplie la gestion des donnes avec : - une reprsentation intuitive (modle relationnel en gnral) - un langage ddi (SQL) gre les aspects systme : - scurit - accs aux chiers de donnes - aspect multi-utilisateurs Plan du cours Bases de donnes objet Objectifs Principe Mise en uvre Aspects systmes des bases de donnes classiques Fichiers Indexation Transaction

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

Historique rapide des SGBD Premire gnration (annes 60) Sparation de la description des donnes et des programmes dapplication Traitement de chiers relis par des structures de graphe SGBD IDMS Deuxime gnration (annes 70) Simplication du SGBD externe Modle relationnel Langage non procdural SGBD ORACLE, INFORMIX, Troisime gnration (annes 80) SGBD objet - SGBD Relationnel objet : ORACLE 8 - SGBD orient objet : O2 Quatrime gnration (annes 90) Bases de donnes et internet Entrepts de donnes (data warehouse) Fouille de donnes (data mining) Pourquoi des SGBD objet ? Rappels sur le modle relationnel le schma dnit la structure de la relation les n-uplets reprsentent les diffrents lments Les tables respectent des proprits dnies sur les dpendances fonctionnelles ( en gnral, troisime forme normale (3NF) ) Avantages du modle relationnel et des SGBD relationnels Organisation structure des donnes Permanence des donnes Accessibilit par des utilisateurs concurrents Bien implant dans le monde professionnel. Faiblesses du modle relationnel Absence de pointeurs visibles : pour lier des donnes qui se correspondent, on a besoin de faire des jointures (oprations coteuses) Non support des domaines composs : on ne peut pas avoir pas exemple un attribut qui correspond une adresse avec le numro de la rue, le nom de la rue, la ville, Impossible cause de la premire forme normale, qui impose latomicit des attributs Pas doprations dnies sur les donnes On veut donc un SGBD capable de traiter des lments de structure complexe des oprations sur les lments des pointeurs reliant les lments (pour de lhritage par exemple) Ces notions correspondent la philosophie objet : il nous faut des SGBD objet.

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

Deux manires dutiliser lobjet dans les SGBD On part des langages objet dans lesquels on intgre les notions des SGBD (persistance des donnes, aspect multi-utilisateurs, ). Ce sont les SGBD orients objet : O2 (bas sur C++) On part des SGBD relationnels dans lesquels on insre des notions objet. Ce sont les SGBD relationnels objet : ORACLE 8 (SQL 3) On peut constater que les SGBDOO sont plus propres du point de vue objet et les mieux adapts pour traiter les objets mais ils sont compltement absents du monde professionnel les SGBDRO sont bass sur des SGBD robustes et prouvs rpandus dans le monde professionnel mais qui ne sont pas prvus pour grer lobjet Jusqu prsent, les amliorations qui ont t dveloppes pour les SGBD se sont fondus dans les SGBD existants. Dans le monde professionnel, les concepteurs et les utilisateurs de bases de donnes ne sont pas prts remettre en cause leurs savoirs et redvelopper toutes leurs applications sur de nouveaux systmes. On va privilgier les SGBDRO. Caractristiques du modle relationnel objet On veut un modle qui intgre des lments de structure complexe Une relation sera en NF2 (Non First Normal Form) et pourra contenir un attribut compos dune liste de valuers ou de plusieurs attributs. Exemple de table et de n-uplet (assurance dun vhicule) N contrat Nom Adresse Conducteurs
N contrat 375 789

Accidents
Personne Nicolas Lionel Date 2005 2002

1111

J. CHIRAC

Elyse 75000 PARIS

Nom Bernadette Claude

Age 70 75

Par rapport au modle relationnel standard : on a moins besoin daplatir les donnes, ici on a une seule table avec des tables imbriques au lieu de 3 tables on a moins besoin de faire des jointures pour rcuprer les informations sur les accidents du contrat 1111, on accde simplement lattribut accidents.

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

I. Bases de donnes objet


Les types utiliss dans les BDO sont les types standards existant dans les BD classiques : VARCHAR, NUMBER les types utilisateurs - dnis par le concepteur de la base - utiliss comme des types standards On appelle aussi ces types utilisateurs des types objet car ils ont une structure complexe et peuvent contenir des oprations (mthodes). Exemple de cration de type objet CREATE TYPE t_adresse AS OBJECT ( num NUMBER, rue VARCHAR(30), ville VARCHAR(20), codepostal CHAR(5) ); On peut ensuite utiliser ce type objet (ou type utilisateur) soit pour dnir une table relationnelle standard soit pour dnir une table relationnelle objet (ou table objet relationnelle) soit pour dnir dautres types objet qui contiennet cette structure. Exemple dobjet de type t_adresse t_adresse (2, Bd Lavoisier, ANGERS, 49000) <constructeur de type> ( <valeurs des diffrents champs du type t_adresse>) Utilisation du type dans un autre type CREATE TYPE t_personne AS OBJECT ( nom VARCHAR(30), prenom VARCHAR(30), adresse t_adresse ); Utilisation dun type utilisateur dans une table relationnelle standard Dans une table relationnelle, on lutilise comme un type prdni standard. Exemple CREATE TABLE employes ( num NUMBER, dept NUMBER, salaire NUMBER, adresse t_adresse, -- type objet nom VARCHAR(30), PRIMARY KEY num -- on peut dnir des contraintes habituelles sur la table );
M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet 4

Insertion dans une table relationnelle (on procde comme habituellement) INSERT INTO employes VALUES (1000, 15, 2000, t_adresse (2, Bd Lavoisier, ANGERS, 49000), toto) ; -- On utilise le constructeur dobjet t_adresse pour crire ladresse Interrogation dans une table relationnelle (on procde aussi comme habituellement) SELECT * FROM employes ; -- On obtient la table suivante :

num
1000

dept
15

salaire
2000

adresse (num, rue, ville, cp)


t_adresse (2, Bd Lavoisier, ANGERS, 49000)

nom
toto

SELECT e.adresse FROM employes e ; -- Prciser un alias de table

adresse (num, rue, ville, cp)


t_adresse (2, Bd Lavoisier, ANGERS, 49000) SELECT e.adresse.num FROM employes e ;

adresse.num
2
Utilisation dun type objet dans une table relationnelle Un table objet relationnelle est une table qui contient des lments de type objet. Chaque lment est identi par un numro appel OID (Object Identier). Exemple avec le type t_adresse CREATE TABLE adresses OF t_adressse ; On a une relation dont chaque lment est un objet de type t_adresse. On peut voir la relation de deux manires diffrentes : vision objet

t_adresse()
OID1 | num1 | rue1 | ville1 | cp1 OID2 | num2 | rue2 | ville2 | cp2
vision relationnelle

num OID1 OID2


num1 num2

rue
rue1 rue2

ville
ville1 ville2

cp
cp1 cp2
5

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

Remarque On peut crire des contraintes comme en relationnel standard lors de la cration de la table, on peut dnir des cls, etc. CREATE TABLE adresses OF t_adresse (ville DEFAULT ANGERS) ; Insertion dans une table objet relationnelle On a deux manires dinsrer des n-uplets : soit avec le constructeur de type (vision objet) INSERT INTO adresses VALUES ( t_adresse(30, Bd Foch, ANGERS, 49000) ) ; -- on insre un objet avec constructeur de type et valeurs des champs du type objet soit en prcisant chacun des champs (vision relationnelle) INSERT INTO adresses VALUES (30, Bd Foch, ANGERS, 49000) ; -- on prcise les valeurs des diffrents attributs de la table relationnelle Les deux requtes sont quivalentes : on insre un n-uplet un OID lui est attribu lors de linsertion Interrogation dans une table objet relationnelle On peut accder aux valeurs comme dans le cas du relationnel standard. SELECT * FROM adresses ; SELECT a.num, a.rue, a.ville, a.cp FROM adresses a ; -- a est un alias de table On peut accder aux objets. SELECT VALUE(a) FROM adresse a ; -- a est un alias de table et VALUE est un mot cl pour rcuprer les objets On peut accder aux OID SELECT REF(a) FROM adresse a ; -- a est un alias de table et REF est un mot cl pour rcuprer les OID Quobtient on comme relations avec ces requtes ? En accdant aux valeurs des attributs

num
2
En accdant aux objets

rue
Bd Lavoisier

ville
ANGERS

cp
49000

VALUE (a) (num, rue, ville, cp)


t_adresse(2, Bd Lavoisier, ANGERS, 49000)
M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet 6

En accdant aux OID On obtient une relation de rfrence o chaque rfrence correspond un code assez long fait de chiffres et de lettres. Remarque Dans le cas dune table relationnelle standard utilisant des types objets, on naura pas dOID pour les n-uplets donc pas de SELECT REF() ou de SELECT VALUE() Utilisation des rfrences pour reprsenter les informations dans les relations Exemple TABLE employes

num
1 6 9

dept
15 13 12

salaire
2000 1000 3000
2 2 10

adresse
Bd Lavoisier Bd Lavoisier Bd Foch ANGERS ANGERS ANGERS 49000 49000 49000

nom
toto titi tata

Plutt que cette reprsentation qui pose des problmes de redondance, de maintien de cohrence lors des mises jours, on prfrera la reprsentation suivante : TABLE employes ( avec des OID dobjets de la table adresses )

num dept
1 6 9 15 13 12

salaire
2000 1000 3000

adresse
ABC1234 XYZ9999 XYZ9999

nom
toto titi tata

TABLE adresses table objet relationnelle

num ABC1234 XYZ9999


2 10

rue
Bd Lavoisier Bd Foch

ville
ANGERS ANGERS

cp
49000 49000

Pas de changement pour linterrogation des relations. Par contre, en terme de reprsentation, un objet est conserv en un seul exemplaire dans une autre table et non pas lintrieur de chaque n-uplet qui lutilise. Exemple : dnition de types utilisant des rfrences (ou pointeurs) CREATE TYPE t_ville AS OBJECT ( nom VARCHAR(10), population NUMBER ) ;
M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet 7

CREATE TABLE pays ( nom VARCHAR(30), capitale REF t_ville, population NUMBER ) ; Ou en crant un autre type objet : CREATE TYPE t_pays AS OBJECT ( nom VARCHAR(30), capitale REF t_ville, population NUMBER ); CREATE TABLE pays OF t_pays ; CREATE TABLE villes OF t_ville ; Un objet tout seul na pas dOID, cest un objet dune table objet relationnelle qui possde un OID. Insertion de rfrences dans les tables objet relationnelles TABLE pays

nom AAA111 AAA222


TABLE villes

capitale (rfrence)
ABC123 XYZ999

population
60 000 000 57 000 000

FRANCE ITALIE

nom ABC123 XYZ999


Paris Rome

population
2 000 000 2 700 000

INSERT INTO villes VALUES ( Paris, 2000000) ; INSERT INTO villes VALUES ( Rome, 2700000) ; INSERT INTO pays (nom, population) VALUES (FRANCE, 60000000) ; Pour modier le n-uplet correspondant la France : UPDATE pays SET capitale = (SELECT REF(v) FROM villes v WHERE v.nom = Paris) WHERE nom = FRANCE ; Pour insrer le n-uplet correspondant lItalie : INSERT INTO pays SELECT ITALIE, REF(v), 57000000 FROM villes v WHERE v.nom = Rome ;

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

Interrogation de tables utilisant des rfrences Les donnes sont interroges comme si elles taient physiquement dans la table. Exemples SELECT * FROM pays ; -- le rsultat est la table pays ci-dessus SELECT p.nom, p.capitale.nom, p.population FROM pays p ;

nom
FRANCE ITALIE

capitale.nom
Paris Rome

population
60 000 000 57 000 000

Autre fonction sur les objets : DEREF qui renvoie un objet partir de sa rfrence. SELECT DEREF ( p.capitale ) FROM pays p ; -- le rsultat est t_ville(Paris, 2 000 000), t_ville(Rome, 2 700 000) SELECT DEREF ( REF(v) ) FROM villes v ; -- on obtient les objets de la table villes. Cest quivalent la requte suivante : SELECT VALUE ( v ) FROM villes v ; Dclaration de types incomplets On ne peut pas crer un type qui utilise un type qui na pas encore t cr. Que faire quand on a des rfrences croises (par exemple, un type ville qui pointe vers un type pays et un type pays qui pointe sur un type ville) ? On dclare un type incomplet puis on le mettra jour plus tard. Exemple CREATE TYPE t_ville ; -- cration du type incomplet

CREATE TYPE t_pays AS OBJECT ( , , ville REF t_ville, ); CREATE OR REPLACE t_ville AS OBJECT ( , , , pays REF t_pays, , ); -- modication du type incomplet

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

Simulation de lhritage dans les BDRO Comme les BD relationnelles ne sont pas initialement prvues pour grer les objets, il faut mimer les proprits comme lhritage. Exemple CREATE TYPE t_personne AS OBJECT ( nom VARCHAR(30), prenom VARCHAR(30), datenaiss DATE ); CREATE TYPE t_etudiant AS OBJECT ( num_ine VARCHAR(10), pers REF t_personne ) ; Pour simuler lhritage, on utilise des requtes utilisant, par exemple, e.pers.nom : e est un alias de table, pers un pointeur qui simule lhritage et nom le champ hrit de personne. Les collections imbriques Exemple

nom

prnom

liste des diplmes


Il existe deux types de collections imbriques : les tables imbriques ( NESTED TABLE ) dont ne xe pas la taille priori les tableaux xes ( VARRAY ) Les tables imbriques Une table imbrique est une collection illimite, non ordonne dlments de mme type. Attention, sous Oracle, il ne peut y avoir quun seul niveau dimbrication (cest--dire quil ne peut pas y avoir de table imbrique dans un lment dune table imbrique) Dclarations de types et de tables utilisant des tables imbriques -- type des lments de la table imbrique CREATE TYPE t_employe AS OBJECT ( num_insee VARCHAR(20), nom VARCHAR(30), age NUMBER ); -- type pour une table imbrique -- t_employes est le nom du type de la table imbrique -- t_employe est le type des lments de la table CREATE TYPE t_employes AS TABLE OF t_employe ;

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

10

-- table relationnelle standard -- tab_emp est le nom physique de la table imbrique (ne sert jamais dans les requtes) CREATE TABLE departements ( num_dep NUMBER, budget NUMBER, employes t_employes ) NESTED TABLE employes STORE AS tab_emp ;

num_dep
1 13

budget
100 000 50 000

employes

Cration des tables objet relationnelles utilisant des tables imbriques CREATE TYPE t_departement AS OBJECT ( num_dep NUMBER, budget NUMBER, employes t_employes ); -- table objet relationnelle -- STORE AS table_name prciser lors de la cration de la table CREATE TABLE departements OF t_departement NESTED TABLE employes STORE AS tab_emp ; Insertion dans une relation utilisant une table imbrique Pour insser un lment qui comporte une table imbrique, on peut, comme pour les autres objets, utiliser le constructeur de type. INSERT INTO departements VALUES (1, 200 000, t_employes(t_employe(12345, toto, 25), t_employe(2222, titi, 28))) ; -- t_employes est le constructeur de type de la table employ -- t_employe est le constructeur de type des lments de la table imbrique. -- (12345, toto, 25) et (2222, titi, 28) sont les valeurs des attributs de llment INSERT INTO departements VALUES (2, 100 000, t_employes()) ; -- insertion dune table imbrique vide INSERT INTO departements (numdep, budget) VALUES (4, 100 000) ;

num_dep OID OID OID


1 2 4

budget
200 000 100 000 100 000

employes
null

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

11

Insertion dans une table imbrique Il existe une commande particulire pour insrer dans une table imbrique : THE INSERT INTO THE ( SELECT employes FROM departements WHERE numdep = 1 ) VALUES ( t_employe (789, tutu, 20) ) ; -- ( SELECT ) est la table imbrique dans laquelle on insre llment -- employes est lattribut de la table imbrique -- numdep = 1 est la condition du n-uplet dont on veut modier la table -- t_employe (789, tutu, 20) est llment insser dans la table imbrique Rsultat

num_dep OID
1

budget
200 000

employes

Attention : on ne peux insrer que dans une seule table imbrique. Que se passe-t-il avec les requtes suivantes ? INSERT INTO THE ( SELECT employes FROM departements WHERE numdep = 2 ) VALUES ( t_employe(5432, lulu, 27) ) ; -- on insre llment INSERT INTO THE ( SELECT employes FROM departements WHERE numdep = 4 ) VALUES ( t_employe(987, nono, 50) ) ; -- a ne marche pas car la table imbrique nexite pas Comment faire pour que a marche ? Il faut crer la table imbrique au pralable. 1. On met jour le n-uplet pour rendre linsertion possible : UPDATE departements SET employes = t_employes() WHERE numdep = 4 ; puis on excute la requte dinsertion. 2. On met jour en insrant llment : UPDATE departements SET employes = t_employes(t_employe(987, nono, 50) WHERE numdep = 4 ; Interrogation des tables utilisant des tables imbriques Pour la table objet-relationnelle SELECT * FROM departements ; On obtient les valeurs des attributs comme habituellement avec les tables imbriques sous forme de constructeurs de type. Pour les tables imbriques, on utilise THE comme pour linsertion

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

12

SELECT e.nom FROM THE ( SELECT employes FROM departements WHERE numdep = 1 ) e ; -- on doit utiliser un alias de table (e) -- e.nom est un attribut du type t_employe -- ( SELECT ) est une table imbrique Remarque Ici aussi, il faut slectionner une seule table imbrique. Comment rcuprer les informations de plusieurs tables imbriques simultanment ? On utilise la commande CURSOR, par exemple : SELECT d.numdep, CURSOR ( SELECT e.nom FROM TABLE (employes) e ) FROM departements d ; On obtient la liste des dpartements avec, pour chaque dpartement, la liste des noms des employs. Gestion des tables imbriques On utilise THE pour les suppressions (DELETE) et mise--jour (UPDATE) de tables imbriques. Attention, on na quun seul niveau dimbrication possible. Comment faire si on veut de pays qui contient une liste de rgions, chaque rgion contenant une liste de villes ?

nom

population
Pays de la Loire

rgions
Ile de France
Paris

FRANCE

60 000 000

Nantes Angers

Versailles

Crteil

On va utiliser plusieurs tables relationnelles objet et les relier par des rfrences

nom
FRANCE

population
60 000 000

rgions
ABC123 XYZ987

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

13

nom ABC123 XYZ987


Pays de la Loire Ile de France


Paris

Villes
Nantes Angers
Crteil

Versailles

On utilise donc des imbriqus de rfrences des objets. Pour linterrogation des relations utilisant des tables imbriques de rfrences des objets, on utilise un attribut particulier appel COLUMN_VALUE. Dans le cas dune table imbrique dobjets, on travaille directement sur les attributs : SELECT n.nom Dans le cas dune table imbrique de rfrences des objets, il faut ajouter column_value : SELECT n.column_value.nom -- n est un alias de la table imbrique -- column_value pour dire quon travaille sur une table de rfrences des objets -- nom est le nom de lattribut quon veut rcuprer On a deux types de collections imbriques (NESTED TABLE) et les tables xes (VARRAY). Les tableaux xes (VARRAY) Cest une collection limite, ordonne dlments de mme type. Remarque : Un tableau xe permet : davoir plusieurs niveaux dimbrication (contrairement aux NESTED TABLE qui ncessitent luitilisation de rfrences) daccder aux lments par leur numro Mais on ne peut pas accder un lment particulier du VARRAY dans une requte SQL standard, il faut utiliser un bloc PL/SQL (langage procdural qui intgre les requtes SQL) contrairement aux NESTED TABLE qui se comportent comme des tables relationnelles standard. Dclaration dun VARRAY Comme cest une collection de taille limite, il faut dclarer demble la taille du tableau xe. Exemple CREATE TYPE tvadresses AS VARRAY(2) OF tadresse ; -- tadresse est le type des lments du VARRAY, type utilisateur dni prcdemment -- 2 est la taille du VARRAY -- tvadresses est le type BARRAY dni

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

14

On peut ensuite utiliser le type ainsi cr pour dnir des tables relationnelles ou objet-relationnelles. Exemple CREATE TABLE etudiants ( noine VARCHAR(10), nom VARCHAR(30), adresses tvadresses) ; -- ici, une table relationnelle Manipulation dun VARRRAY On peut manipuler un VARRAY de deux manires : dans une requte SQL, on manipule le VARRAY entier dans un bloc PL/SQL, on manipule des lments particuliers du VARRAY Insertion dans un VARRAY On utilise le constructeur de type avec autant dlments que lon veut (en respectant le nombre maximal dlments de VARRAY) Exemple INSERT INTO etudiants VALUES (12345, Jacques, tvadresses(tadresse(Elyse, Paris))) ; -- on a un VARRAY qui contient un seul lment INSERT INTO etudiants VALUES (9999, Dom, tvadresses(tadresse(Matignon, Paris, null))); -- on a un VARRAY qui contient les deux lments du VARRAY dont un nest pas renseign INSERT INTO etudiants VALUES (2340, Nico, null); -- aucun VARRAY nest cr Remarque Si on veut travailler sur le VARRAY de Nico, il faut bien sr en crer un. Si on veut travailler dans une requte SQL, il faut travailler sur lensemble du VARRAY. Exemple UPDATE etudiants SET adresses = tvadresses(tadresse(Elysee, Paris), tadresse(Bitz, Correze)) WHERE nom = Jacques ; Si on veut travailler sur un seul lment, il faut utiliser un bloc PL/SQL. Exemple : pour ajouter ajouter une nouvelle adresse ltudiant nomm Dom. -- dclaration des variables DECLARE lesadr tvadresses; -- instructions BEGIN -- initialisation de la variable lesadr SELECT adresses INTO lesadr FROM etudiants WHERE nom = Dom ; -- modication de la deuxime valeur lesadr(2) := tadresse(Htel Martinez, Cannes) ; -- mise jour de la relation UPDATE etudiants SET adresses = lesadr WHERE nom = Dom ; END ;

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

15

Autre exemple INSERT INTO etudiants VALUES (54321, Lionel, tvadresses()) ; DECLARE lesadr tvadresses ; BEGIN SELECT adresses INTO lesadr FROM etudiants WHERE nom = Lionel ; lesadr.extend; -- on ajoute un lment au VARRAY lesadr(1) := tadresse(Bon Repo, Ile de R) ; UPDATE etudiants SET adresses = lesadr WHERE nom = Lionel ; END ; -- ici a ne marche pas car le tableau xe est vide, tout lheure, a marchait pour Dom car on avait le deuxime lment (non renseign mais il existait). Ici, il faut donc crer la place du premier lment avant de le traiter. On aurait pu aussi mettre jour le VARRAY dans une requte SQL standard puis excuter le bloc PL/SQL Il existe plusieurs fonctions prdnies sur les tableaux xes (utilisables seulement dans des blocs PL/SQL) : limit : nombre minimum dun VARRAY last : indice du dernier lment extend : ajout dun lment au tableau extend(n) : ajout de n lment au tableau Exemple : Ajout dun lment sans savoir combien dlments comporte le tableau DECLARE lesadr tvadresses ; BEGIN SELECT adresses INTO lesadr FROM etudiants WHERE nom = Lionel ; lesadr.extend; lesadr(lesadr.last) := tadresse(Bon Repo, Ile de R) ; -- valeur du dernier lment UPDATE etudiants SET adresses = lesadr WHERE nom = Lionel ; END ;

Les mthodes
Une mthode (ou opration) est la modlisation dune action applicable sur un objet, caractrise par un en-tte appel signature dnissant son nom, ses paramtres dappel et de retour, et qui permet de modier ltat de lobjet ou de renvoyer un rsultat. En relationnel objet, les types peuvent admettre soit des fonctions soit des procdures. On dclare les mthodes : - soit au dbut lors de la dclaration de lobjet - soit plus tard avec commande ALTER TYPE Le corps de la mthode correspond aux oprations effectues sur lobjet, il peut faire rfrence lobjet concern grce SELF. Exemple : type objet contenant une fonction CREATE TYPE tpersonne AS OBJECT ( nom VARCHAR(10), datenaiss date, MEMBER FUNCTION age RETURN number -- le type contient une fonction de nom age sans paramtre qui retourne un nombre )
M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet 16

-- implmentation des mthodes CREATE TYPE BODY tpersonne AS MEMBER FUNCTION age RETURN number IS n number ; BEGIN n := TRUNC((SYSDATE - SELF.datenaiss)) ; RETURN n ; END age ; END ; On peut utiliser une fonction dans un bloc PL/SQL ou une requte SQL. Exemple : avec personne table objet-relationnelle de type tpersonne SELECT p.age() FROM personnes p ; Protection de la base de donnes Remarque Quand on cre une fonction, Oracle demande de prciser linuence de la fonction sur la base de donnes (en particulier, on doit prciser que lon ne modie rien dans la base) : il faut rajouter dans la dclaration de la fonction une instruction en ce sens PRAGMA RESTRICT_REFERENCES(<nom_fonction>, <restriction daccs>) Exemple CREATE TYPE t_personne AS OBJECT ( nom VARCHAR ( 10 ) , datenaiss DATE , MEMBER FUNCTION age RETURN NUMBER ; PRAGMA RESTRICT_REFERENCES ( age, WNDS )) -- WNDS signie quon ncrit pas dans la base ) Paramtres des mthodes De manire gnrale, dans les mthodes, les paramtres sont dclars de la manire suivante < nom_paramtre > [ IN | OUT | IN OUT ] <type_du_paramtres> Les paramtres sont spars par des virgules. Les fonctions ne comportent que des paramtres IN (cest--dire des donnes).

Les procdures
Elles sont dnies de la mme manire que les fonctions. On peut : soit les dnir lors de la cration du type soit les ajouter par la suite avec la commande ALTER TYPE Exemple Pour rajouter une procdure au type dni prcdemment

ALTER TYPE t_personne AS OBJECT ( nom VARCHAR ( 10 ) , datenaiss DATE , MEMBER FUNCTION age RETURN NUMBER ; PRAGMA RESTRICT_REFERENCES( age, WNDS ) ; MEMBER PROCEDURE modifnaiss ( newdate IN DATE ) )/
M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet 17

-- Puis on rcrit le corps de limplmentation CREATE OR REPLACE TYPE BODY t_personne AS MEMBER FUNCTION age RETURN NUMBER IS END age ; MEMBER PROCEDURE modifnaiss ( newdate IN DATE ) BEGIN SELF.datenaiss := newdate ; END modifnaiss ; END / Il faut redonner lensemble de limplmentation du corps des mthodes. Lappel dune procdure se fait dans un bloc PL / SQL (jamais dans un SELECT, contrairement aux fonctions). Exemple CREATE TABLE personne OF t_personne ; INSERT INTO personne VALUES ( Jacques, 14-JUL-1900 ) ; INSERT INTO -- Pour changer la date de naissance de Jacques : DECLARE toto t_personne ; BEGIN -- on initialise toto SELECT VALUE ( p ) INTO toto FROM personne p WHERE p.nom = Jacques ; -- la date de naissance de toto est modie toto.modifnaiss(29-NOV-1932) ; -- on met jour la base DELETE FROM personne WHERE nom = Jacques ; INSERT INTO personne VALUES ( toto ) ; END ; Si on veut que lappel la procdure modie la base, il faut procder diffremment : CREATE OR REPLACE TYPE BODY AS MEMBER MEMBER PROCEDURE modifnaiss ( newdate IN DATE ) IS BEGIN UPDATE personne SET datenaiss = newdate WHERE VALUE ( p ) = SELF ; END modifnaiss ; END ; DECLARE toto t_personne ; BEGIN SELECT VALUE ( p ) INTO toto FROM personne p WHERE p.nom = Jacques ; -- lappel la procdure modie directement la table de la base de donnes toto.modifnaiss(29-NOV-1932) ; END ;
M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet 18

Surcharge On peut dnir une mme mthode avec des paramtres diffrents Exemple CREATE TYPE t_etudiant AS OBJECT ( noine NUMBER , nom VARCHAT ( 30 ) , MEMBER PROCEDURE modif ( newnumero IN NUMBER ) ; MEMBER PROCEDURE modif ( newnom IN VARCHAR ) )/ CREATE TYPE BODY t_etudiant AS MEMBER PROCEDURE modif (newnumero IN NUMBER ) IS BEGIN SELF.noine := newnumero ; END modif ; MEMBER PROCEDURE modif (newnom IN VARCHAR ) IS BEGIN SELF.nom := newnom ; END modif ; END ; / On a une surcharge de la procdure modif, lors de lutilisation de la procdure, cest le type de la valeur passe comme paramtre qui dtermine quelles sont les instructions qui seront excutes.

M1 Info 2005 / 2006 Universit dAngers Bases de donnes objet

19

Vous aimerez peut-être aussi