Vous êtes sur la page 1sur 8

 

Université A/Mira Bejaïa Niveau : 1 ère année Master Figure 01


Faculté des Sciences Exactes Module : BDD Avancées
Département d’Informatique Année Universitaire
2018/2019
2. SQL3 : implémentation ORACLE
2.3. Les Références

2.3.1. Généralités

Les références d’Oracle sont mises en œuvre par


l’intermédiaire du type SQL REF.

Une référence est un pointeur vers un objet ligne (objet


persistant d’une table objet appelé row object).

Chaque référence ne peut contenir qu’un OID.

Une référence peut être déclarée à l’intérieur d’un


type ou dans une table relationnelle par la directive
REF comme l’illustre le code suivant :

CREATE TYPE type 2 {AS OBJECT | UNDER


nomSurType 2}
( colonne REF Type 1,….)
/

CREATE TABLE nomTableRellationelle ( colonne


REF Type 1,….) ;

Considérons l’exemple suivant :


 
 
Code 1 : Création de types Code 3 : Insertion d’une référence

INSERT INTO Compagnie VALUES


CREATE TYPE Siege_social_type AS OBJECT (Compagnie_type('AF',Siege_social_type(124,'Port Royal','Paris'),
(nrue NUMBER(3), rue VARCHAR(20), ville VARCHAR(15)) 'Air France'));
/ INSERT INTO compagnie VALUES
CREATE TYPE Compagnie_type AS OBJECT (Compagnie_type('SING',Siege_social_type(7,'Camparols','Singapour'),
(comp VARCHAR(4), siege_social_t siege_social_type, nomComp 'Singapore AL'));
VARCHAR(15)) INSERT INTO Avion VALUES ('C-LARA','A320',235,
/ (SELECT REF(c) FROM Compagnie c WHERE c.comp='AF'));

Code 2 : Création de tables INSERT INTO Avion VALUES ('R-OMAN','A319',180,


(SELECT REF(c) FROM Compagnie c WHERE c.comp='AF'));
Table Compagnie
INSERT INTO Avion VALUES ('F-WTSS','Concorde',90,
CREATE TABLE Compagnie OF Compagnie_type (SELECT REF(c) FROM Compagnie c WHERE c.comp='AF'));
(CONSTRAINT pk_Compagnie PRIMARY KEY(comp));
INSERT INTO Avion VALUES ('F-PAUL','A380',560,
Table Avion (SELECT REF(c) FROM Compagnie c WHERE c.comp='SING'));

1. CREATE TYPE Avion_type AS OBJECT Code 4 : Reference Null


(immat VARCHAR(6), typeAvion VARCHAR(10), capacite
NUMBER(3), ref_Compagnie REF Compagnie_type)
/ Il est possible d’affecter la valeur NULL à une référence si aucune
contrainte NOT NULL n’est définie au niveau de la table. Dans notre
CREATE TABLE Avion OF Avion_type exemple, ajoutons un avion sans préciser sa compagnie.
(CONSTRAINT pk_Avion PRIMARY KEY(immat));

2. CREATE TABLE Avion INSERT INTO Avion VALUES ('F-ENTE','A380',560, NULL);


(immat VARCHAR(6), typeAvion VARCHAR(10), capacite
NUMBER(3), ref_Compagnie REF Compagnie_type, Aucune contrainte not null sur l’attribut   ref_compagnie 
CONSTRAINT pk_Avion PRIMARY KEY(immat));


 
 
Code 5 : Modification d’une référence 1. CREATE TABLE Avion OF Avion_type
(CONSTRAINT pk_Avion PRIMARY KEY(immat),
L’instruction UPDATE permet de mettre à jour une référence. Cette mise CONSTRAINT nn_ref_Compagnie CHECK (ref_Compagnie IS
à jour consiste à affecter dans une colonne de type REF l’OID de l’objet NOT NULL));
ligne cible.
INSERT INTO Avion VALUES ('F-ENTE','A380',560, NULL);
UPDATE Avion a erreur ……………………………….
SET a.ref_Compagnie = (SELECT REF(c)
FROM Compagnie c 2. CREATE TABLE Avion OF Avion_type
WHERE c.comp='SING' ) (CONSTRAINT pk_Avion PRIMARY KEY(immat));
WHERE a.immat = 'F-ENTE';
ALTER TABLE Avion
Code 6 : Suppression d’une référence ADD Constraint nn_ref_Compagnie
CHECK (ref_Compagnie IS NOT NULL);
La suppression d’une référence revient à affecter la valeur NULL par la
commande UPDATE. INSERT INTO Avion VALUES ('F-ENTE','A380',560, NULL);
erreur ……………………………….
- possible à la condition qu’il n’existe pas de contrainte NOT NULL.

UPDATE Avion a SET a.ref_Compagnie = NULL


WHERE a.immat = 'F-ENTE';

Code 7 : Contrainte NOT NULL

La directive CHECK permet de déclarer une contrainte NOT NULL sur


une référence au niveau d’une table (relationnelle ou objet).

- Utilisée dans CREATE TABLE ou dans ALTER TABLE.


 
 
2.3.2. Les jointures implicites : Code 10 : Dans SELECT et WHERE

Les requêtes manipulant des références (les jointures deviennent SELECT a.immat, a.ref_Compagnie.nomComp,
implicites : notation pointée) possèdent les caractéristiques suivantes : a.ref_Compagnie.siege_social.nrue || ', ' ||
a.ref_Compagnie.siege_social.rue "Siege Social"
- Le nom de la table contenant la référence doit se trouver dans la FROM Avion a
clause FROM ; WHERE a.typeAvion = 'Concorde'
- Il est nécessaire d’utiliser un alias pour la table contenant la AND a.ref_Compagnie.siege_social.ville = 'Paris';
référence ; Notation pointée :
- La jointure implicite se programme par la notation pointée
alias.référence.colonne (soit dans la clause FROM, soit dans la clause La notation pointée peut s’écrire :
WHERE, soit dans les deux). Le choix se fera en fonction des
- Alias.objetColonne.référence ;
besoins d’affichage et de tri.
- Alias.colonneObjet.référence.colonne ;
Code 08: Dans WHERE - Alias.référence.colonne.

SELECT a.immat, a.typeAvion


FROM Avion a
WHERE a.ref_Compagnie.comp = 'AF' ;

Code09 : Dans SELECT

SELECT a.ref_Compagnie.comp, a.ref_Compagnie.nomComp


FROM Avion a
WHERE a.typeAvion = 'Concorde' ;


 
 
2.3.3. Fonctions pour les références : La première requête extrait, à l’aide de la fonction REF, les OID des
avions ciblant la compagnie de code « SING » (ici seul l’avion OID1 sur
Les fonctions SQL qui permettent de manipuler des références : REF,
la figure respecte cette condition). La deuxième requête extrait la valeur
DEREF et DANGLING.
de la référence de l’avion immatriculé « F-WTSS » (OID4 sur la figure).
- Extraction d’un OID (REF) : Cette fonction se trouve dans la Code11
clause SELECT d’une requête et nécessaire d’utiliser un alias de la
table objet par exemple : - SELECT REF(a) FROM Avion a WHERE
SELECT REF (alias) FROM tableObjet alias…. a.ref_compagnie.comp='SING';
- SELECT a.ref_compagnie FROM Avion a WHERE a.immat ='F-
Considérons l’exemple des deux tables objet suivant. WTSS';
Figure 02


 
 
Figure 03

SELECT REF(c) FROM Compagnie c WHERE c.comp='SING';


- Déréférencement (DEREF) :

La fonction SQL DEREF (référence) extrait le contenu de l’objet (sous la


- SELECT a.immat
forme d’un type) à l’adresse de la référence. Cette fonction se trouve dans
FROM Avion a
WHERE a.ref_Compagnie = ( SELECT REF(c) la clause SELECT d’une requête (par exemple :
FROM Compagnie c
WHERE c.comp='SING'); SELECT DEREF (référence) FROM…).


 
 
Code 12 Code13

SELECT DEREF(ref_Compagnie) SELECT immat, typeAvion FROM Avion


FROM Avion a WHERE ref_Compagnie IS DANGLING;
WHERE a.immat='F-PAUL';
F-WTSS…….
- Référence perdues (DANGLING) :
La requête suivante extrait les objets de la table avion possédant une
Une référence, qui n’est pas contrainte par la directive REFERENCES, référence active :
peut cibler un objet disparu. Oracle parle de références perdues (dangling
references). La figure suivante illustre une référence perdue suite à la SELECT immat, typeAvion FROM Avion
WHERE ref_Compagnie IS NOT DANGLING;
suppression d’une compagnie.

L’opérateur DANGLING permet d’extraire les références perdues. F-PAUL

- DANGLING renvoie TRUE si la référence cible un objet


inexistant ;
- DANGLING renvoie FALSE si la référence cible un objet
existant.

La requête suivante extrait les objets de la table Avion possédant une


référence perdue :


 
 
- Fonction TREAT (completer avec la syntaxe …) - Fonction IS OF (completer avec la syntaxe …)

Il est possible de sélectionner des références à un niveau donné d’une Il est possible de comparer le type d’une référence à un type donné.
hiérarchie. La fonction TREAT permet de programmer cette dichotomie
La fonction SQL IS OF (nomType[,monType]) renvoie TRUE si la
en accédant à une référence substituable.
référence testée appartient au (x) type(s) listé(s) en paramètre. Dans le cas
Code 14 Exemple décrit dans la inverse, la fonction IS OF renvoie FALSE.

Figure 02 titre complément : 2.2. L’l’héritage. La requête suivante extrait le type des avions utilisés par les pilotes de
chasse en comparant le type des références avec le type pilotechasse_type :
SELECT TREAT (ref_pilote AS REF PiloteChasse_type) "REF Chasseurs"
Code 16
FROM Avion ;

REF Chasseurs SELECT VALUE(a) FROM Avion a WHERE DEREF(a.ref_pilote) IS OF


(PiloteChasse_type);
------------------------------------------------------------------------------------------
6666666666666666666666666666666666 VALUE(A)(IMMAT, REF_PILOTE)
6666666666666666666666666666666666 ----------------------------------------------------------------------------------------
000022028……………………………. AVION_TYPE (‘F-PAUL’, 000022028…….
Sachant que la fonction TREAT renvoie une référence, il est possible La seconde exploite la référence afin d’extraire des colonnes des objets
d’acceder a une colonne d’un objet cible par la notation pointée. La cibles.
requete suivante extrait le nom des pilotes de chasse :
Code 17
Code 15
SELECT a.immat,a.ref_pilote.brevet, a.ref_pilote.nom FROM Avion a
SELECT TREAT(ref_pilote AS REF PiloteChasse_type).nom "Nom" WHERE DEREF(a.ref_pilote) IS OF (PiloteChasse_type);
FROM Avion
IMMAT, REF_PILOTE.BREVET, REF_PILOTE.NOM
WHERE TREAT(ref_pilote AS REF PiloteChasse_type) IS NOT NULL;
----------------------------------------------------------------------------------------
Nom F-PAUL PL-3 Soutou
------------------------------------------------------------------------------------------
Soutou