SGBD Ro Sql3

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 55

Université Saad DAHLAB BLIDA

Faculté des Sciences


Département d’informatique

Master 1

Le Relationnel Objet : SQL3 Modèle et Langage

Enseignant responsable: Dr. Nesrine LAHIANI

1
Plan du Cours

• C’est quoi SQL3?

• Pourquoi le modèle relationnel-objet

• Propriétés RICE

• Types abstraits de données

Création d'une Table relationnelle objet

Création d'une Table objet

• Les collections Imbriquées


BDD Relationnel-Objet : SDL3

Avant SQL:1999, il existait un ensemble assez simple de


type prédéfinis.

 SQL:1999 a ajouté un système de types étendu à SQL,


permettant les types structurés et l’héritage de types
Pourquoi le Relationnel-Objet?
Le modèle relationnel est basé sur une théorie solide

• Les SGBDR sont robustes

• Les bases de données sont principalement relationnelles

• Le modèle relationnel offre un nombre de types prédéfinis est très faible

• Les types CLOB, BLOB ne sont pas manipulées

•Faible capacité de modélisation (collection, graphes, hiérarchies).

• On parle des SGBD relationnels dans lesquels on insère des notions objet. Ce
sont les SGBD relationnels objet : ORACLE (SQL 3)
Pourquoi intégrer l'objet au relationnel?
• Le modèle relationnel-objet se base sur l'extension du modèle relationnel par
les concepts essentiels de l'objet.

• Le cœur du système reste donc relationnel, mais tous les concepts clés de l'objet
y sont ajoutés dans une forme particulièrement prévue pour faciliter
l'intégration des deux modèles.

• La norme SQL2 a donc été étendue dans SQL3 pour intégrer les concepts
objets. Cependant la «relation» reste fondamentale dans la manipulation des
données
Pourquoi intégrer l'objet au relationnel?
• Basé sur l'extension du modèle SQL 2
• les concepts essentiels de l'objet.
• Le cœur du système reste relationnel,
Extension RICE
• Extensions RICE du modèle Relationnel (le modèle relationnel Objet [Miranda])

R Réutilisation
• Finalité du paradigme objet héritage, composition, polymorphisme

I Identité d’objets
• Identifier un objet de manière unique
Complexité
C
• Définition de objets complexes et/ou fortement structurés
Encapsulation
E • Boîte noire avec des méthodes de manipulation
Le modèle Relationnel-Objet
• Nous nous intéressons dans ce cours au noyau de spécification:

• Types abstraits de données,

• Objets et les tables,

• Opérations de définition, manipulation, interrogation.


08/12/2021 16:03

Types Abstraits de Données ou TAD

 Un TAD est une structure de données partagée


 Inclut des méthodes (procédures où fonctions) pour manipuler les objets ou
instances du TAD
 Réutilisé dans la définition des relations
08/12/2021 16:03

Types Abstraits de Données ou TAD

 Typage fort Type = Données + Méthodes

 La création de type ne crée pas d’objets

 Les objets d’un type sont persistants que lors ils sont insérés dans des tables
déclarées (CREATE TABLE)
08/12/2021 16:03

Types Abstraits de Données


Les types utilisés dans SQL 3
• Les Types standards (Types Prédéfinis EN SQL-92)
• Les Types Utilisateurs:
• Types distincts
• Type OBJECT
• Tableau (VARRAY),
• Table imbriquée (NESTED TABLE)
Types Abstraits de Données : Les types Atomiques
Les types standards existant dans SQL-92

• VARCHAR,
• NUMBER,
• DECIMAL,
• VARCHAR,
• ……
• ……..
• DATE.
Types Abstraits de Données : Type Distinct

Définir un nouveau type par un type prédéfinie . On utilisera après ce type tout
comme Integer ou autres types pour définir une table .
08/12/2021 16:03

Types Abstraits de Données : Les types Objets

Le type Object permet de créer des types structurés.

On peut ensuite utiliser ce type objet


• soit pour définir une table relationnelle standard,
• soit pour définir une table relationnelle objet,
• soit pour définir d’autres types objet qui contiennent cette structure.
08/12/2021 16:03

Types Abstraits de Données : Les types Objets


Déclaration
Create type <type_objet> (as Object | UNDER <type_objet> ) (
<nom_attr1> <type1>,
<nom_attr2> <type1>,
<declaration_methodes>,
) <FINAL | NOT FINAL> ;

- Pour une classe on définit un type structuré et on utilise la clause as object.


- La clause Not Final indique que le type peut avoir des sous types,
- La clause under permet de définir des sous types
Routines définie par l’utilisateur
Routines définie par l’utilisateur
Nous créons le corps de la méthode séparément
08/12/2021 16:03

Types Abstraits de Données


Exemple1 de TAD : Adresse

Employes
num dept salaire nom Adresse

Num Rue Ville CodePostal


08/12/2021 16:03

Types Abstraits de Données


Exemple1 de TAD : Adresse
Déclaration: CREATE TYPE t_adresse AS OBJECT (
num NUMBER,
rue VARCHAR2(30),
ville VARCHAR2(20),
codepostal CHAR(5)
) FINAL ;

Il est ensuite possible d’utiliser ce TAD :


• Pour le réutiliser dans une table relationnelle standard
• pour créer une table d’objets
• pour définir un autre TAD complexe
08/12/2021 16:03

Types Abstraits de Données


Exemple1 de TAD : Utilisation d’un type objet dans une table relationnelle

Dans une table relationnelle, on l’utilise comme un type prédéfini standard

CREATE TABLE Employes (


num NUMBER,
dept NUMBER,
salaire NUMBER,
adresse t_adresse, -- type objet
nom VARCHAR2(30),
PRIMARY KEY num -- on peut définir des contraintes habituelles sur la table
);

N.B. Employes n’est pas une table d’objets. Il n’y a pas de mécanisme d’OID.
08/12/2021 16:03

Types Abstraits de Données


Exemple1 de TAD : Utilisation d’un type objet dans une table d’objets

Une table objet est une table qui contient des éléments de type objet. Chaque élément est identifié par un OID .

CREATE TABLE Adresses OF t_adressse ;

On a une relation dont chaque élément est un objet de type t_adresse. On peut voir la relation de deux
manières différentes :

N.B. Adresse est alors une table d’objets avec gestion des OID associés.
08/12/2021 16:03

Types Abstraits de Données


Exemple1 de TAD : Utilisation d’un type objet dans pour définir un autre TAD complexe

CREATE TYPE TEmployees AS OBJECT (


num NUMBER,
dept NUMBER,
salaire NUMBER,
adresse t_adresse, -- type objet
nom VARCHAR2(30),
);

CREATE TABLE Oemployees OF TEmployees;

N.B. Oemployees est alors une table d’objets avec gestion des OID associés.
08/12/2021 16:03

Les collections imbriquées

Il existe deux types de collections imbriquées :


•Les tableaux fixes (VARRAY ) Le nombre maximum d’éléments EST CONNU
•Les tables imbriquées ( NESTED TABLE ) dont ne fixe pas la taille à priori
08/12/2021 16:03

Les collections Imbriquées


Le type VARRAY
Le type VARRAY (Variable size Array) ou Les tableaux fixes c’est une collection
limitée, indexée, ordonnée d’éléments de même type.

CREATE [OR REPLACE] TYPE <nom-type1> AS VARRAY (nb-max) OF TYPE

Nom Prénom NTéléphones

Lakrib Ali 0794949494; 050505050; 99999999


Chibani Brahim 0794949494; 050505050

CREATE TYPE ttelephone AS VARRAY(3) OF varchar2(10);


08/12/2021 16:03

Les collections Imbriquées


Le type VARRAY

--table relationnelle --table Objet relationnelle


CREATE TYPE t_etudiant AS OBJECT (
CREATE TABLE etudiants (
Nom VARCHAR2(10),
Nom VARCHAR2(10), Prénom VARCHAR2(30),
Prénom VARCHAR2(30), NTéléphones ttelephone ) ;

NTéléphones ttelephone ) ;

CREATE TABLE etudiants OF t_etudiant;


08/12/2021 16:03

Les collections Imbriquées


Les tables imbriquées (NESTED TABLE )
Une table imbriquée est une collection illimitée, non ordonnée d’éléments de même
type. Pour définir une table imbriquée :

1. créer le TAD représentant la structure d’un n-uplet de la table imbriquée,


2. créer un TAD spécifiant la table imbriquée,
3. définir la table utilisant un attribut du type de la table imbriquée.

La création de type NESTED TABLE est faite par le mot clé TABLE OF:
CREATE TYPE nom_type1 AS TABLE OF nom_type2

Num_dep Budget Employes

1 10000004 E1, E2, E3


2 12222222 E6, E5
08/12/2021 16:03

Les collections Imbriquées


Les tables imbriquées (NESTED TABLE )
-- type des éléments de la table imbriquée
CREATE TYPE t_employe AS OBJECT (
Num VARCHAR2(20),
nom VARCHAR2(30),
age NUMBER
);
CREATE TYPE t_employes AS TABLE OF t_employe ;
--table relationnelle standard
CREATE TABLE departements (
num_dep NUMBER,
budget NUMBER,
employes t_employes
) NESTED TABLE employes STORE AS tab_emp ;
08/12/2021 16:03

Les collections Imbriquées


Les tables imbriquées (NESTED TABLE )

--table Objet relationnelle


CREATE TYPE t_departement AS OBJECT (
num_dep NUMBER,
Budget NUMBER,
employes t_employes
);

CREATE TABLE departements OF t_departement NESTED TABLE employes STORE AS


tab_emp ;

tab_emp est le nom physique de la table imbriquée


Partie 2: SQL3 Manipulation des TAD

30
Manipulation d'une Table relationnelle objet

Manipulation d'une Table objet

Manipulation d’une collection ( Table Imbriquée et Tableau fixe)


OEmployes

Insertion dans une table num dept salaire nom

Num Rue
Adresses

Ville CodePostal

• Pour insérer dans une table incluant un TAD on utilise un constructeur pour le sous-type
construit.
INSERT INTO OEmployes VALUES (TEmployes (10, ArchiLog, 50000, Cherfouh, TADRESSE(30,’10 RUE
AHMED KATIB’,’ALGER’,16140)) ); -- Vision objet

Ou bien :

INSERT INTO OEmployes VALUES (10, ArchiLog, 50000, Cherfouh, TADRESSE(30,’10 RUE AHMED
KATIB’,’ALGER’,16140) ); -- Vision relationnelle

N.B. Le constructeur TEmployes n’est pas obligatoire mais le constructeur TADRESSE est obligatoire.
Interrogation dans une table objet
• On peut accéder aux valeurs comme dans le cas du relationnel standard.
 SELECT e. nom FROM OEmployes e where e.adresse.ville like
’Alger’ ;
-- e est un alias de table adresses

• On peut accéder aux objets:


 SELECT VALUE(a) FROM OEmployes e;
-- e est un alias de table et VALUE est un mot clé pour récupérer les objets

• On peut accéder aux objets:


 SELECT REF(e) FROM OEmployes e;
-- e est un alias de table et REF est un mot clé pour récupérer les références
Modification des informations dans une table objet
• Modification

UPDATE OEmployes e SET e.ADRESSE.VILLE = ’ALGER’ WHERE


e.ADRESSE.CODE_POSTAL LIKE ’16%’;

• Suppression

DELETE FROM OEmployes e WHERE e.ADRESSE.VILLE = ’ALGER’


Utilisation des références pour représenter les informations dans les relations
• Cette représentation pose des problèmes de redondance, de maintien de cohérence
lors des mises à jour.
OEmployes

num dept salaire nom Adresses

1 Archi_Log 50000 cherfouh 30 ’10 RUE AHMED Alger 16140


KATIB’

3 DB_Desig 60000 Djawaher 30 ’10 RUE AHMED Alger 16140


n KATIB’

10 Dev_Mob 80000 Boukhari 20 ‘AADL Daboussi Alger 16050


Draria’

Quelle est la solution ???

Décomposer la table OEmployes en deux :


Utilisation des références pour représenter les informations dans les relations
TABLE OEmployes (avec des OID d’objets de la table
TABLE adresses — table objet
adresses)
OEmployes Adresses
num dept salaire nom Adresses
ABC1234 30 ’10 RUE AHMED Alger 16140
1 Archi_Log 50000 cherfouh ABC1234 KATIB’

XYZ9999 20 ‘AADL Daboussi Alger 16050


3 DB_Design 60000 Djawaher ABC1234 Draria’

10 Dev_Mob 80000 Boukhari XYZ9999

• Pas de changement pour l’interrogation des relations.


• Par contre, en terme de représentation, un objet est conservé en un seul exemplaire
dans une autre table et non pas à l’intérieur de chaque n-uplet qui l’utilise.
Utilisation des références pour représenter les informations dans les relations
Exemple : définition de types utilisant des références (ou pointeurs)

CREATE TYPE t_ville AS OBJECT ( nom


VARCHAR(10), population NUMBER ) ;

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 ;
Utilisation des références pour représenter les informations dans les relations
Les requêtes suivantes ont utilisées pour insérer les n-uplets :

--Insérer les villes

INSERT INTO villes VALUES ( ‘Paris’, 2000000 ) ;

INSERT INTO villes VALUES ( ‘Rome’, 2700000 );

--Insérer les pays

Pour insérer le n-uplet correspondant à la France :


INSERT INTO pays (nom, population) VALUES ( ‘FRANCE’, 60000000 ) ;

Pour modifier le n-uplet correspondant à la France :

UPDATE pays SET capitale = ( SELECT REF(v) FROM villes v WHERE v.nom = ‘Paris’ ) WHERE nom
= ‘FRANCE’ ;
Utilisation des références pour représenter les informations dans les relations
Les requêtes suivantes ont utilisées pour insérer les n-uplets :

--Insérer les villes

INSERT INTO villes VALUES ( ‘Paris’, 2000000 ) ;

INSERT INTO villes VALUES ( ‘Rome’, 2700000 );

--Insérer les pays

Pour insérer le n-uplet correspondant à l’Italie :

INSERT INTO pays SELECT ‘ITALIE’, REF(v), 57000000 FROM villes v WHERE v.nom = ‘Rome’
Utilisation des références pour représenter les informations dans les relations
Interrogation de tables utilisant des références

Les données sont interrogées comme si elles étaient physiquement dans la table.

Exemple

SELECT * FROM pays ;

SELECT p.nom, p.capitale.nom, p.population FROM pays p ;

-- le résultat est la table pays ci-dessous


Manipulation d’une table imbriquée
Insertion dans une relation utilisant une table imbriquée
• Pour insérer un élément qui comporte une table imbriquée, on peut, comme pour les autres
objets, utiliser le constructeur de type.
Num_dep Budget Employes
1 10000004 t_employe (12345, ‘Cherfouh’, 25)

t_employe(2222, ‘Djawaher’, 28)


2 1000000 Ø
5 1100000 null

INSERT INTO departements VALUES (1, 10000004, t_employes (t_employe (12345, ‘Cherfouh’, 25),
t_employe (2222, ‘Djawaher, 28))) ;

• t_employes est le constructeur de type de la table employé


• t_employe est le constructeur de type des éléments de la table imbriquée.
• (12345, ‘cherfouh’, 25) et (2222, ‘Djawaher, 28) sont les valeurs des attributs de l’élément
Insertion dans une relation utilisant une table imbriquée
• Pour insérer un élément qui comporte une table imbriquée, on peut, comme pour les autres
objets, utiliser le constructeur de type.
Num_dep Budget Employes
1 10000004 t_employe (12345, ‘Cherfouh’, 25)

t_employe(2222, ‘Djawaher’, 28)


2 1000000 Ø
5 1100000 null

INSERT INTO departements VALUES (2, 100 000, t_employes()) ;

On a créé la table imbriquée mais elle est vide

INSERT INTO departements (numdep, budget) VALUES (5, 100 000) ;

La table imbriquée n’a pas été créé.


Manipulation des collections imbriquées

La clause THE permet de manipuler les objets (ou des scalaires) dans les collections

implémentées sous forme de tables imbriquées.

Syntaxe

• INSERT INTO THE (SELECT ...) VALUES (...)

• DELETE THE (SELECT ...) WHERE ...

• UPDATE THE (SELECT ...) SET ... WHERE ...


Insertion dans une relation utilisant une table imbriquée
• Il est également possible d’insérer de nouvelles valeurs dans la table imbriquée grâce au mot-clé
THE

• INSERT INTO THE ( SELECT employes FROM departements WHERE numdep = 1 ) VALUES (
t_employe (789, ‘Adem’, 20) ) ;

 ( SELECT … ) est la table imbriquée dans laquelle on insère l’élément


 employes est l’attribut qui représente la table imbriquée
 numdep = 1 est la condition du n-uplet dont on veut modifier la table
 t_employe (789, ‘Adem, 20) est l’élément à insérer dans la table imbriquée

Num_dep Budget Employes


1 10000004 t_employe (12345, ‘Cherfouh’, 25)

t_employe(2222, ‘Djawaher’, 28)

t_employe (789, ‘Adem’, 20)


2 1000000 Ø
5 1100000 null
Insertion dans une relation utilisant une table imbriquée
• Questions : Que se passe-t-il avec les requêtes suivantes ?

 INSERT INTO THE ( SELECT employes FROM departements WHERE numdep = 2 ) VALUES (
t_employe(5432, ‘ahlam’, 27) ) ;

Réponse -- on insère l’élément

 INSERT INTO THE ( SELECT employes FROM departements WHERE numdep = 5 ) VALUES (
t_employe(987, ‘Nassim’, 50) ) ;

Réponse-- ça ne marche pas car la table imbriquée n’existe pas


Insertion dans une table utilisant une table imbriquée
• La solution ?

On met à jour le n-uplet pour rendre l’insertion possible :

UPDATE departements SET employes = t_employes() WHERE numdep = 5 ;

Puis on exécute la requête d’insertion.

UPDATE departements SET employes = t_employes(t_employe(987, ‘Nassim’, 50)) WHERE


numdep = 5 ;
Navigation dans des tables imbriquées
Pour afficher des tables imbriquées, on utilise THE comme pour l’insertion

SELECT e.* FROM THE ( SELECT employes FROM departements WHERE numdep = 1 ) e ;

• -- on doit utiliser un alias de table (e)


• -- e.* les attributs du type t_employe
• -- ( SELECT … ) est une table imbriquée

Remarque : La requête de sélection doit retourner une seule table imbriquée.


Navigation dans des tables imbriquées

Pour afficher la table departemets avec ses employes

La jointure entre la table principale (departemets ) et sa table imbriquée (employes) est


implicitement réalisée, il ne faut pas la spécifier.

SELECT d. Num_dep, d. Budget, e.* FROM departements d, TABLE (d.employes) e


Navigation dans des tables imbriquées

Lorsque la table imbriquée est une table de type scalaire (et non une table d'objets d'un type
utilisateur), alors la colonne de cette table n'a pas de nom (puisque le type est scalaire la table n'a
qu'une colonne). Pour accéder à cette colonne, il faut utiliser une syntaxe dédiée :
COLUMN_VALUE.

R1 : SELECT p.nom, t.COLUMN_VALUE FROM Personne p, TABLE(p.ltelephonest) t;

R2 : SELECT p.nom, t.COLUMN_VALUE as Telephone FROM Personne p,


TABLE(p.ltelephonest) t;

Nom COLUMN_VALUE Nom Telephone


Ben mechdal 0666524247 Ben mechdal 0666524247
Ben mechdal 0555669669 Ben mechdal 0555669669
Djwaher 0663258548 Djwaher 0663258548
Krelifa 0794958475 Krelifa 0794958475

Résultat de R1 Résultat de R2
Modification et suppression dans des tables imbriquées
• Modification

UPDATE THE (SELECT employes FROM departements WHERE numdep = 1) nttab SET
nttab.nom=’Charfouh’ WHERE nttab.nom=’Cherfouh’ ;

• Suppression

DELETE THE (SELECT employes FROM departements WHERE numdep = 1) nttab WHERE
nttab.num=12345 ;

• La suppression d’une collection complète est possible:

UPDATE departements SET employes= NULL WHERE numdep = 1


Manipulation d’un tableau fixe
Insertion dans un VARRAY

Exemple : Table Oetudiants

Nom Prénom NTéléphones

Lakrib Ali 0794949494; 050505050; 99999999


Chibani Brahim 0794949494; 050505050

CREATE TYPE ttelephone AS VARRAY(3) OF varchar2(10);

CREATE TYPE t_etudiant AS OBJECT (


Nom VARCHAR2(10),
CREATE TABLE Oetudiants OF t_etudiant;
Prénom VARCHAR2(30),
NTéléphones ttelephone ) ;
Insertion dans un VARRAY

Pour insérer des donnes on utilise le constructeur de type avec autant d’éléments que l’on veut (en
respectant le nombre maximal d’éléments de VARRAY)

Insert into Oetudiants values ('Lakrib', 'Ali', ttelephone ('0794949494','050505050','99999999'));

Insert into Oetudiants values ('Chibani', 'Brahim', ttelephone ('0794949494','050505050'));

Insert into Oetudiants values ('Abaci', 'Mouna', ttelephone ());-- un VARRAY est créé mais vide

Insert into Oetudiants values ('Abaci', 'Mouna');-- aucun VARRAY n’est créé

Nom Prénom NTéléphones

Lakrib Ali 0794949494; 050505050; 99999999


Chibani Brahim 0794949494; 050505050
Abaci Mouna null
Naviguer dans dans un VARRAY
• Utiliser la requête suivante : SELECT * FROM Oetudiants

• Utiliser un programme PL/SQL en utilisant des fonctions et la notation tab(i) pour accéder au ième
élément du tableau
PL/SQL (Procedural Language for SQL) est un langage structuré par blocs qui permet aux
développeurs de combiner la puissance de SQL avec des instructions procédurales.

• Utiliser la clause table qui permet de désimbriquer la collection :

Select p.nom, t.column_value as NumTel from Oetudiants p, Table (p.NTéléphones) t;

Vous aimerez peut-être aussi