You are on page 1of 20

Plan Pl

Les aspects objet-relationnels dOracle d Oracle (de la V8 la 11g)


Gnralits Dfinition des objets j

Types abstrait de donnes, Hritage Rfrences Collections

Christian Soutou
http://www.soutou.net/christian

Manipulation des objets Interrogation des objets Mthodes Vues objet

C. Soutou

2007

C. Soutou

2007

M dl de Modle d donnes d

Extension lobjet du modle relationnel : yp abstraits de donnes (TAD) ( ) types


Gnralits

Collections Identit des objets par lutilisation l utilisation de rfrences Hritage E Encapsulation l ti par la l programmation ti de d mthodes th d (procdures ou fonctions)

C. Soutou

2007

C. Soutou

2007

O l Oracle

Types de d donnes d
T Type de d d donnes

Oracle8 (Juin 1997)


Premires fonctions objet (limites), Partitionnement, Java (JDBC, JSQL, Servlets, Java Server Pages, Entreprise Java Beans) Oracle8i 8.2 8 2 (8.1.5) (8 1 5) Juillet 1999 Oracle8i 8.3 (8.1.7) Aot 2000 Amliorations Java, iFS, XML, scurit Hritage C ll ti Collections multi-niveaux lti i
Scalaires

Personnaliss (TYPE)

Intgrs

Oracle9i , 9.1 (Novembre ( 2000), ), 9.2 (2002) ( )


Collections VARRAY TABLE

Rfrences REF

Oracle10g , (2004), Grid Computing (ressources en clusters)


Oracle11g , (2007) Compatibilit ascendante avec des bases SQL2 (versions 7)

CHAR(n) - NCHAR(n) VARCHAR2(n) - NVARCHAR2(n) NUMBER(n,p) - DECIMAL DATE BFILE - BLOB - CLOB NCLOB LONG - LONG RAW - RAW(n) - ROWID

C. Soutou

2007

C. Soutou

2007

Catgories dobjet

Catgories dobjet

objets persistants qui sont stocks dans des tables objets (row objects) objets bj t qui i composent t une colonne l dune d table t bl relationnelle (column objects) objets non persistants qui nappartiennent pas aux deux p prcdentes classification et nexistent que durant lexcution dun p g programme

Un type Oracle peut tre utilis :


pour la construction dautres types (type composite) pour dfinir une ou plusieurs tables objet (object tables) pour dfinir une colonne d dune une table relationnelle (column objects) pour la construction de vues objets (object views)
2007 8

C. Soutou

2007

C. Soutou

Cration dun type (TAD)


Syntaxe

Dfinition des objets

CREATE [OR REPLACE] TYPE schma.nomType [AS OBJECT | UNDER schma.nomSurType] ( colonne1 type1, colonne2 type2... , Structure Comportement mthode1(parametres1), mthode2()... ) [[NOT] INSTANTIABLE] [[NOT] FINAL] / Relatif lhritage

Li it ti Limitations

30 caractres p pour les noms de colonnes Pas de LONG, LONGRAW, ROWID, %TYPE
2007 10

C. Soutou

2007

C. Soutou

Type composite
CREATE TYPE etat_civil_type AS OBJECT (nom VARCHAR(30), datenais DATE) / CREATE TYPE adresse_type d AS OBJECT (nrue NUMBER(3), rue VARCHAR(40), ville VARCHAR(30)) / CREATE TYPE Pil Pilote_type t t AS OBJECT (brevet CHAR(6), etat_civil_t etat_civil_type, adresse_t adresse_type, paye NUMBER(6,2)) /

Table objet
Syntaxe
CREATE TABLE [schma.]nomTableObjet OF [schma.] nomType [(colonne [DEFAULT expression] [ contrainteEnLigne g [contrainteEnLigne g ] ]... | contrainteREFEnLigne ] | { contrainteHorsLigne | contrainteREFHorsLigne } [,colonne...] )] [OBJECT IDENTIFIER IS { SYSTEM GENERATED | PRIMARY KEY }] }];

Exemple
CREATE TABLE Pil Pilote t OF Pilote_type Pil t t (CONSTRAINT pk_Pilote PRIMARY KEY(brevet), CONSTRAINT df_paye paye DEFAULT 3000, CONSTRAINT nn_paye _ CHECK (paye IS NOT NULL), CONSTRAINT ck_paye CHECK (paye BETWEEN 2000 AND 5000), CONSTRAINT nn_nom CHECK (etat_civil_t.nom IS NOT NULL), CONSTRAINT un_nom UNIQUE (etat_civil_t.nom));

C. Soutou

2007

11

C. Soutou

2007

12

Hritage
CREATE TYPE Employe_type AS OBJECT (codemp CHAR(6), etat_civil etat_civil_type, adresse adresse_type, paye NUMBER(6,2)) INSTANTIABLE NOT FINAL / CREATE TYPE Pilote_type UNDER Employe_type (nbHvol NUMBER, compagnie VARCHAR(6)) NOT INSTANTIABLE NOT FINAL / CREATE TYPE Pil_instructeur_type UNDER Pilote_type (nbHvolIns NUMBER, expireQualif DATE) INSTANTIABLE FINAL /

Les rfrences

C. Soutou

2007

13

C. Soutou

2007

14

Syntaxe

Caractristiques

D Dans un t type

CREATE TYPE type2 {AS OBJECT | UNDER nomSurType2} (, colonne REF type1, ) /

Dans une table


(, colonne REF type1, );

CREATE TABLE nomTableRelationnelle

pointeur dun objet (persistant ou non) vers un objet persistant (row object) Jointures implicites dans le SELECT et le WHERE Rcursivit des types possible via REF Intgrit rfrentielle (FOREIGN KEY, NOT NULL, REFERENCES C S)

C. Soutou

2007

15

C. Soutou

2007

16

Exemple
CREATE TYPE Siege Siege_social_type social type AS OBJECT (nrue NUMBER(3), rue VARCHAR(20), ville VARCHAR(15)) / CREATE TYPE Compagnie_type C i t AS OBJECT (comp VARCHAR(4), siege_social_t siege_social_type, nomComp VARCHAR(15)) / CREATE TYPE Avion_type AS OBJECT (immat VARCHAR(6), typeAvion VARCHAR(10), capacite NUMBER(3),ref_Compagnie REF Compagnie_type) /

Exemple
CREATE TYPE Siege Siege_social_type social type AS OBJECT (nrue NUMBER(3), rue VARCHAR(20), ville VARCHAR(15)) / CREATE TYPE Compagnie_type AS OBJECT (comp VARCHAR(4), siege_social_ i i t siege_social_type, i i nomComp VARCHAR(15)) / CREATE TYPE Avion_type AS OBJECT (immat VARCHAR(6), ( ( ), typeAvion yp VARCHAR(10), ( ), capacite NUMBER(3),ref_Compagnie REF Compagnie_type) / CREATE TABLE Compagnie OF Compagnie_type (CONSTRAINT pk_Compagnie k C i PRIMARY KEY( KEY(comp)); )) CREATE TABLE (CONSTRAINT CONSTRAINT CONSTRAINT Avion OF Avion_type pk_Avion PRIMARY KEY(immat), nn_ref_Compagnie CHECK (ref_Compagnie IS NOT NULL), refer_Avion ref_Compagnie REFERENCES Compagnie);

C. Soutou

2007

17

C. Soutou

2007

18

(tudis dans les parties Manipulation-Interrogation)

Oprateurs pour les rfrences

REF(alias) renvoie un OID DEREF(reference) extrait t it le l contenu t du d type t ladresse passe en paramtre VALUE(alias) sapplique tout type de donnes et extrait les valeurs du type yp renvoy y DANGLING (renvoie TRUE si la rfrence est p perdue)

Collections C ll ti NESTED TABLE et VARRAY

C. Soutou

2007

19

C. Soutou

2007

20

Les collections

Cration dune nested table


pilotes_elt_nt_type
brevet nom age

Principe

Collection = { lments de mme type } NESTED TABLE : non ordonne et non limite (pas denses) VARRAY : ordonne et limite mais extensible (V comme Variable)

Collections Oracle

pilotes_nt_type
{pilotes_nt} brevet nom age

compagnie_type

Imbrications possibles (multi-niveaux)


comp

nomComp

{pilotes_nt} brevet nom age

NESTED VARRAY VARRAY NESTED

TABLE d de VARRAY de NESTED TABLE de VARRAY TABLE de NESTED TABLE

Compagnie
comp nomComp {pilotes nt} {pilotes_ brevet nom age

pilotes_tabnt

C. Soutou

2007

21

C. Soutou

2007

22

Syntaxe

Contraintes

Syntaxe
CREATE TYPE nomcollection_nt_type ll ti t t IS TABLE OF nomelement_elt_nt_type [NOT NULL] / CREATE TABLE nomdetable [ OF nomType | (col1 type1, collection_nt collection_nt_type ) ] NESTED TABLE collection_nt STORE AS collection_tabnt;

Au niveau des colonnes de la collection


Exemple

Pas possible de dfinir CHECK, NOT NULL et UNIQUE sur une colonne dune collection nested table lors de la cration de la table (CREATE TABLE) ) Solution : ALTER TABLE, applique la table de stockage (directives ADD, DROP, DISABLE, ENABLE) Lge L ge d dun un pilote doit tre compris entre 18 et 60 ans

Exemples

Il ny a pas dhomonyme

C. Soutou

2007

23

C. Soutou

2007

24

Contraintes

Restrictions

Au niveau de la collection elle-mme (sur ( lobjet colonne dans sa globalit)


Pas p possible de dfinir un dclencheur (trigger gg ) sur la table de stockage dune collection nested table Pas possible de dfinir une cl trangre sur une colonne d dune une collection nested table La table L t bl d de stockage t k nest t pas accessible ibl directement par SELECT, INSERT, UPDATE ou DELETE (elle permet simplement de grer des contraintes ou des index)
2007 26

La contrainte NOT NULL assure q que toute collection sera toujours non nulle (ne pas confondre avec une collection vide qui ne stocke aucun lment) Solution : ALTER TABLE, applique la table principale (directives ADD, DROP, DISABLE, ENABLE)

ALTER TABLE Compagnie ADD CONSTRAINT nn_pilotes_nt CHECK (pilotes_nt IS NOT NULL);

C. Soutou

2007

25

C. Soutou

Caractristiques des varrays


Composition
pilotes_elt_vry_type
brevet nom age

Un varray (tableau pr-dimensionn) est une collection ordonne et limite Les lments d dun un varray sont enregistres au sein de la table (in line) o ils sont stocks dans une colonne BLOB Chaque lment dun varray ne peut tre accder que par son indice Lespace de stockage nest pas prcis pour collection varray Une collection varray de taille n, pourra tre initialise taille m (m<n). Il sera possible par la suite dtendre la collection (sans toutefois excder la taille n). )
2007 27

pilotes vry_type pilotes_ vry type(3)


{pilotes_vry} brevet nom age

Compagnie_type
comp nomComp {pilotes_vry} brevet nom age

Compagnie
comp nomComp {pilotes_vry} brevet nom age

max 3

C. Soutou

C. Soutou

2007

28

Syntaxe

Collection simple

Syntaxe
CREATE TYPE nomcollection_vry_type IS VARRAY(n) OF elt_vry_type [NOT NULL] /

Syntaxe
CREATE TYPE collection_simple_type IS TABLE OF type_oracle /

Restrictions

Exemple

type_oracle ne doit pas tre

BOOLEAN LONG, LONG RAW NATURAL REF CURSOR STRING

Exemples
CREATE TYPE listeINSEE_nt_type IS TABLE OF VARCHAR(13) / CREATE TYPE calendrier_vry_type IS VARRAY(365) OF DATE /

C. Soutou

2007

29

C. Soutou

2007

30

Recommandations
Syntaxe
xxx_type ref_xxx xxx_t

Nature
type abstrait colonne rfrence colonne structure

Exemple
avion_type ref_comp papiers_avion_t derniers_vols_elt_nt_type derniers_vols_nt_type derniers vols nt derniers_vols_ derniers_vols_tabnt equipage_elt_vry_type equipage_ i vry_type t equipage_vry

Manipulation des objets

xxx_elt_nt_type type des lments xxx_nt_type type de la nested xxx_nt collection nested xxx_tabnt table de stockage xxx_elt_vry_type type des lments xxx_vry_type t type du varray xxx_vry collection varray

C. Soutou

2007

31

C. Soutou

2007

32

Instanciation i i

Modification difi i / Suppression S i


Objet non persistant


DECLARE nonPersistant Pilote_type; BEGIN nonPersistant := NEW Pilote_type('PL-11', etat_civil_type yp ( ('Peyrard','05-02-1970'), y , ), adresse_type(1,'G. Brassens','Blagnac'),3500);

Objet non persistant


DECLARE nonPersistant Pilote_type; BEGIN nonPersistant.adresse_t.ville := 'Castanet';

Objet persistant (row object)


UPDATE Pilote p SET p.etat_civil_t.ville = 'Castanet' WHERE ; DELETE FROM Pilote p WHERE p.brevet=;

Objet persistant (row object, object column object)


INSERT INTO Pilote VALUES (Pilote_type Pilote type( ('PL-11' PL 11 , etat_civil_type('Peyrard','05-02-1970'), adresse_type(1,'G. Brassens','Blagnac'),3500));

C. Soutou

2007

33

C. Soutou

2007

34

Instanciation i i dune d rfrence f


Instanciation i i dune d collection ll i


Oprateur REF(alias) pour relier un objet un objet persistant


INSERT INTO Compagnie VALUES ( ('AF',Siege AF ,Siege_social_type(124, social type(124,'Port Port Royal','Paris'), Royal , Paris ), 'Air France'); INSERT S INTO O Avion i VALUES S ('C ('C-LARA', ' ' 'A320', 320' 235 235, (SELECT REF(c) FROM Compagnie c WHERE c.comp='AF'));

Utilisation de constructeurs (lments et collection)

INSERT INTO departement VALUES (departement_type('D1',253000,employes_nt_type())); INSERT INTO departement VALUES (departement_type('D2',2000,NULL)); INSERT INTO departement VALUES (departement_type('D3',3000, employes nt type( employes_nt_type( employe_elt_nt_type(I1,34,Pascal), employe_elt_nt_type(I2,38,Agns), employe e p oye_e elt t_nt t_type type( (I3,18,Paul) 3 , 8, au )) ));

C. Soutou

2007

35

C. Soutou

2007

36

Ajout dun lment


Modification dun lment


Nested table : directive TABLE (une seule


collection doit tre concerne)

Nested table : directive TABLE (une seule


collection doit tre concerne) + alias

INSERT INTO TABLE (SELECT employes_nt FROM departement WHERE numdep = 'D1') VALUES (employe_elt_nt_type('I4',42,'Ren'));

UPDATE TABLE (SELECT

varray : programmation PL/SQL


varray : programmation PL/SQL

C. Soutou

2007

37

C. Soutou

2007

38

Suppression dun lment


Nested table : directive TABLE (une seule


collection doit tre concerne) + alias

DELETE FROM TABLE (SELECT

Interrogation des objets

varray : programmation PL/SQL avec TRIM +

programmation pour faire remonter les lments restants. restants

C. Soutou

2007

39

C. Soutou

2007

40

Extraction i dun d objet bj persistant i


Extraction i via i une rfrence f


Objet persistant : comme en relationnel + notation pointe


Table Compagnie
comp AF
t siege social _t siege_social

Type Compagnie_type
Avion
nomComp ville Paris Air France
immat C-LARA R-OMAN F-WTSS F-PAUL F PAUL

Rfrence : Alias ncessaire pour les jointures implicites


typeAvion A320 A319 Concorde A380 capacite 235 180 90 560 ref_Compagnie

nrue rue 124 Port Royal

SING

Camparols

Singapour

Singapore AL

Compagnie
comp AF SING siege_social _t nrue rue 124 Port Royal 7 Camparols ville Paris Singapour nomComp Air France Singapore AL

C. Soutou

2007

41

C. Soutou

2007

42

O Oprateurs pour lextraction l i


Extraction dlments de collections


Extraire dune seule collection : TABLE(SELECT) Extraire de plusieurs collections sous forme tabulaire : TABLE(at.coll) ant Extraire de p plusieurs collections (rsultat ( sous une forme imbriqu ) : CURSOR

DEREF(reference) extrait le contenu du type ladresse passe en paramtre Ex : Type de la compagnie propritaire de lavion F-WTSS


VALUE(alias) sapplique tout type de donnes et extrait les valeurs du type renvoy Ex : Objet compagnie de nom Air France

DANGLING (renvoie TRUE si la rfrence est p perdue) Ex : Immatriculation des avions qui ne sont rattachs aucune compagnie

C. Soutou

2007

43

C. Soutou

2007

44

Interrogation i dune d seule l collection ll i


Interrogation de plusieurs collections


Utilisation de : TABLE(SELECT)
{pilotes} brevet PL-1 PL 1 PL-2 PL-3 PL-6 PL-7 PL-8 PL-9 nom Lamothe Albaric Peyrard Miranda Payrissat Bidal Prissel age 36 37 33 55 60 38 36

Compagnie
comp nomComp

Rsultats sous la forme tabulaire : TABLE(at.coll) ( ) ant Pseudo-jointure automatique


{ il t } {pilotes} brevet PL-1 PL-2 PL-3 PL-6 PL-7 PL-8 PL 8 PL-9 nom Lamothe Albaric Peyrard Miranda Payrissat Bid l Bidal Prissel age 36 37 33 55 60 38 36

Compagnie
comp nomComp C

ALIT ABLA

Air-Littoral Air-Blagnac

ALIT ABLA

Air-Littoral Air-Blagnac

ACAS

CastaLines

ACAS

C t Li CastaLines

C. Soutou

2007

45

C. Soutou

2007

46

Interrogation de plusieurs collections


Fonctions pour les collections


Rsultats sous une forme imbriqu : CURSOR

Fonctions

SELECT aliast.col1, CURSOR (SELECT aliascollection.col2, [CURSOR] FROM TABLE(nomCollection) aliascollection WHERE aliascollection.col3 = valeur ) FROM nomTable aliast WHERE aliast.col4 = valeur ;

EXISTS (IF collection.EXISTS(i) collection EXISTS(i) THEN ) ) COUNT (FOR i IN 1..collection.COUNT LOOP ) pour les varray COUNT = LAST LIMIT (n := collection.LIMIT) collection LIMIT) (NULL pour nested, nombre max dlments quun varray peut contenir) FIRST et LAST (i := collection.FIRST) retournent les 1er et dernier indices de la collection. Pour les varray FIRST=1 et LAST=COUNT. Pour les nested, FIRST<=LAST PRIOR(x) et NEXT(x) retournent lindice avant/aprs le xe lment de la collection EXTEND / ( (i) ) /(i,j) ( ,j) p pour ajouter j un/des lments une collection TRIM pour diminuer la taille de la collection DELETE / (i) /(i,j) pour supprimer un/des lments une collection DELETE(i) ( ) p pas p possible p pour varray y
2007 48

Procdures

C. Soutou

2007

47

C. Soutou

C ll i Collections varray

Exemples de fonctions
INSERT INTO departement VARRAY(5)
VALUES (departement_type('D1',employes_vry_type( employe_elt_vry_type('I1','Pascal'), employe_elt_vry_type('I2','Agns'), employe_elt_vry_type('I3','Paul') _ _ _ ))); DECLARE var_emp employes_vry_type; BEGIN SELECT employes_vry INTO var_emp FROM departement WHERE numdep='D1'; DBMS_OUTPUT.PUT_LINE('count : '||TO_CHAR(var_emp.COUNT)); var_emp.EXTEND(1); var emp(4) := elt_employes_vry_type var_emp(4) elt employes vry type( (I4 I4 ,Fabrice); Fabrice ); DBMS_OUTPUT.PUT_LINE('first/last : '||TO_CHAR(var_emp.FIRST)||' / '||TO_CHAR(var_emp.LAST)); END; / count : 3 first/last : 1 / 4 Procdure PL/SQL / termine i avec succs.

Directive TABLE inoprante : programmation PL/SQL pour la modification dlments

DECLARE variable_coll collection_type; BEGIN SELECT collection INTO variable_coll FROM WHERE ; variable_coll(i).FONCTION(PARAMETRES); UPDATE SET collection ll ti = variable_coll i bl ll WHERE ; END; /
C. Soutou 2007 49

C. Soutou

2007

50

Mthodes

Les mthodes

Fonction ou p procdure ( (PL/SQL, Q Java, C) ) Surcharge possible Trois types


MEMBER (sapplique aux objets dun table) STATIC (s (sapplique applique au type seul) CONSTRUCTOR (cration dinstances dobjets non persistants)

Appel

PL/SQL (bloc, procdure, fonction, mthode) Requte SELECT (pour les mthodes de type fonction) Programme C, Java Implicite la cration dun objet
2007 52

C. Soutou

2007

51

C. Soutou

E Exemple l dune d procdure d MEMBER

Exemple dune fonction MEMBER

Augmenter le budget dun dpartement augmenteBudg(n)


CREATE TYPE departement_type departement type AS OBJECT (numdep varchar2(11), budget number, employes emps_type, ) / CREATE TABLE Departement OF departement_type (CONSTRAINT pk_dept PRIMARY KEY(numdep)) NESTED TABLE employes STORE AS tabemp; CREATE TYPE BODY departement_type

Compter le nombre demploys dun dpartement nbEmp()


CREATE TYPE departement_type AS OBJECT (numdep varchar2(11), budget number, employes emps_type, ) / CREATE TABLE Departement OF departement_type (CONSTRAINT pk_dept PRIMARY KEY(numdep)) NESTED TABLE employes STORE AS tabemp; CREATE TYPE BODY departement p _type yp

C. Soutou

2007

53

C. Soutou

2007

54

Invoquer une mthode MEMBER


E Exemples l de d mthodes th d STATIC


Principe : charger l lobjet objet appelant de la table dans un objet temporaire par la fonction VALUE puis invoquer la mthode sur cet objet Appel dune procdure: obj.methode(paramtres); Appels dune fonction

plusRicheDept() dpartement le mieux dot

ajouteDep() cration dun dpartement

SELECT a. a methode(paramtres) FROM table a resultat = obj.methode(paramtres);

C. Soutou

2007

55

C. Soutou

2007

56

Appel dune mthode STATIC


Mth d CONSTRUCTOR Mthode


ALTER TYPE stagiaire_type REPLACE AS OBJECT (numero NUMBER, nom VARCHAR(40), datenaiss DATE, MEMBER PROCEDURE change_nom(n IN VARCHAR), STATIC PROCEDURE insere_st(p1 IN VARCHAR, p2 IN DATE), CONSTRUCTOR FUNCTION stagiaire_type(p IN VARCHAR) RETURN SELF CONSTRUCTOR FUNCTION stagiaire_type(p IN DATE) RETURN SELF AS / CREATE OR REPLACE TYPE BODY stagiaire_type AS CONSTRUCTOR FUNCTION stagiaire_type(p IN VARCHAR) RETURN SELF BEGIN SELF.numero := 1; SELF.nom := p; SELF.datenaiss := SYSDATE; RETURN; RETURN END; CONSTRUCTOR FUNCTION stagiaire_type(p IN DATE) RETURN SELF AS BEGIN SELF numero := 10; SELF.numero SELF.nom := 'Jean'; SELF.datenaiss := p; RETURN; END; END; /

Syntaxe

nom_type.methode(paramtres);

AS RESULT, RESULT)

AS RESULT IS

RESULT IS

C. Soutou

2007

57

C. Soutou

2007

58

Appel d dune une mthode CONSTRUCTOR


Surcharge (overloading)

Exemple
DECLARE g _type; yp ; s1 stagiaire s2 stagiaire_type; s3 stagiaire_type; BEGIN s1 := NEW stagiaire_type(0,'Christian','05-02-1965'); s2 := NEW stagiaire_type('Paul'); s3 := NEW stagiaire_type(TO_DATE('13-05-1995')); END; /

Principe

Codage diffrent de mthodes MEMBER Choix du code automatique l lexcution excution

Exemple

CREATE TYPE poste_travail_type AS OBJECT (nserie VARCHAR(10), adrIP CHAR(5), dateachat DATE, MEMBER PROCEDURE modif_poste(nouveau_nserie IN VARCHAR), MEMBER PROCEDURE modif_poste(nouvelle_adr IN CHAR), MEMBER PROCEDURE modif_poste(achat IN DATE), MEMBER PROCEDURE modif_poste(num IN varchar2,achat IN DATE) ) /

C. Soutou

2007

59

C. Soutou

2007

60

volution de type

volution de type

Principes

Syntaxe de ALTER TYPE


ALTER TYPE xxx_type {COMPILE SPECIFICATION | BODY} {DROP colonne} {ADD | MODIFY} ATTRIBUTE colonne type {ADD | DROP} | methode(parametres) ;

Ajout/suppression/modification dattributs Ajout/suppression de mthodes Modification de la nature du type FINAL, INSTANTIABLE Rpercussion sur les objets des tables CASCADE, INVALIDATE

Exemples p
ALTER TYPE pil_type MODIFY ATTRIBUTE nom VARCHAR(35); ALTER TYPE pil_type DROP ATTRIBUTE prime_hvol_supp; ALTER TYPE pil_type ADD MEMBER PROCEDURE ajouter_vol(n IN NUMBER); ALTER TYPE pil_type il DROP MEMBER PROCEDURE affiche_pil; ALTER TYPE pil_type COMPILE SPECIFICATION;

C. Soutou

2007

61

C. Soutou

2007

62

S h Surcharge : OVERRIDING

S h Surcharge : OVERRIDING
CREATE OR REPLACE TYPE BODY pil_Europe_type AS FINAL MEMBER PROCEDURE ajouter_vol(n j l( IN NUMBER) ) IS BEGIN nbhvol := nbhvol +n; END ajouter_vol; j l NOT FINAL MEMBER PROCEDURE affiche_pil IS BEGIN DBMS_OUTPUT.PUT_LINE(brevet (b || nom || TO_NUMBER(nbhvol+prime_hvol_supp)); ( bh l i h l )) END affiche_pil; END; / CREATE OR REPLACE TYPE BODY pil_Franais_type AS OVERRIDING NOT FINAL MEMBER PROCEDURE affiche_pil IS BEGIN G DBMS_OUTPUT.PUT_LINE(nom || 'Affili ' || syndicat || TO_NUMBER(nbhvol*(1+(prime_hvol_supp/100)) ) ); END affiche_p pil; ; END;

Principe p

Redfinition dune mthode dans un sous-type


(brevet VARCHAR(10), nom VARCHAR(30), nbhvol NUMBER) NOT INSTANTIABLE NOT FINAL

CREATE TYPE pil_type AS OBJECT

/ CREATE TYPE pil_Europe_type UNDER pil_type (prime_hvol_supp NUMBER(6,2), FINAL MEMBER PROCEDURE ajouter_vol(n IN NUMBER), NOT FINAL MEMBER PROCEDURE affiche_pil) NOT FINAL / CREATE TYPE pil_Franais_type UNDER pil_Europe_type (syndicat VARCHAR(20), OVERRIDING NOT FINAL MEMBER PROCEDURE affiche_pil) /

C. Soutou

2007

63

C. Soutou

2007

64

Gnralits

Migration g en douceur vers la lobjet j


Vues objet-relationnelles j

OID avec la clause WITH OBJECT OID Collections (NESTED TABLE, VARRAY avec CAST et MULTISET) Pointeurs (REF avec MAKE_REF)

C. Soutou

2007

65

C. Soutou

2007

66

Dfinition

Exemple 1 : vue monotable


SQL> SELECT * FROM pil_table; NUM NOM SALAIRE JOB

A partir p

dune ou plusieurs tables objet-relationnelles dune ou plusieurs tables relationnelles dune ou plusieurs vues objet-relationnelles Dfi i un type Dfinir t de d donnes d (CREATE C TYPE) crire la requte (AS SELECT) qui dcrit les objets de la vue Spcifier un identifiant (OID) bas sur un attribut de la vue pour pouvoir rfrencer chaque objet de la vue (REFs). Se servir de prfrence dune cl primaire Programmer des dclencheurs INSTEAD OF (optionnel)

---------- -------------------- ---------- -------------------1 San Filippo 2 Sigaudes 3 Soutou 4 Miranda 5 Dupond 45000 Pilote 40000 Copilote 35000 Copilote 25000 Pilote 15000 Stagiaire

Principe

CREATE TYPE copi_type AS OBJECT (empno NUMBER(5),nom VARCHAR2(20), paye NUMBER (9,2), fonction VARCHAR2 (20)) / CREATE VIEW copi_vueOR OF copi_type WITH OBJECT IDENTIFIER (empno) AS SELECT FROM WHERE p.* pil_table p salaire > 30000;

C. Soutou

2007

67

C. Soutou

2007

68

Exemple 1 : vue monotable


SQL> SELECT REF(c), c.* FROM copi_vueOR c; REF(C) --------------------------------------------------------------------------EMPNO NOM PAYE FONCTION COMP NOM

Exemple 2 : structure
SQL> SELECT * FROM compagnie_table; RUE VILLE ETAT

---- -------------------- -------------------- ---------- ----AF Air France Matignon Brassens Paris Blagnac FR FR

---------- -------------------- ---------- -------------------00004A038A0046B1C34F72707545188B1B9B559443F7CE00000014260100010001002900000

ALIB Air Lib

CREATE TYPE adresse_comp_type AS OBJECT pp 1 San Filippo 45000 Pilote (rue VARCHAR2(20),ville VARCHAR2(10),etat CHAR(5)) 00004A038A0046B1C34F72707545188B1B9B559443F7CE00000014260100010001002900000 2 Sigaudes 40000 Copilote / CREATE TYPE compagnie_type AS OBJECT (numcomp CHAR(4), nomcomp VARCHAR2(20), siegesocial_t adresse_comp_type) / SQL> INSERT INTO 2 copi_vueOR i OR CREATE VIEW compagnie_vueOR OF compagnie_type WITH OBJECT IDENTIFIER (numcomp) AS SELECT c.comp, c.nom, adresse_comp_type(c.rue,c.ville,c.etat) AS siege FROM compagnie_table c;

00004A038A0046B1C34F72707545188B1B9B559443F7CE00000014260100010001002900000 3 Soutou 35000 Copilote

VALUES (6,'BigChief', 55000,'ChefPil');

1 ligne cre.

C. Soutou

2007

69

C. Soutou

2007

70

Exemple 2 : structure
SQL> SELECT REF(c), c.* FROM compagnie_vueOR REF(C) -------------------------------------------------------------------------NUMC NOMCOMP ---- -------------------SIEGESOCIAL_T(RUE, VILLE, ETAT) --------------------------------------------------------------------------00003B038A003728FC2F14BAB6455A9335FECAAE77B95E00000017260100010001002900000 AF Air France ') ) c;

DirectiExemple 3 : construction dune collection

CAST convertit une collection dans un autre type de collection Typage du rsultat dune requte (collection qui nest pas nomme) ou d une une collection nomme (VARRAY ou NESTED TABLE) si le rsultat de la requte retourne plusieurs enregistrements, il est alors ncessaire de coupler CAST avec MULTISET

ADRESSE COMP TYPE('Matignon' ADRESSE_COMP_TYPE( Matignon , 'Paris' Paris , 'FR FR

00003B038A003728FC2F14BAB6455A9335FECAAE77B95E00000017260100010001002900000 ALIB Air Ai Lib ADRESSE_COMP_TYPE('Brassens', 'Blagnac', 'FR ')

C. Soutou

2007

71

C. Soutou

2007

72

DirectiExemple 3 : construction dune collection


SQL> SELECT * FROM compagnie; COMP ---AF TAT AL AOM NOM_COMP -----------------------------Air France Transport Air Touraine Air Libert Air Outre-Mer

DirectiExemple 3 : construction dune collection


CREATE TYPE elt_nt_avion_type AS OBJECT (na VARCHAR(4),type VARCHAR(4), cap NUMBER(3)) / CREATE TYPE avion_nt_type AS TABLE OF elt_nt_avion_type / CREATE TYPE compagnie_type AS OBJECT (compa VARCHAR(4), nom_comp VARCHAR(30), avion_nt avion_nt_type) / CREATE VIEW comp_vuerOR OF compagnie_type WITH OBJECT IDENTIFIER (compa) AS SELECT c.comp, c.nom_comp, CAST( MULTISET (SELECT a.na, a.type, a.cap FROM avion a WHERE a.comp = c.comp) AS avion_nt_type) avion nt type) AS flotte FROM compagnie c;

SQL> SELECT * FROM avion; NA ---A1 A2 A3 A4 A5 TYPE CAP COMP ---- ---------- ---T2 170 AF T4 140 TAT T1 400 AF T4 120 AF T3 200 TAT

C. Soutou

2007

73

C. Soutou

2007

74

DirectiExemple 3 : construction dune collection


SQL> SELECT * FROM comp_vuerOR; COMP NOM_COMP ---- -----------------------------AVION_NT(NA, TYPE, CAP) -------------------------------------------------------------------------------AF Air France AVION_NT_TYPE(ELT_NT_AVION_TYPE('A1', 'T2', 170), ELT_NT_AVION_TYPE('A3', 'T1', 400), ELT_NT_AVION_TYPE('A4', 'T4', 120)) TAT Transport Air Touraine AVION_NT_TYPE(ELT_NT_AVION_TYPE('A2', 'T4', 140), ELT_NT_AVION_TYPE('A5', 'T3', 200)) AL Air Libert AVION NT TYPE() AVION_NT_TYPE() AOM Air Outre-Mer AVION_NT_TYPE() SQL> SELECT nt.* nt * FROM TABLE (SELECT avion_nt avion nt FROM comp_vuerOR comp vuerOR WHERE compa= compa='AF') AF ) nt; NA ---A1 A3 A4 TYPE CAP ---- ---------T2 170 T1 400 T4 120

DirectiExemple 4 : construction de rfrences


SQL> SELECT * FROM compagnie; COMP ---AF TAT AL AOM NOM_COMP -----------------------------Air France Transport Air Touraine Air Libert Air Outre-Mer

SQL> SELECT * FROM avion; NA ---A1 A2 A3 A4 A5 TYPE CAP COMP ---- ---------- ---T2 170 AF T4 140 TAT T1 400 AF T4 120 AF T3 200 TAT

C. Soutou

2007

75

C. Soutou

2007

76

DirectiExemple 4 : construction de rfrences

DirectiExemple 4 : construction de rfrences

CREATE TYPE compagnie_type AS OBJECT (comp VARCHAR(4), nom_comp VARCHAR(30)) / CREATE TYPE avion_type avion type AS OBJECT (nav VARCHAR(4),type VARCHAR(4), cap NUMBER(3), ref_comp REF compagnie_type) / CREATE VIEW comp_vueOR OF compagnie_type WITH OBJECT IDENTIFIER(comp) AS SELECT * FROM compagnie; CREATE VIEW avion_vueOR OF avion_type WITH OBJECT IDENTIFIER(nav) AS SELECT a.na, a.type, a.cap, MAKE_REF(comp_vueOR, a.comp) FROM avion a;

SQL> SELECT a.nav, a.type, a.ref_comp.nom_comp FROM avion_vueOR a; NAV ---A1 A2 A3 A4 A5 TYPE ---T2 T4 T1 T4 T3 REF_COMP.NOM_COMP -----------------------------Air France Transport Air Touraine Air France Air i France Transport Air Touraine

--autre solution sans MAKE_REF CREATE VIEW avion_vueOR2 OF avion_type WITH OBJECT IDENTIFIER(nav) AS SELECT a.na, a na a.type, a type a.cap, a cap REF(c) FROM avion a, comp_vueOR c WHERE a.comp = c.comp;

C. Soutou

2007

77

C. Soutou

2007

78

You might also like