BDOO Ch1 Type Table Objet

Embed Size (px)

Citation preview

Programmation objet avec OracleChapitre I: Type, tables et objetsAbderrafiaa ELKALAY FSTG Marrakech IRISI 3

Objectifs du chapitreA la fin de ce chapitre, vous pourrez : dcrire la finalit d une table objet Crer un type objet Crer une table objet Manipuler une table objet

Programmation objet avec Oracle

2

I.1 Introduction Ce chapitre prsente, dans un premier temps , les caractristiques du modle objet-relationnel (extension objet du modle relationnel) Dans un second temps nous verrons quelques nouvelles options de SQL et de PLSQL. Les autres chapitres sont consacrs aux nouvelles spcificits objet. Oracle utilise le terme object (tout en utilisant le terme objectrelationnal)

Programmation objet avec Oracle

3

I.1 Introduction Le concept table existe toujours dans le modle relationnel objet, mais il est tendu. En effet, la structure d une table objetrelationnelle sera dfinie l aide du type. Chaque enregistrement d une table objet-relationnelle peut tre assimil un objet.

L objet sera dot d un OID(object identifier) unique

Programmation objet avec Oracle

4

I.1 IntroductionCette extension objet met en uvre diffrentes mcanismes: Les collections : elles regroupent un ensemble d lments du mme type. Le terme collection est un terme gnrique qui englobe les listes, les vecteurs et les tableaux Les rfrences : C est un pointeur vers un objet ligne. L identit des objets est dfinit par l utilisation de rfrences (pointeurs) L hritage: chaque type peut permettre de dfinir plusieurs soustypes L encapsulation par le programmation de modles (procdures ou fonctions)

Programmation objet avec Oracle

5

I.2 Type objetCette section et les suivantes dcrivent les aspects objets relationnels d Oracle

I.2.1 Types de donnes Les types scalaires conviennent la majorit des applications traditionnelles bases sur les tables relationnels. Les types permettant de construire les objets se trouvent dans la catgorie des types personnaliss

Programmation objet avec Oracle

6

I.2 Type objetI.2.2 PersistanceTrois catgories existent sous oracle: Les objets colonnes(column objects) sont stocks en tant que colonne structurs dans une table relationnelle Les objets lignes (row objects) qui sont stocks en tant que lignes d une table objet. Ils possdent un identificateur unique appel OID (Object IDentifier) Et les objets non persistants qui ne sont ni stocks dans une colonne de table relationnelle, ni dans une ligne de table objet. Ils n existent que durant l excution d un programme PL/SQL (Bloc, procdure catalogue ou dclencheur)

Programmation objet avec Oracle

7

I.2 Type objetUn type d oracle peut tre utilis: Pour la construction d autres types Pour dfinir des tables objet (Object table) Pour dfinir une colonne d une table relationnelle Pour la construction de vues objet (object views)

Programmation objet avec Oracle

8

I.2 Type objetType de donne

Personnaliss (Type)

Intgrs

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

Collections VARRAY TABLE

Rfrences REF

Programmation objet avec Oracle

9

I.2 Type objetI.2.3 Cration d un typeLa commande CREATE TYPE comporte trois parties: La premire partie qui dclare la structure du type (chapitre 3 et 4) La deuxime qui dclare les mthodes (chapitre 5) La troisime qui positionne des types dans une hirarchie d hritage (chapitre 2 )

Programmation objet avec Oracle

10

I.2 Type objetCREATE[OR REPLACE] TYPE shema [AS OBJECT | UNDER shema.nomsurType]

(colonne1 type1, colonne2 type2, , Methode1(parametres 1), Methode2( ), Structure Comportement

)[[NOT] INSTANTIABLE] [[NOT] FINAL] Relatif lhritage

/

Programmation objet avec Oracle

11

I.2 Type objet OR REPLACE permet de recrer le type s il existe dj sans avoir les dtruire (il faut qu aucun type n y soit rattach) AS OBJECT permet de dfinir un type racine d une hirarchie d hritage (si aucune hirarchie d hritage n est dfinir, chaque type est une racine) UNDER dsigne le sur type

Programmation objet avec Oracle

12

I.2 Type objetL exemple suivant dcrit le type Pilote_type compos de 4 colonnes au premier niveau. Les colonnes etat_civil_t et adresse_t sont appeles types composants

Pilote_typeBrevet nom Etat_civil_t datnais Nrue Adresse_t Rue ville pays

Programmation objet avec Oracle

13

I.2 Type objet Le code de cration est le suivant:CREATE OR REPLACE TYPE etat_civil_type AS OBJECT(nom VARCHAR(30), datenais DATE); / CREATE OR REPLACE TYPE adresse_type AS OBJECT (nrue NUMBER(3), rue VARCHAR(40), ville VARCHAR(30)); / CREATE OR REPLACE TYPE Pilote_type AS OBJECT (brevet CHAR(6), etat_civil_t etat_civil_type, adresse_t adresse_type, pays NUMBER(6,2)); / Le caractre / termine une cration

Programmation objet avec Oracle

14

I.2 Type objet DESC Pilote_type donne les colonnes au premier niveau SQL > DESC Pilote_type NOM BREVET ETAT_CIVIL_T ADRESSE_T PAYE NULL? TYPE ETAT_CIVIL_TYPE ADRESSE_TYPE NUMBER(6,2)

Programmation objet avec Oracle

15

I.2 Type objetI.2.4 Restrictions Lors de la cration d un type il n est pas possible de dfinir des colonnes BOOLEAN,ROWID,LONG, LONG RAW ou utiliser %type Pour l instant il n est pas possible de dfinir dynamiquement des types dans PL/SQL. En revanche, il est possible de manipuler des variables types dans PL/SQL Il n est pas possible d utiliser un lien de base de donne (database link) pour interroger, insrer ou mettre jour une table distante dpendant ou contenant un type

Programmation objet avec Oracle

16

I.2 Type objetI.2.5 Dictionnaire des donnes Des nouvelles vues du dictionnaires des donnes ont t dfinies pour prendre en compte les types Nous prsentons ici certains vues qui s appliquent tout schma courant sont prfix par USER_ Les vues qui s appliquent tout le schma sont prfix par DBA_ Les vues qui s appliquent un schma courant en incluant les lments hrits par prrogatives sont prfix par ALL_

Programmation objet avec Oracle

17

I.2 Type objetNous citerons: USER_COLL_TYPE USER_INDEXTYPES USER_TYPES USER_TYPES_ATTRS USER_TYPES_METHODS USER_TYPES_VERSIONS dcrit les collections dcrit les index sur les types dcrit les types dcrit les attributs des types dcrit les mthodes des types dcrit les versions des types

Exemples excuter les instructions suivantes sous SQL+ SQL> desc USER_TYPES SQL> select * FROM USER_TYPES SQL> desc USER_TYPES_ATTRS SQL> select * FROM USER_TYPES_ATTRS

Programmation objet avec Oracle

18

I.2 Type objetI.2.6 Instanciation La directive NEW permet d instancier les objets non persistants. Cette mthode invoque un constructeur portant le mme nom (voir chapitre 5). Le code PL/SQL suivant instancie l objet nonPersistant. La directive d instanciation s appelle le constructeur du type par defaut. Notez aussi l utilisation des constructeurs par dfaut des types composants (ici etat_civil_type et adresse_type)DECLARE nonPersistant Pilote_type; BEGUIN nonPersistant := NEW Pilote_type( PL-11 , etat_civil_type( Diffis , 05-02-1970 ), adresse_type(1, G.Brassens , Blagnac ),3500);

Programmation objet avec Oracle

19

I.2 Type objet Nous allons excuter le code PLSQL suivant et le commenter Mais tout d abord faisons un DESC Pilote_type DECLARE p1 Pilote_type; BEGIN p1 := NEW Pilote_type('PL-11', etat_civil_type('Diffis','05-02-1970'), adresse_type(1,'G. Brassens','Blagnac'),3500) ; p1.brevet := 'PL-12'; p1.adresse_t.rue := 'Camparols'; DBMS_OUTPUT.PUT_LINE('Pilote1 : brevet et rue : '||p1.brevet||' '||p1.adresse_t.rue); END; /

Programmation objet avec Oracle

20

I.2 Type objetI.2.7 Suppression d un type La commande DROP dtruit un type: DROP TYPE nom_du_type [FORCE|VALITE] FORCE permet de forcer la suppression mme si des objets sont rattachs au type. Dans ce cas les objets du type deviennent inaccessible mais ne disparaissent pas. VALITE s applique seulement aux sous types (types qui hritent du type dtruire), dclenche une vrification pour chaque objet du type dtruit

Programmation objet avec Oracle

21

I.2 Type objetL ordre respecter pour la destruction du type pilote_type est : DROP TYPE Pilote_type; DROP TYPE adresse_type; DROP TYPE etat_civil_type;

Programmation objet avec Oracle

22

I.3 Table relationnelleAvant de se consacrer au monde des tables tudions le mcanisme permettant d utiliser des types au sein de table relationnelles

I.3.1 SyntaxeLa syntaxe simplifie pour la cration d une table relationnelle:CREATE [GLOBAL TEMPORARY] TABLE [schema] nomTableRelationnelle ( colonne typeDonnes [DAFAUL expression] [contrainteEnLigne ] | {contrainteHorsLigne } [,colonnes typeDonnes] ) [ON COMMIT{ DELETE |PRESERVE} ROWS];

Programmation objet avec Oracle

23

I.3 Table relationnelleLes options sont les suivantes: GLOBAL TEMPORARY Indique que la table est temporaire. Les donnes sont visibles seulement par les sessions qui insre des donnes dans cette table La structure de ces tables persistent de la mme manire que les tables permanentes. En revanche, la persistance des donnes peut tre programme soit par session soit par transaction l aide de l option ON COMMIT.

Programmation objet avec Oracle

24

I.3 Table relationnelle TypeDonnes Indique un type scalaire (CHAR,DATE ) contrainteEnLigne dsigne une contrainte en ligne traditionnellement dfinie en mme temps que la colonne (in line constraint)

[CONSTRAINT nomContrainte]{ [NOT] | NULL | UNIQUE | PRIMARY KEY | REFERENCES [schema.] {nomTable | nomVue} [(col1[, col2] )] [ON DELETTE {CASACADE | SET NULL}] | CHECK (condition) }

Programmation objet avec Oracle

25

I.3 Table relationnelle contrainteRefEnLigne dsigne une contrainte de rfrence (in line ref-constraint), tudie plus en dtail au chapitre 3

contrainteHorsLigne dsigne une contrainte hors ligne traditionnelle (out of line constraint), tudie plus en dtail au chapitre 3

contrainteRefHorsLigne dsigne une contrainte de reference hors ligne (out of line refconstraint), tudie plus en dtail au chapitre 3

Programmation objet avec Oracle

26

I.3 Table relationnelle ON COMMIT Est valable seulement pour les tables temporaires. Cette option si les donnes doivent persister pendant la dure de la transaction ou pendant la dure de la session DELETTE ROWS (option par dfaut): les donnes n existent que pendant la transaction et sont dtruites chaque validation par COMMIT PRESERVE ROWS : indique que les donnes persistent durant toute la session, indpendamment des transactions. A la fin de la session elles sont dtruites.

Programmation objet avec Oracle

27

I.3 Table relationnelleI.3.2 Objet colonne Les deux dernires colonnes de la table relationnelle suivante son dfinies l aide du type pilote_type DROP TABLE Vols; CREATE TABLE Vols (numero NUMBER, dateVol DATE,nombrePax NUMBER(3), depart VARCHAR(30), arrivee VARCHAR(30), CDB_t Pilote_type, COPI_t Pilote_type, CONSTRAINT pk_Vols PRIMARY KEY(numero)); Excuter la commande desc DESC vols;

Programmation objet avec Oracle

28

I.3 Type relationnelInstanciation L ajout d un vol la table vols ncessite l utilisation de deux constructeurs Pilote_type INSERT INTO Vols VALUES (1, SYSDATE, 120, 'Orly-Ouest', 'Blagnac', Pilote_type('PL-11',etat_civil_type('Diffis','05-02-1970'), adresse_type(1,'G. Brassens','Blagnac'),3500) , Pilote_type('CPL-10',etat_civil_type('Mercier','05-12-1947'), adresse_type(5,'Boeldieu','Toulouse'),5600) );

Programmation objet avec Oracle

29

I.3 Type relationnelExtraction Affichons les caractristiques du vol avec le nom du commandant de bord. La requte utilise un alias et la notation pointe pour accder des colonnes terminales des objets colonne. SELECT v.numero, v.datevol, v.nombrePax, v.depart, v.arrivee, v.cdb_t.etat_civil_t.nom FROM Vols v ;

Programmation objet avec Oracle

30

I.3 Type relationnelValeurs par dfaut La directive DEFAULT permet d initialiser les objets colonne CREATE TABLE Vols (numero NUMBER, dateVol DATE,nombrePax NUMBER(3), depart VARCHAR(30), arrivee VARCHAR(30), CDB_t Pilote_type DEFAULT Pilote_type ('PL-1', etat_civil_type('Sigaudes','10-06-1960'), adresse_type(12,'Lasbordes','Balma'), 3500), COPI_t Pilote_type DEFAULT Pilote_type ('PL-2', etat_civil_type('Soutou','05-02-1965'), adresse_type(7,'Camparols','Blagnac'), 3000), CONSTRAINT pk_Vols PRIMARY KEY(numero));

Programmation objet avec Oracle

31

I.3 Type relationnel Lors d insertion d enregistrement dans la table et s il n est pas fait mention de l quipage, les objets colonne CDB_t et COPI_t seront initialises aux valeurs par dfaut Exemple: l insertion suivante fait appel aux valeurs par default pour ces colonnes INSERT INTO Vols (numero, dateVol, nombrePax, depart, arrivee) VALUES (2, SYSDATE, 200, 'Nice', 'Biarritz'); Vrifier le par: SELECT v.numero, v.depart, v.arrivee, v.cdb_t.etat_civil_t.nom, v.copi_t.etat_civil_t.nom FROM Vols v;

Programmation objet avec Oracle

32

I.3 Type objet Quoi de plus naturel que de stocker des objets dans des tables. Pour rpondre ce besoin oracles tendu la notion de tables relationnelle la table objet. La directive OF dans l instruction CREATE TABLE permet de spcifier le type qui dcrira les objets stocks dans la table objet

Programmation objet avec Oracle

33

I.3 Type objet Une table qui dpend d un type (CREATE TABLE nomTableObjet OF nomType) est une table objet. Chaque enregistrement est un objet ligne (row object) . A ce titre chaque objet ligne est muni d un unique OID (Object IDentifier)

Programmation objet avec Oracle

34

I.3 Type objetI.4.1 Syntaxe La syntaxe simplifi est la suivante (nous verrons une dfinition plus compltes lors des prochains chapitres):

Programmation objet avec Oracle

35

I.3 Type objetCREATE [GLOBAL TEMPORARY] TABLE [schema.] nomTableObjet OF [schema.] nomType [( colonne [DAFAUL expression] [contrainteEnLigne ] | {contrainteHorsLigne } [,colonnes typeDonnes] ) [ON COMMIT{ DELETE |PRESERVE} ROWS]; [OBJECT IDENTIER IS {SYSTEM GENRATED} PRIMARY KEY] [OIDINDEX [index] ]

Programmation objet avec Oracle

36

I.3 Type objet Les options pour la Table relationnelle dj prsentes sont aussi applicables aux tables objet. Les spcificits objet sont les suivantes: OBJECT IDENTIER IS: indique la mthode de gnration des OID pour les enregistrements de la table (voir chapitre 9, stockage des objets). Cette spcificit contient deux options:

Programmation objet avec Oracle

37

I.3 Type objet SYSTEM GENRATED est l option par dfaut. Elle prcise que l OID est gnr automatiquement par le systme (sur 16 octets) PRIMARY KEY prcise que l OID est bas sur la valeur de la cl primaire. Sa taille dpend de la taille de cette cl primaire.

OIDINDEX : cette option est disponible si la table gnre automatiquement ses OID. Elle permet de dclarer un index sur la colonne OID

Programmation objet avec Oracle

38

I.4 Table objetI.4.2 Contrainte Dans notre exemple, nous allons dclarer la table objet Pilote de type pilote_type avec des contraintes puis nous stockerons et manipulerons les objets dans cette table. Un type ne peut pas contenir les contraintes (NOT NULL, CHECK, etc). Elles sont dclares au niveau de la table objet.

Programmation objet avec Oracle

39

I.4 Table objetTable objet Pilote de Pilote_typebrevet etat_civil Adresse_t paye

nom

datenais

nrue

rue

ville

OID1

PL-11

LACOMBE

05/02/1970

1

G.Brassens

Blagnac

3500

OID2

CPL-2

LAROCHE

15/12/1963

2

Foch

Montaub an

2600

OID3

CPL- 3

LABAT

25/12/1965

3

Camparol

Pau

300

Programmation objet avec Oracle

40

I.4 Table objet La syntaxe suivante dfinit une table objet avec ses contraintes: La contrainte PRIMARY KEY dclare la cl primaire La contrainte CHECK imposent des domaines de valeurs La contrainte UNIQUE empche les doublons

Notons qu il aussi possible d ajouter, de supprimer , de dsactiver ou de ractiver des contraintes sur des tables objets l aide de la commande ALTER TABLE de la mme manire que pour les tables relationnelles.

Programmation objet avec Oracle

41

I.4 Table objetCREATE TABLE Pilote OF Pilote_type (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) );

Programmation objet avec Oracle

42

I.4 Table objetI.4.3 Dictionnaire de donneLes vues du dictionnaires de donnes USER_OBJECT_TABLES et ALL_OBJECT_TABLES dcrivent les tables objets Excuter SQL> SELECT TABLE_NAME, OBJECT_ID_TYPE, TABLE_TYPE_OWNER, TABLE_TYPE FROM USER_OBJECT_TABLES;

Programmation objet avec Oracle

43

I.4 Table objetI.4.4 InstanciationCe paragraphe traite des objets ligne (row object) qui sont des objets stocks en tant que ligne d une table objet (dont les valeurs occupent toutes les colonnes). Ces objets sont instancis l aide de la commande INSERT appliqus une table objet Les objets colonne sont les objets qui n occupent pas tous les champs de la table La diffrence entre ligne et colonne est que la ligne possde un OID alors que la colonne non

Programmation objet avec Oracle

44

I.4 Table objetExemple: le script SQL suivants insere 3 objets INSERT INTO Pilote VALUES (Pilote_type('PL-11', etat_civil_type('Lacombe','05-02-1970'), adresse_type(1,'G. Brassens','Blagnac'),3500)); INSERT INTO Pilote VALUES (Pilote_type('CPL-2', etat_civil_type('Laroche','15-12-1963'), adresse_type(2,'Foch','Montauban'),2600); INSERT INTO Pilote VALUES ('CPL-3', etat_civil_type('Labat','25-12-1965'), adresse_type(3,'Camparols','Pau'),3000);

Programmation objet avec Oracle

45

I.4 Table objetI.4.5 A propos des OID Dans un environnement centralis (quand les tables objet ne sont pas rparties ),Il est prfrable d utiliser la cl primaire comme OID. Le chapitre dtaille la composition et l utilisation des OID:

Programmation objet avec Oracle

46

I.4 Table objetOID bass sur la cl primaire Pour que les OID doivent tre bass sur la cl primaire de la table, il faut opter pour l option PRIMARY KEY comme le montre l instruction suivante: CREATE TABLE Pilote OF Pilote_type (CONSTRAINT pk_Pilote PRIMARY KEY(brevet), Autrescontraintes ) OBJET IDENTIFIER IS PRIMARY KEY;

Programmation objet avec Oracle

47

I.4 Table objet La colonne OBJECT_ID_TYPE de la vue USER_OBJECT_TABLES permet de retrouver la mthode de gnration de l OID: Excuter SQL> SELECT TABLE_NAME, OBJECT_ID_TYPE, TABLE_TYPE FROM USER_OBJECT_TABLES;

Programmation objet avec Oracle

48

I.4 Table objetIndex sur OID Si un index doit tre declar sur un OID de la meme table objet, il faut opter pour l option OIDINDEX comme le montre l exemple suivant: CREATE TABLE Pilote OF Pilote_type (CONSTRAINT pk_Pilote PRIMARY KEY(brevet), OBJECT IDENTIFIER IS SYSTEM GENERATED OIDINDEX index_OID_Pilote (STORAGE (INITIAL 100K NEXT 50K MINEXTENTS 1 MAXEXTENTS 50 PCTINCREASE 5));

Programmation objet avec Oracle

49

I.4 Table objetVisualisation Le chapitre 3 dcrit l instruction SELECT pour construire des requtes de visualisation La directive REF permet d extraire une reference. La requte suivante extrait les OID des objets de la table Pilote: SQL>SELECT REF(p), p.brevet, p.etat_civil_t.nom FROM Pilote p;

Programmation objet avec Oracle

50

I.4 Table objetI.4.6 Manipulation des objets On modifie par la commande UPDATE et on supprime par la commande DELETE. Dans les deux cas on doit utiliser un alias afin de parcourir les structures de donnes plusieurs niveaux Exemple : crire un script pour modifier le nom et la paye du premier pilote, et pour supprimer aussi les pilotes ne rsidant pas Blagnac

Programmation objet avec Oracle

51

I.4 Table objetSQL> UPDATE Pilote p SET p.etat_civil_t.nom = 'Sigaudes', p.paye=3700 WHERE brevet = 'PL-11'; -SQL> DELETE FROM Pilote p WHERE NOT (p.adresse_t.ville = 'Blagnac');

Programmation objet avec Oracle

52

I.4 Table objetChargement d un objet (VALUE) La fonction SQL VALUE (alias) renvoie un contenue sous la forme d un type La requete suivante extrait un objet charg partir de la table pilote. Ce rsultat est diffrent de la deuxime extraction ( l utilisation de *) qui ne construit qu un ensemble de valeur: SQL> SELECT VALUE(ap) FROM Pilote ap WHERE ap.brevet = 'PL-11'; SQL> SELECT * FROM Pilote WHERE brevet = 'PL-11';Programmation objet avec Oracle 53

I.4 Table objet Le bloc PL/SQL suivant charge les donnes dans un objet non persistant (variable var_pilote) L objet non persistant doit etre manipul par la notation pointe.DECLARE var_pilote Pilote_type; BEGIN SELECT VALUE(ap) INTO var_pilote FROM Pilote ap WHERE ap.brevet = 'PL-11'; IF (var_pilote.etat_civil_t.nom = 'Sigaudes') THEN DBMS_OUTPUT.PUT_LINE('Sigaudes est trouv! sa paye : ' || TO_CHAR(var_pilote.paye)); END IF; END;/Programmation objet avec Oracle 54

I.4 Table objetDirective %TYPE La directive SQL%TYPE s applique une colonne d une table . Elle est utilise pour dclarer une variable dans PL/SQL DECLARE varBrevet Pilote.brevet%TYPE; varRue Pilote.adresse_t.rue%TYPE; varNom Pilote.etat_civil_t.nom%TYPE; BEGIN varBrevet := 'PL-5'; varRue := 'Port-Royal'; varNom := 'Bidal'; END; /Programmation objet avec Oracle 55

I.4 Table objetI.4.7 Valeurs NULL Un objet non persistant, un objet colonne , une collection un lment d une collection peut tre explicitement initialis NULL (implicitement s il n a pas t initialis) Un Objet ligne ne peut tre pas initialis NULL Un objet initialis NULL (est dit atomically null) est diffrent du mme objet ayant toutes ses colonnes vide. Le premier est dit objet vide. Le second est dit objet nul

Programmation objet avec Oracle

56

I.4 Table objetObjets non persistants Dans le bloc suivant, l objet colonne adresse de l objet non persistant p1 est nul (tous ses champs valent null). La mise jours de l adresse p1 est possible L objet colonne adresse de l objet non persistant p2 est vide. La mise jours de l adresse p2 n est pas possibleDECLARE p1 Pilote_type; p2 Pilote_type; BEGIN p1 := NEW Pilote_type('PL-1 ,etat_civil_type( Bidal', 16-01-1965') , adresse_type(NULL, NULL, NULL),3000) ; p2 := NEW Pilote_type('PL-1 , etat_civil_type( Bidal', 16-01-1965'), NULL,3000) ; END; /

Programmation objet avec Oracle

57

I.4 Table objetObjets colonne Comme le montre l exemple suivant la modification de la colonne adresse du premier cas est possible. Dans le second cas ca ne sera pas possible. En effet on ne peu pas accder un objet vide. INSERT INTO Pilote VALUES ( 'PL-1 ,etat_civil_type( Bidal', 16-01-1965') , adresse_type(NULL, NULL, NULL),3000) ; INSERT INTO Pilote VALUES ('PL-1 , etat_civil_type( Bidal', 16-01-1965'), NULL,3000);Programmation objet avec Oracle 58

I.4 Table objetI.4.8 INDEX Comme pour les tables relationnelles, on peut crer un index pour une table Objet Nous verrons qu on peut indexer des collections (voir chap 4 et 9) -- table relationnelle Vols CREATE INDEX idx_r_nomPilote ON Vols (CDB_t.etat_civil_t.nom); -- table objet Pilote CREATE INDEX idx_o_villePilote ON Pilote (adresse_t.ville);

Programmation objet avec Oracle

59

I.4 Table objetI.4.9 Dclencheurs (Triggers) Il est possible de dfinir un ou plusieurs dclencheurs sur une table objet Nous tudierons par ailleurs un nouveau type de dclencheurs (INSTEAD OF) qui permettent la mise jour de vue multi tables (voir chapitre 8) L exemple suivant dcrit un dclencheur programm sur la table objet PILOTE. Ce dclencheur insre un enregistrement dans la table trace chaque nouveau pilote domicili Blagnac et n le 05-02-1965 ou le 16-01-1965 La condition WHEN filtre les objets et vite ainsi de tester la condition sur la ville (instruction IF dans le corps du dclencheur) L accs aux valeurs d un nouvel objet dans le corps du dclencheur ou dans la condition est not par la directive NEW

Programmation objet avec Oracle

60

I.4 Table objetCREATE TABLE Trace (ligne VARCHAR(80)); CREATE TRIGGER trig_o_Pilote1 AFTER INSERT ON Pilote FOR EACH ROW WHEN ( NEW.adresse_t.ville = 'Blagnac' ) BEGIN IF ( :NEW.etat_civil_t.datenais = '05-02-1965' OR :NEW.etat_civil_t.datenais = '16-01-1965') THEN INSERT INTO trace VALUES ('Pilote : '|| :NEW.brevet || ' est de Blagnac et son anniversaire concorde...'); END IF; END; /

Programmation objet avec Oracle

61

I.4 Table objetCREATE TABLE Trace (ligne VARCHAR(80)); CREATE TRIGGER trig_o_Pilote1 AFTER INSERT ON Pilote FOR EACH ROW WHEN ( NEW.adresse_t.ville = 'Blagnac' ) BEGIN IF ( :NEW.etat_civil_t.datenais = '05-02-1965' OR :NEW.etat_civil_t.datenais = '16-01-1965') THEN INSERT INTO trace VALUES ('Pilote : '|| :NEW.brevet || ' est de Blagnac et son anniversaire concorde...'); END IF; END; /

Programmation objet avec Oracle

62

I.4 Table objet Le code suivant instancie un objet de la table objet PILOTE qui dclenche une insertion dans la table trace SELECT * FROM Trace; INSERT INTO Pilote VALUES ('CPL-4',etat_civil_type('Sery','16-01-1965'), adresse_type(3,'Hoche','Blagnac'),3400); SELECT * FROM Trace;

Programmation objet avec Oracle

63

I.4 Table objetI.4.10 Extraction d objets Toutes les fonctionnalits relationnelles de l instruction SELECT sont applicables aux tables objets. Ainsi, il est possible d utiliser les directives suivantes : DISTINCT , ORDER BY, GROUP BY,MINUS,UNION. Les chapitres 3,4 et 6 dcrivent les spcificits de l instruction SELECT pour manipuler les rfrences, les collections et les mthodes.

Programmation objet avec Oracle

64

I.4 Table objetElments de la clause FROM Depuis la version 8 (1997), la clause FROM d une requte peut contenir une instruction SELECT. Considrons la table Pilote, la requte suivante fournit la rpartition en pourcentage des pilotes par compagnie:SELECT aliasCompa.compagnie,aliasCompa.nbPil/aliasPil.total*100 "%Pilotes" FROM (SELECT compagnie, COUNT(*) nbPil FROM Pilote GROUP BY compagnie) aliasCompa, (SELECT COUNT(*) total FROM Pilote) aliasPil;

Programmation objet avec Oracle

65

I.4 Table objetI.4.11Supression d une table objet La suppression d une table objet par la commande DROP TABLE entraine la suppression des objets stocks, des privilges, des index Si vous voulez seulement supprimer les objets d une table et viter tous ces effets de bord, vous pouvez utiliser la commande TRUNCATE TABLE. Attention, il n est pas possible d annuler un ordre DROP TABLE par ROLLBACK

Programmation objet avec Oracle

66

I.4 Table objet Pour dtruire un schma entier, il faut commencer par supprimer les tables objet puis les types associs et pas l inverse, on doit d abord les supprimer les tables puis les types associs: DROP TABLE Pilote; DROP TYPE Pilote_type; DROP TYPE adresse_type; DROP TYPE etat_civil_type

Programmation objet avec Oracle

67