Documente Academic
Documente Profesional
Documente Cultură
interrogation et collections
Exemple: Schéma OR pour l'association 1-1 ou (1..1 – 1..1)
Stage Etudiant
noS* matE*
sujetS nomE
@etudiant_t ageE
effectueE
Create Type etudiant_t as Object ( matE int, nomE varchar(50), age int) /
Create Type stage_t as Object ( noS int, sujetS varchar(25), effectueE REF
etudiant_t) /
Create Table Etudiant of etudiant_t (Constraint pk_matE Primary key (matE));
Create Table Stage of stage_t (constraint pk_Stage Primary key (noS),
Une table et non un type
Constraint c_effectueE Check (effectueE IS NOT NULL),
Constraint s_effectue effectueE SCOPE IS Etudiant);
*** La multiplicité n'est pas validée avec cette spécification de la table Stage.
Est-ce que ce lien mono et externe est équivalent à l'association?
¾ Lien est toujours valué : tout stage est donc associé à un étudiant.
¾ Est-ce que l'ajout d'un stage implique que ce dernier est obligatoirement
associé à un seul étudiant?
Non. Il faudra à l'ajout d'un stage ajouter aussi un étudiant dans la
même transaction et ensuite s'en assurer par un trigger Before Insert
associé à Stage et finalement faire un commit.
Cohérence et unicité de la multiplicité NOT NULL du lien externe
Stage Etudiant
noS* matE*
sujetS nomE
@etudiant_t ageE
effectueE
Stage Etudiant
noS* matE*
sujetS nomE
@etudiant_t ageE
effectueE
Pilote
Implémentation par un lien interne multi vers la
noP*
structure interne (le type) entr_t pour Entrainement.
nomP
Un lien interne particulier conduit à plusieurs objets
gradeP imbriqués de type entr_t.
lesEntr Devient un objet-colonne
entr_t
codeE*
dateE Formulation relationnelle théorique (NF2):
regionE Entrainement ( codeE*, dateE, regionE)
Pilote(noP*, nomP, gradeP, lesEntr) (avec un attribut complexe
de type ensemble ou collection)
En OR:
Create Type entr_t as Object (codeE int, dateE Date, regionE varchar2(5))
/
Suite… Association 1-* (table imbriquée)
Une table imbriquée dans une table PARENT n'a qu'un seul attribut qui peut
être complexe comme un objet de colonne (conférant indirectement plusieurs
attributs à la table imbriquée.)
• Création du type de la table imbriquée (type de la collection):
Create Type lesEntr_t AS TABLE OF entr_t -- type de l'ensemble
Peut être lu comme un ensemble
/
d'objets-colonnes définis avec le
OU si le type de l'élément est simple : type entr_t
¾ La table imbriquée peut être vue comme une sous-table de la table parent
(hôte), mais son implantation fait appel à une table physique séparée laquelle
ne peut pas être utilisée directement ni pour la sélection, ni pour la mise à jour.
Un objet-
Structure logique : colonne de
type
Pilote : collection
noP*:int nomP:varchar gradeP: char lesEntr : {} contenant
d'autres
objets-
codeE dateE regionE colonnes
50 Jacquet A 1 2-12-98 Sud
2 7-12-98 Sud
60 Vézina B 1 17-11-99 Nord
¾ Les éléments de la table imbriquée sont stockés dans un espace physique distinct de
celui de la table qui la contient.
Chaque table imbriquée (ayant un seul attribut complexe) correspond à une table de stockage
composée des attributs de la table imbriquée plus une colonne cachée qui permet de
matérialiser chaque élément à un tuple parent. L'accès aux éléments de la sous-table
génère une jointure implicite, mais bien réelle.
Colonne cachée
Pilote: noP* nomP gradeP nestedTableID
50 Jacquet A 23F45
60 Vézina B 36A456
TableLesEntr :
nestedTableID codeE dateE regionE
23F45 1 2-12-98 Sud
23F45 2 7-12-98 Sud
36A456 1 17-11-99 Nord
Indexation de la sous-table (externe)
¾ L'indexation est faite via la table de stockage physique (de là son nom
apparaissant dans la clause STORE de la création de la table parent.
Pilote
noP*
nomP
gradeP
lesEntr
entr_t
codeE*
dateE
regionE
Insertion d'objets dans la table typée Pilote
Pilote:
noP* nomP gradeP lesEntr : { }
codeE dateE regionE
50 Jacquet A 1 2-12-98 Sud
2 5-6-04 Sud
60 Vézina B 1 17-11-99 Nord
70 Turgeon A null null null
La réponse est composée de deux objets-colonnes imbriquées dans un autre objet colonne.
Les applications qui exploitent une telle réponse doivent prévoir les structures de réception
appropriées : en PL/SQL c'est le curseur typée avec LesEntr_t. En C c'est une struct . En
C++, une classe, en Java,… dont la définition peut être fournie par l'utilitaire JDBC.
Recherche comportant un attribut et une collection
La réponse est composée de deux objets de table. Le premier ayant deux objets-colonnes
imbriqués.
Affichage des attributs autres que ceux des collections
2.2 Quelles sont les numéros de pilote et les dates d'entraînement dans la région Sud?
Les données de la réponse proviennent que de la sous-table:
Select e.dateE
From Pilote p, TABLE ( Select p.lesEntr from Pilote p ) e -- unnesting la sous-table
Where e.regionE = 'Sud' ;
** Restriction : le Select de Table doit retourner une seule collection composé d'un seul
attribut.
Vision tabulaire de Pilote
La requête suivante est interdite, car lesEntr n'est pas un attribut de type
REF.
Select p.noP
From Pilote p
Where p.lesEntr.codeE = 1;
Erreur : unknown identifier
Autres interrogations (suite)
Par exemple: ajout d'un entraînement [5, '24-10-2004', 'Est'] au pilote 60:
Usine:
noU* villeU lesAteliersIn lesAteliersEx
tel chef specialite chefE villeE
100 Québec 456 Dion soudure argon Jean Qc
345 Morin coupe laser Luc Mtl
200 Montréal 327 Joliot pliage acier Kevin Lévis
678 Curie structure
Deux sous-tables imbriquées dans la table Usine, chacune a une taille indépendante
de l'autre:
L'objet usine no 200 a deux collections: la 1ère a une taille de 2 et la 2è avec une
taille de 1 (pour ce moment).
Pilote
noP* Entrainement
nomP codeE*
gradeP dateE
lesEntrRef regionE
Create Type entrainement_t as Object (codeE int, dateE Date, regionE int)
/
Lien externe multi (avec table imbriquée de REF)
Mnav: Le lien externe sous-tend le type REF et le multi sous-tend la notion
de collection de REF dont chacune pointe OBLIGATOIREMENT sur un
objet de type entrainement_t. C'est une sous-table de références.
Create Type refEntr_t as Object (refEntr REF entrainement_t) /
Create Type pilote_t as Object (noP int, nom varchar2(35), grade char(1),
lesEntrRef lesEntrRef_t) /
-- lesEntrRef_t est une structure de collection (ensemble) i.e. une table
imbriquée de références dont la valeur ne peut pas être nulle.
Création des tables Pilote et Entrainement
*** La contrainte NOT NULL pour lesEntrRef est effectuée sur la sous-table physique TableLesEntrRef
Si les références aux objets vers Entrainement doivent exister ( NOT NULL),
il faut modifier le type de l'attribut dans la table physique par le ALTER
TYPE: Table imbriquée stockée
Alter Table tableLesEntrRef ADD Constraint c_RefEntr Check(refEntr is not
null);
NB: il ne peut pas y avoir une contrainte NOT NULL définie lors de la création de la
table hôte.
La collection VARRAY
Collection de type VARRAY
¾ Avec le type VARRAY, la collection est stockée soit dans l'objet parent,
soit comme un objet opaque soit : RAW ou BLOB
Usages :
4. L'accès par indice est très performant surtout lorsque le VARRAY est de
petite taille et stocké avec les autres attributs du parent (in-line VARRAY).
Structure interne du VARRAY
null null
Objet 1 Objet 2 Objet 3
Objet ajouté
Association 1 - * : Vue logique du VARRAY
courriel : courriel_t
Bois@ibm.com
15 E.F.BOIS EFBois@ny.edu
Bois@home.net
A. Gamache Objet-Relationnel
Collection de taille limitée et prédéterminée : VARRAY()
Courriel : courriel_t
lesContacts:{ }
Courriel: courriel_t
Select
From lesContacts
Where contact_t ('345-346) MEMBER OF lesContacts;
Tables du dictionnaire pour les collections VARRAY
• Une contrainte NOT NULL peut être ajoutée seulement avec le ALTER
TABLE:
Bois@ibm.com
15 E.F.Bois EFBois@ny.edu
Bois@home.net
engel@ulaval.ca
…
20 Engel
robertEngel@sympatico.ca
Supprimer tous les objets de chercheur:
DELETE Chercheur;
Manipulation des objets du VARRAY
NO NOM LESCONTACTS
37 Demers LESCONTACTS_T(COURRIEL_T('Pasteur@.CHU.com '),
COURRIEL_T('LP@hopitalNord.com '))
Suppression des objets et lecture des objets du VARRAY
1. Impossible avec le DML (Insert, Update, Delete) comme c'est le cas avec
la Nested Table de mettre à jour par exemple le Varray avec SQL. Le
select est permis.
Courriel:courriel_t
Bois@ibm.com
15 E.F.Bois EFBois@ny.edu
20 Engel engel@ulaval.ca
Ajout d'un objet Chercheur:
Insert into Chercheur values (
chercheur_t(20, 'Engel', lesContacts_t(courriel_t('engel@ulaval.ca'))));
L'ajout d'un 2è contact au chercheur no 20: impossible avec insert dans un Varray.
Ajout d'un chercheur avec 2 contacts nuls (mise à jour subséquente possible):
Insert into Chercheur values (
Chercheur_t(50, 'Brassard', lesContacts_t(courriel_t(NULL), contact_t(NULL), ));
Modification d'un VARRAY() avec PL/SQL
Declare
tableauLesContacts lesContacts_t;
Begin
Select lesContacts INTO tableauLesContacts From Chercheur c
Where c.no = 15 FOR UPDATE OF lesContacts; -- init du tableau
-- modification du 2è et 3è objet-colonne du tableau
tableauLesContacts(2) := courriel_t ('Robert E. Engel@ulaval.ca');
tableauLesContacts(3) := courriel_t ('R. E. Engel@ulaval.ca');
UPDATE Chercheur c
SET c.lesContacts = tableauLesContacts Where c.noC = 15 ;
End;
/
Le FOR UPDATE verrouille l'objet du chercheur no 15, le temps de la mise à jour. Il est
déverrrouillé par un commit;
Affichage de la collection lesContacts avec la directive TABLE()
Select p.contact
From Table(Select c.lesContacts From Chercheur c Where c.no =20) p ;
courriel_t('Robert E@ulaval.ca');
courriel_t('R. E. Engel@ulaval.ca');
courriel_t('Engel@ulaval.ca'))));