("

LABORATOIRE D’INFORMATIQUE DE
L’UNIVERSITE DE PAU ET DES PAYS
DE L’ADOUR

BDD Avancées
SQL3

Richard Chbeir, Ph.D.
Plan!

Encapsulation
des objets
Interrogation
des objets
Manipulation
des objets

Introduction"

10/12/13
Page 2

•  Fonctions et
procédures
Pourquoi ?

Employe
NumEmp

dept

salaire

ADR

…

…

…

…

…

…

…

…

Approche relationnelle

10/12/13
Page 3
Pourquoi ?

Employe
NumEmp

dept

salaire

ADR

…

…

…

…

…

…

…

…

Employe
NumEmp

dept

salaire

ADR
NOR UE

VILLE

CODE_POSTAL

…

…

…

…

…

10/12/13
Page 4

RUE

…

…

…

Approche avancée
Comment faire?

Définition d’un nouveau
Type Abstrait de Données ou TAD

10/12/13
Page 5
Introduction
•  TAD
–  Une structure de données partagée
–  Inclut des méthodes qui sont des procédures ou
des fonctions permettant de manipuler les objets ou
instances du type abstrait
–  Ne peut pas contenir de contraintes (NOT NULL,
CHECK, …)

10/12/13
Page 6
Introduction
•  Autres types de TAD
–  Large Object Bloc (LOB)
•  Binary LOB (BLOB) : stockage des données
binaires non structurées (4Go)
•  Character LOB (CLOB) : stockage de données
caractères (4Go)
•  Binary FILE (BFILE) : fichiers binaires localisés
à l extérieur de la BDD

10/12/13
Page 7
Introduction
•  Usage des TAD
–  Dans une table
–  Dans un attribut d’une table relationnelle
–  Etc.

10/12/13
Page 8
Introduction
•  Création d’un TAD
–  Syntaxe
SQL> CREATE OR REPLACE TYPE Nom_Type !
!
!AS OBJECT (!
!
!
!Nom_attribut1 !Type_Attribut,!
!
!
!Nom_attribut2 !Type_Attribut,!
!
!
!……..!
!
!
!Nom_attributn !Type_Attribut !
[final|not final]!
!
!
!)!
; /!

10/12/13
Page 9
Introduction
•  Création d’un TAD
–  Exemple
SQL> CREATE OR REPLACE TYPE adresse_type !
!AS OBJECT (!
!
!norue NUMBER, !
!
!rue VARCHAR(20), !
!
!ville VARCHAR2(30), !
!
!code_postal VARCHAR2(10)) !
/!

ADRESSE_TYPE
NORUE

10/12/13
Page 10

RUE

VILLE

CODE_POSTAL
Introduction
•  Création d’un TAD
–  Type utilisé par un attribut d’une table
relationnelle
•  Exemple
SQL> CREATE TABLE employe (!
!norue NUMBER PRIMARY KEY,!
!dept VARCHAR2(10),!
!sal NUMBER, !
!adr adresse_type);!

Employe
NumEmp

dept

sal

ADR
NOR UE

VILLE

CODE_POSTAL

…

…

…

…

…

10/12/13
Page 11

RUE

…

…

…

Une table contient un TAD est une table relationnelle-objet
Introduction
•  Manipulation des TAD
–  Insertion des tuples
•  Exemple (insérer les informations de l’employé
numéro 1 dans la table Employé)
SQL> INSERT INTO Employe(
1, 'Informatique', 2000,
adresse_type(98,'Faubourg Raines',’Lyon',’69000’)
)
;

10/12/13
Page 12
Introduction
•  Manipulation des TAD
–  Modification des tuples
•  Exemple (modifier le salaire et le numéro de la
rue de l’employé lyonnais qui porte le numéro 1)
SQL> UPDATE Employe e
SET e.sal= 200, e.adr.rue=’130'
WHERE e.adr.ville LIKE '%Ly%' and e.numero='1';

Utilisation d’alias obligatoire lors de la manipulation

10/12/13
Page 13
Introduction
•  Manipulation des TAD
–  Interrogation des tuples
•  Exemple (trouver tous les employés lyonnais)
SQL>

10/12/13
Page 14

SELECT e.numero
FROM employes e
WHERE e.adr.ville LIKE '%Ly%’;
Introduction
•  Manipulation des TAD
–  Suppression des tuples
•  Exemple (supprimer(le(tuple(de(l’employé(dont(
l’adresse(est(130(Ray(Lyon(6)
SQL>

10/12/13
Page 15

DELETE FROM employes e
WHERE e.adr = adresse_type(130,’Ray',’Lyon',’6’);
Donner&le&script&SQL&
perme1ant&de&créer&
ce1e&table&
rela6onnelle7objet?!
Numdep

Secrétaire

Budget
nemp

age

nom

D2

N1

28

Zidane

D3

325000

N2

26

Thuram

D4

10/12/13
Page 16

253000

125000

N5

26

Dessailly
Donner&le&script&SQL&
perme1ant&&
d’insérer&les&tuples&
suivants&?!

numdep

Secrétaires

budget
Nemp

D3

325000

D4

10/12/13
Page 17

125000

N1

28

Zidane

N2

26

Thuram

N3

30

Barthez

26

Dessailly

N6

24

Lizarazu

N7

253000

nom

N5

D2

age

32

Deschamps
Problème!lié!à!la!table!imbriquée!

numdep

Secrétaires

budget
Nemp

D3

325000

D3

10/12/13
Page 18

125000

N1

28

Zidane

N2

26

Thuram

N3

30

Barthez

26

Dessailly

N6

24

Lizarazu

N7

253000

nom

N5

D2

age

32

Deschamps
Introduction!
•  TAD!et!table!imbriquée!
–  Exemple!(créer!le!type!SecretaireOtype)!
SQL> CREATE OR REPLACE TYPE Secretaire-Type AS OBJECT!
!
!(!
!
!Nemp !VARCHAR2(3),!
!
!Age
!NUMBER,!
!
!Nom
!VARCHAR2(15))!
/!

Secretaire5type
Nemp

10/12/13
Page 19

age

nom
Introduction!
•  TAD!et!table!imbriquée!
–  Exemple!(créer!le!type!SecretaireSOtype)!
SQL> CREATE OR REPLACE TYPE Secretaire-Type AS OBJECT!
!
!(!
!
!Nemp !VARCHAR2(3),!
!
!Age
!NUMBER,!
!
!Nom
!VARCHAR2(15))!
/!

SQL> CREATE OR REPLACE TYPE SecretaireS_Type!
!AS TABLE OF Secretaire-Type !
/ !
SecretaireS_Type"
Nemp

10/12/13
Page 20

age

Nom
Introduction!
•  TAD!et!table!imbriquée!
–  Exemple!(créer(la(table(Département)!
SQL> CREATE TABLE Departement (
numdep VARCHAR2(5) PRIMARY KEY,
budget NUMBER,
secrétaires SecretaireS_Type )
NESTED TABLE secrétaires STORE AS tabsec;

numdep

Secrétaires

budget
Nemp

10/12/13
Page 21

D4

325000

125000

nom

N2

26

Thuram

N3

30

Barthez

N5

D3

age

26

Dessailly

N6

24

Lizarazu

N7

32

Deschamps
Introduction
•  Manipulation des TAD
–  Insertion des tuples dans une table
imbriquée
•  Exemple (insérer toutes les informations du
département D3)
SQL> INSERT INTO Departement VALUES (
‘D3’, 325000,
SecretaireS-Type(Secretaire-Type(‘N2’,26,’Thuram’),
Secretaire-Type(‘N3’,30,’Barthez’) ) )
;

numdep

Secrétaires

budget
Nemp

10/12/13
Page 22

D3

325000

age

nom

N2

26

Thuram

N3

30

Barthez
Introduction
•  Manipulation des TAD
–  Modification des tuples dans une table
imbriquée
•  Exemple (modifier l’âge de tous les secrétaires
du département D3 dont le nom commence par
la lettre B)
SQL> UPDATE THE
(SELECT e.Secrétaires FROM Departement e WHERE e.numdep=’D3') a
SET a.age = 38
WHERE a.nom LIKE ‘B%';

numdep

Secrétaires

budget
Nemp

10/12/13
Page 23

D3

325000

age

nom

N2

26

Thuram

N3

30

Barthez
Introduction
•  Manipulation des TAD
–  Interrogation des tuples dans une table
imbriquée
•  Exemple (trouver l'âge des secrétaires du
département D3)
SELECT la.age
FROM THE (SELECT e.Secrétaires FROM Departement e WHERE
e.numdep=’D3') la;
SQL>

numdep

Secrétaires

budget
Nemp

10/12/13
Page 24

D3

325000

age

nom

N2

26

Thuram

N3

30

Barthez
Introduction
•  Manipulation des TAD
–  Interrogation des tuples dans une table
imbriquée
•  Exemple (trouver les secrétaires de chaque
département)
SQL>

SELECT D.numdep, S.*
FROM Departement D, TABLE (D.Secrétaires) S;

numdep

Secrétaires

budget
Nemp

10/12/13
Page 25

D3

325000

age

nom

N2

26

Thuram

N3

30

Barthez
Introduction
•  Manipulation des TAD
–  Suppression des tuples dans une table
imbriquée
•  Exemple (supprimer les tuples des secrétaires
du département D3 ayant plus de 30 ans)
SQL> DELETE FROM the
(SELECT e.Secrétaires FROM Departement e WHERE
e.numero=’D3') li
WHERE li.age >= 30
;

numdep

Secrétaires

budget
Nemp

10/12/13
Page 26

D3

325000

age

nom

N2

26

Thuram

N3

30

Barthez
Donner&le&script&SQL&
perme1ant&&de&créer&
la&table&suivante&?!

Employe
NEmp

dept

Lieux
Interventions

ADR

sal
N°

VILLE

CODE_POSTAL

…

…

…

…

…

10/12/13
Page 27

RUE

…

…

…

Ville

Distance
Et si avait le schéma suivant ?

Véhicule

Employe
NumEmp

dept

salaire

ADR

N°Véhicule

Num

Type

Marque

Date

…

…

…

…

..

…

…

…

…

…

…

…

…

…

…

…

…

…

Contrat
NumEmp

Montant

…

…

…

10/12/13
Page 28

N°Int

…

Intervention Poss.
Date

N°

Ville

Distance

…

…

…

…

…

…

…

…

Approche relationnelle
Comment le transformer en …
Employe
NumEmp

dept

sal

@veh

ADR
NOR UE

Lieux Interventions

RUE

VILLE

CODE_POSTAL

…

…

…

…

…

…

…

Ville

…

Véhicule

Distance

Contrat

Num

Type

Marque

Date

N°Int

Montant

…

…

…

…

…

…

…

10/12/13
Page 29

@contrat

…

…

…

…

…

Approche objet-relationnelle

Date
Table objet-relationnelle
•  Définition
–  Une table est dite objet-relationnelle quand
elle dépend d un TAD
Les enregistrements d une table OR peuvent être considérés
comme des objets car ils possèdent tous un Object ID (OID)

10/12/13
Page 30
Table objet-relationnelle
•  Pseudo-colonnes
–  ROWID
•  Désigne une pseudo-colonne qui contient l adresse physique de chaque
enregistrement d une base de données Oracle

–  OID
•  Dans Oracle, chaque objet (table, type, objets des tables, …) a un
identificateur unique (OID) sur 16 positions

–  REF
•  Chaque objet, au sens Oracle du terme, possède un OID via une
pseudo-colonne de type REF. Chaque REF est composé d une partie
de l OID, des informations de la table objet-relationnelle et
éventuellement du ROWID.

10/12/13
Page 31
Table objet-relationnelle
•  Pour créer une table Objet-relationnelle
ayant une structure d un type
préalablement défini
SQL> CREATE TABLE Nom_table OF Nom_Type !
!
![(Contraintes_d_integrite)]!
;!

10/12/13
Page 32
Table objet-relationnelle
•  Création des types utilisés

SQL> CREATE OR REPLACE TYPE contrat_typ AS OBJECT!
!
!(no_int
!
!VARCHAR2 (8),!
!
!date_int
!DATE,!
!
!Montant
!
!NUMBER)!
/!

contrat_typ
No_int

10/12/13
Page 33

Date_int

Montant
Table objet-relationnelle
•  Création de la table

SQL> CREATE TABLE Contrats OF contrat_typ!
(CONSTRAINT PK_con PRIMARY KEY(no_int))!
;!

10/12/13
Page 34
Table objet-relationnelle
•  Création des types utilisés
SQL> CREATE OR REPLACE TYPE veh_typ AS OBJECT!
!
!(no_immat
!VARCHAR2 (8),!
!
!date_immat
!DATE,!
!
!type_v !VARCHAR2(7),!
!
!marque !VARCHAR2(15))!
/!

veh_typ
No_immat

10/12/13
Page 35

Date_immat

Type_v

marque
Table objet-relationnelle
•  Création de la table
SQL> CREATE TABLE Vehicules OF veh_typ!
(CONSTRAINT PK_veh PRIMARY KEY(no_immat))!
;!

10/12/13
Page 36
Table objet-relationnelle
•  Création des types utilisés
SQL> CREATE OR REPLACE TYPE adresse_type !
!AS OBJECT (!
!
!norue NUMBER, !
!
!rue VARCHAR(20), !
!
!ville VARCHAR2(30), !
!
!code_postal VARCHAR2(10)) !
/!
ADRESSE_TYPE
NORUE

10/12/13
Page 37

RUE

VILLE

CODE_POSTAL
Table objet-relationnelle
•  Création des types utilisés
–  Attention aux références/pointeurs
SQL> CREATE OR REPLACE TYPE Lieu_intervention AS OBJECT!
!
!(!
!
!ref_contrat
!REF contrat_typ,!
!
!Ville !
!VARCHAR2(15),!
!
!Distance
!NUMBER)!
/!

Lieu_intervention
ref_contrat

10/12/13
Page 38

Ville

Distance
Table objet-relationnelle
•  Création des types utilisés (à partir d’un
autre type)

SQL> CREATE OR REPLACE TYPE Lieux_intervention!
!AS TABLE OF lieu_intervention!
/ !

10/12/13
Page 39
Table objet-relationnelle
•  Création des types utilisés
SQL> CREATE OR REPLACE TYPE employe_type As OBJECT (!
!numero
!
!VARCHAR2(5),!
!nom
!
!VARCHAR2(15),!
!prenom
!
!VARCHAR2(15),!
!dept !
!VARCHAR2(20),!
!veh
!REF
!veh_typ,!
!ADR
!adresse_type,!
!lieux_interventions!lieux_intervention)!
/ !

10/12/13
Page 40
Table objet-relationnelle
•  Création de la table OR

SQL> CREATE TABLE Employes OF employe_type!
!(CONSTRAINT PK_employe PRIMARY KEY(numero))!
!NESTED TABLE lieux_interventions STORE AS tab_int!
;!

10/12/13
Page 41
Le script SQL OR
Employe
NumEmp

dept

sal

@veh

ADR
NOR UE

Lieux Interventions

RUE

VILLE

CODE_POSTAL

…

…

…

…

…

…

…

Ville

…

Véhicule

Distance

Contrat

Num

Type

Marque

Date

N°Int

Montant

…

…

…

…

…

…

…

10/12/13
Page 42

@contrat

…

…

…

…

…

Date
Le script SQL OR
SQL> CREATE OR REPLACE TYPE veh_typ AS OBJECT!
!(no_immat !VARCHAR2 (8),!
!date_immat !DATE,!
!type_v
!VARCHAR2(7),!
!marque
!VARCHAR2(15))!
/!
SQL> CREATE TABLE Vehicules OF veh_typ!
(CONSTRAINT PK_veh PRIMARY KEY(no_immat))!
;!

Véhicule
Num

Type

Marque

Date

…

…

…

…

…

…

…

…

SQL> CREATE OR REPLACE TYPE contrat_typ AS OBJECT!
!(no_int
!VARCHAR2 (8),!
!date_int
!DATE,!
!Montant
!NUMBER)!
/!
SQL> CREATE TABLE Contrats OF contrat_typ!
(CONSTRAINT PK_con PRIMARY KEY(no_int))!
;!

Contrat
N°Int
…

10/12/13
Page 43

Montant
…

…

…

Date
Le script SQL OR
Employe
NumEmp

dept

sal

@veh

ADR
NOR UE

Lieux Interventions

RUE

VILLE

CODE_POSTAL

…

…

…

…

…

…

…

…

CREATE or replace TYPE adresse_type
norue NUMBER,
rue VARCHAR(20),
ville VARCHAR2(30),

@contrat

/
CREATE OR REPLACE TYPE employe_type As OBJECT (
numero

AS OBJECT(

NUMBER)

REF

ADR

VARCHAR2(15),

Distance

VARCHAR2(20),

veh

ref_contrat REF contrat_typ,
Ville

VARCHAR2(15),

dept

CREATE OR REPLACE TYPE Lieu_intervention

VARCHAR2(15),

prenom

/

VARCHAR2(5),

nom

code_postal VARCHAR2(10))

10/12/13
Page 44

Distance

CREATE or REPLACE TYPE Lieux_intervention as Table of
lieu_intervention

AS OBJECT (

/

Ville

adresse_type,

lieux_interventions

veh_typ,
lieux_intervention)

/
CREATE TABLE Employes OF employe_type
(CONSTRAINT PK_employe PRIMARY KEY(numero))
NESTED TABLE lieux_interventions STORE AS tab_int;
A vous
•  Table!OR!
Departement
numdep

Secrétaires

budget
Nemp

D3

325000

D4

10/12/13
Page 45

125000

N1

28

Zidane

N2

26

Thuram

N3

30

Barthez

26

Dessailly

N6

24

Lizarazu

N7

253000

nom

N5

D2

age

32

Deschamps
Insertion des tuples
•  Dans une table OR avec un attribut
défini avec un TAD

SQL> INSERT INTO Nom_Table !
!
!VALUES ( V1, V2, ….., Nom_Type( !
!
!val1, val2, ….)
!
!
!); !

Constructeur

10/12/13
Page 46
Insertion des tuples
•  Dans une table OR avec un attribut
défini avec un TAD
–  Exemple
SQL> insert into contrats values('1','12/12/2006',500);
SQL> insert into contrats
values(
contrat_typ( 1','12/12/2006',500)
);

Contrat
N°Int
…

10/12/13
Page 47

Montant
…

…

…

Date
Insertion des tuples
•  Dans une table OR avec un attribut
défini avec un TAD
–  Exemple
SQL> insert into vehicules
values(
veh_typ( 2', BMW , X5 ,'12/12/2006')
);

Véhicule
Num

Marque

Date

…

…

…

…

…

10/12/13
Page 48

Type

…

…

…
Insertion des tuples
•  Dans une table OR contenant un
pointeur
Employe
NumEmp

dept

sal

@veh

SQL> INSERT INTO Employes

…

select 1,'Informatique', 2000, ref(a)
from vehicules a where a.no_immat='2'

…

;

Véhicule
Num

Marque

Date

…

…

…

…

…

10/12/13
Page 49

Type

…

…

…
Insertion des tuples
•  Dans une table OR contenant une table
imbriquée
–  Syntaxe
-- Initialisation de la table imbriquée à vide
!
SQL> INSERT INTO Nom_Table
VALUES ( V1, V2, ….., Ens_Nom_Type() );
-- Avec insertion de n-uplets dans la table imbriquée

10/12/13
Page 50

SQL> INSERT INTO Nom_Table
VALUES ( V1, V2, ….., Ens_Nom_Type(
Nom_type1 ( …….),
Nom_type1 ( …….),
Nom_type1 ( …….)
) );
Insertion des tuples
•  Dans une table OR contenant une table
imbriquée
–  Exemple
SQL> INSERT INTO Employes
select 1, ’Simone', ’Dijon','Informatique', ref(a),
adresse_type(98,'Faubourg Raines','Dijon','21000'),
Lieux_Intervention()
from vehicules a where a.no_immat='2'
;

10/12/13
Page 51
Insertion des tuples
•  Dans une table OR contenant une table
imbriquée
–  Exemple
SQL> INSERT INTO Employes
select 1, ’Simone', ’Dijon','Informatique', ref(a),
adresse_type(98,'Faubourg Raines','Dijon','21000'),
Lieux_Intervention()
SQL> INSERT vehicules a where a.no_immat='2'
from INTO Employes
select 2, ’Marqua', ’Xtophe','Informatique', ref(a),
adresse_type(98,'Faubourg Raines','Dijon','21000'),
;
Lieux_Intervention(Lieu_intervention(null,'Dijon',500))
from vehicules a where a.no_immat='2'
;

10/12/13
Page 52
Insertion des tuples
•  Dans une table imbriquée contenant un
pointeur
–  Syntaxe
SQL> INSERT INTO
THE (SELECT t.Tab_Imb
FROM Nom_table t
WHERE t.Attr_i = Valeur)
SELECT V1, V2, ,REF(n)FROM Table_R n
WHERE n.Attr_j = Valeur ;

10/12/13
Page 53
Insertion des tuples
•  Dans une table imbriquée contenant un
pointeur
–  Exemple nécessitant l’insertion dans la
table principale
SQL> INSERT INTO Employes
select 3, ’Xavier', ’Dupont','Informatique', ref(a),
adresse_type(98,'Faubourg Raines','Dijon','21000'),
Lieux_Intervention(Lieu_intervention(null,'Dijon',500),
Lieu_intervention(ref(v),'Lyon',600) )
from vehicules a, contrats v where v.no_int='2' and a.no_immat='2'
;

10/12/13
Page 54
Insertion des tuples
•  Dans une table imbriquée contenant un
pointeur
–  Exemple ne nécessitant pas l’insertion dans
la table principale
SQL> INSERT INTO
the (select e.Lieux_interventions from Employes e where
e.numero='3')
select ref(v), Paris',800 from contrats v where v.no_int='1'
;

10/12/13
Page 55
Mise à jour des tuples
•  Dans une table principale
–  Syntaxe
SQL> UPDATE Nom_de_table Alias
SET
Alias.Nom_Attribut1 = expression1
Alias.Nom_Attribut2 = expression2
…….
[WHERE Condition ] ;

10/12/13
Page 56
Mise à jour des tuples
•  Dans une table principale
–  Exemple

SQL> UPDATE Employes e
SET e.Nom='Nicolle', e.Prenom='Christophe'
WHERE e.adr.ville LIKE '%Dijon%' and e.numero='1';

10/12/13
Page 57
Mise à jour des tuples
•  Dans une table imbriquée
–  Syntaxe
SQL>

10/12/13
Page 58

UPDATE THE
(SELECT Nom_Alias1.Table_imbriquée
FROM Table Nom_Alias1
WHERE Condition ) Nom_alias2
SET Nom_alias2.Attribut = expression
WHERE Condition ;
Mise à jour des tuples
•  Dans une table imbriquée
–  Exemple
•  Modifier la distance d intervention à 8888 de
l employé 1 dans la ville de Dijon
SQL> UPDATE THE
(SELECT e.lieux_interventions FROM Employes e WHERE e.numero='1') a
SET a.distance = 8888
WHERE a.ville LIKE '%Dijon%';

10/12/13
Page 59
Mise à jour des tuples
•  Dans une table imbriquée
–  Exemple
•  Pour l’employé 2, changer son intervention
associée à la ville de Dijon, la nouvelle référence
ayant pour numéro T1234
SQL> UPDATE THE (
SELECT e.lieux_interventions FROM Employes e WHERE e.numero='2') a
SET a.ref_contrat =
(select ref(v) from contrats v where v.No_int ='T1234')
WHERE a.ville LIKE '%Dijon%
;

10/12/13
Page 60
Suppression des tuples
•  Syntaxe générale

SQL>

10/12/13
Page 61

DELETE FROM Nom_table Alias
WHERE Alias.Nom_attribut = Expression ;
Suppression des tuples
•  Condition de suppression portant sur
une table imbriquée
–  Exemple
•  Supprimer les employés qui ont eu des
interventions à Lyon
SQL> DELETE FROM Employes e
WHERE EXISTS(select * from the
(SELECT a.lieux_interventions FROM employes a WHERE
a.numero=e.numero) li
WHERE li.ville = Lyon')
;

10/12/13
Page 62
Suppression des tuples
•  Condition de suppression portant sur les
n-uplets d’une table imbriquée
–  Exemple
•  Supprimer les interventions de l’employé 2 qui
se sont déroulées à Lyon
SQL> DELETE FROM the
(SELECT e.lieux_interventions FROM employes e WHERE
e.numero='2') li
WHERE li.ville LIKE '%Lyon%
;

10/12/13
Page 63
Departement
Donner&le&script&SQL&perme1ant&&
d’insérer&le&tuple&D3,&de&rajouter&
le&secrétaire&N4&à&D3,&et&de&
supprimer&N2?!

numdep

Secrétaires

budget
Nemp

D4

10/12/13
Page 64

325000

125000

N1

28

Zidane

N2

26

Thuram

N3

30

Barthez

26

Dessailly

N6

24

Lizarazu

N7

D3

253000

nom

N5

D2

age

32

Deschamps
Interrogation des tuples
•  Syntaxe générale
SQL>

SELECT

t.Nom_attr1, t.Nom_ attr2, , ….

FROM Table t;

Utilisation d'un alias obligatoire pour les attributs structurés

10/12/13
Page 65
Interrogation des tuples
•  Exemple
–  Donnez le numéro, le nom et le prénom des
employés qui ont un véhicule mis en
circulation après le 01/06/2006

SQL>

10/12/13
Page 66

SELECT e.numero, e.nom, e.prenom
FROM employes e
WHERE e.VEH.date_immat>='01/12/2006';
Interrogation des tuples
•  Exemple
–  Donnez le nom des villes où intervient
l’employé numéro 2

SELECT la.ville
FROM THE (SELECT e.lieux_interventions FROM employes e
WHERE e.numero='2') la;
SQL>

10/12/13
Page 67
Interrogation des tuples
•  Exemple
–  Donnez le nom des villes où intervient tous
les employés
SQL>

10/12/13
Page 68

SELECT la.ville
FROM employes e, TABLE(e.lieux_interventions) la;
Interrogation des tuples
•  Exemple
–  Donnez les numéros et les montants des
contrats de l’employé numéro 1
SQL>

10/12/13
Page 69

SELECT le.ref_contrat.no_int, le.ref_contrat.montant FROM
THE(SELECT e.lieux_interventions FROM employes e WHERE
e.numero='1') le;
Interrogation des tuples
•  Exemple
–  Afficher les informations relatives aux
contrats de l’employé numéro « 1 »
SQL>

SELECT (Li.ref_contrat)
FROM THE (SELECT Emp.lieux_interventions
FROM Employes Emp
WHERE Emp.numero = '1') Li;

000022020876B2245DBE325C5FE03400400B40DCB176B2245DBE305C5FE034
00400B40DCB1

SQL>

10/12/13
Page 70

SELECT DEREF (Li.ref_contrat)
FROM THE (SELECT Emp.lieux_interventions
FROM Employes Emp
WHERE Emp.numero = '1') Li;
Interrogation des tuples
•  Utilisation des fonctions d agrégats
(COUNT, SUM, AVG, MAX, MIN)
–  Syntaxe
SQL>

10/12/13
Page 71

SELECT Nom_de_fonction ( paramètres )!
!FROM Nom_de_relation!
![WHERE condition1]!
![GROUP BY condition2 [HAVING condition3]]!
Interrogation des tuples
•  Utilisation des fonctions d agrégats
(COUNT, SUM, AVG, MAX, MIN)
–  Exemple
•  Afficher le nombre des employés qui habitent
Dijon
SQL>

10/12/13
Page 72

SELECT count(*)
FROM Employes Emp
WHERE emp.adr.ville = 'Dijon';
Interrogation des tuples
•  Utilisation des fonctions d agrégats
(COUNT, SUM, AVG, MAX, MIN) sur
une table imbriquée
–  Syntaxe
SQL> SELECT Nom_de_fonction ( paramètres )
FROM THE (SELECT alias.tab_imb
FROM Table
alias
WHERE alias.nom_attribut = valeur );

10/12/13
Page 73
Interrogation des tuples
•  Utilisation des fonctions d agrégats
(COUNT, SUM, AVG, MAX, MIN) sur
une table imbriquée
–  Exemple
•  Donnez le nombre de contrats de l’employé
numéro 1
SQL> SELECT count (*)
FROM THE (SELECT e.lieux_interventions
FROM Employes e
WHERE e.numero = 1);

10/12/13
Page 74
Interrogation des tuples
•  Utilisation des fonctions d agrégats
(COUNT, SUM, AVG, MAX, MIN) sur
une table imbriquée
–  Exemple
•  Donnez le nombre de contrats dans la ville de
Dijon pour l’employé numéro « 1 »
SQL> SELECT count (*)
FROM THE (SELECT e.lieux_interventions
FROM Employes e
WHERE e.numero = 1) li
where li.ville='Dijon';

10/12/13
Page 75
Interrogation des tuples
•  Utilisation des curseurs
–  Syntaxe
SQL> SELECT alias. att, CURSOR ( SELECT ti.att2, ti.att2
FROM TABLE (Tab_Imb) ti)
FROM table

alias

WHERE condition;

10/12/13
Page 76
Interrogation des tuples
•  Utilisation des curseurs
–  Exemple
•  Donnez les employés (nom et prénom) et les
villes respectives
SQL> SELECT Emp.numero, Emp.nom, Emp.prenom,
CURSOR (SELECT Li.ville
FROM TABLE(lieux_interventions) Li)
FROM employes Emp;

10/12/13
Page 77
Interrogation des tuples
•  Utilisation des curseurs
–  Exemple
•  Donnez les employés (nom et prénom) et les
contrats respectifs
SQL> SELECT e.numero, e.nom, e.prenom,
CURSOR (SELECT CURSOR (SELECT * FROM contrats p)
FROM TABLE(e.lieux_interventions) d)
FROM Employes e;

10/12/13
Page 78
Heritage
•  Pour utiliser des sous-types dans SQL3,
il faut définir des types non finaux
–  Exemple
SQL> CREATE or replace TYPE etudiant_type AS OBJECT
(no_insee VARCHAR2(13), age NUMBER, nom VARCHAR2(30))
not final;
/
CREATE or replace TYPE etudiant_IUT UNDER etudiant_type
(date_inscription DATE, situa_fam CHAR(1), annee varchar2(4))
final;/

10/12/13
Page 79
Heritage
•  Pour utiliser des sous-types dans SQL3,
il faut définir des types non finaux
–  Exemple
SQL> CREATE TABLE etudiants_IUT of etudiant_IUT
;

10/12/13
Page 80
Heritage
•  Insertion
–  Exemple
SQL> INSERT INTO etudiants_IUT VALUES
('12345555',22,'Almamy','12/12/2005','1','IQ2');

10/12/13
Page 81
Méthodes
• 

Vous pouvez associer à chaque type
un ensemble de méthodes ou fonctions
–  Deux étapes sont à suivre
1.  Lors de déclaration de la fonction (Create ou ALTER)
SQL> CREATE OR REPLACE TYPE Nom_Type !
!
!AS OBJECT (!
!
!
!Nom_attribut1 !Type_Attribut,!
!
!
!Nom_attribut2 !Type_Attribut,!
!
!
!……..!
!
!
!Nom_attributn !Type_Attribut !
[final|not final]!
MEMBER FUNCTION nom_fonction1 RETURN type_données!
MEMBER FUNCTION nom_fonction2 RETURN type_données!
);!
/!

10/12/13
Page 82
Méthodes
• 

Vous pouvez associer à chaque type
un ensemble de méthodes ou fonctions
–  Deux étapes sont à suivre
2.  Spécification du corps de la fonction
SQL> CREATE TYPE BODY Nom_Type AS
MEMBER FUNCTION nom_fonction1() IS
BEGIN
END nom_fonction1() ;
MEMBER FUNCTION nom_fonction2() IS
BEGIN
END nom_fonction2() ;
…
END;
/

10/12/13
Page 83
Conclusions!

10/12/13
Page 84

Sql3

  • 1.
    (" LABORATOIRE D’INFORMATIQUE DE L’UNIVERSITEDE PAU ET DES PAYS DE L’ADOUR BDD Avancées SQL3 Richard Chbeir, Ph.D.
  • 2.
    Plan! Encapsulation des objets Interrogation des objets Manipulation desobjets Introduction" 10/12/13 Page 2 •  Fonctions et procédures
  • 3.
  • 4.
  • 5.
    Comment faire? Définition d’unnouveau Type Abstrait de Données ou TAD 10/12/13 Page 5
  • 6.
    Introduction •  TAD –  Unestructure de données partagée –  Inclut des méthodes qui sont des procédures ou des fonctions permettant de manipuler les objets ou instances du type abstrait –  Ne peut pas contenir de contraintes (NOT NULL, CHECK, …) 10/12/13 Page 6
  • 7.
    Introduction •  Autres typesde TAD –  Large Object Bloc (LOB) •  Binary LOB (BLOB) : stockage des données binaires non structurées (4Go) •  Character LOB (CLOB) : stockage de données caractères (4Go) •  Binary FILE (BFILE) : fichiers binaires localisés à l extérieur de la BDD 10/12/13 Page 7
  • 8.
    Introduction •  Usage desTAD –  Dans une table –  Dans un attribut d’une table relationnelle –  Etc. 10/12/13 Page 8
  • 9.
    Introduction •  Création d’unTAD –  Syntaxe SQL> CREATE OR REPLACE TYPE Nom_Type ! ! !AS OBJECT (! ! ! !Nom_attribut1 !Type_Attribut,! ! ! !Nom_attribut2 !Type_Attribut,! ! ! !……..! ! ! !Nom_attributn !Type_Attribut ! [final|not final]! ! ! !)! ; /! 10/12/13 Page 9
  • 10.
    Introduction •  Création d’unTAD –  Exemple SQL> CREATE OR REPLACE TYPE adresse_type ! !AS OBJECT (! ! !norue NUMBER, ! ! !rue VARCHAR(20), ! ! !ville VARCHAR2(30), ! ! !code_postal VARCHAR2(10)) ! /! ADRESSE_TYPE NORUE 10/12/13 Page 10 RUE VILLE CODE_POSTAL
  • 11.
    Introduction •  Création d’unTAD –  Type utilisé par un attribut d’une table relationnelle •  Exemple SQL> CREATE TABLE employe (! !norue NUMBER PRIMARY KEY,! !dept VARCHAR2(10),! !sal NUMBER, ! !adr adresse_type);! Employe NumEmp dept sal ADR NOR UE VILLE CODE_POSTAL … … … … … 10/12/13 Page 11 RUE … … … Une table contient un TAD est une table relationnelle-objet
  • 12.
    Introduction •  Manipulation desTAD –  Insertion des tuples •  Exemple (insérer les informations de l’employé numéro 1 dans la table Employé) SQL> INSERT INTO Employe( 1, 'Informatique', 2000, adresse_type(98,'Faubourg Raines',’Lyon',’69000’) ) ; 10/12/13 Page 12
  • 13.
    Introduction •  Manipulation desTAD –  Modification des tuples •  Exemple (modifier le salaire et le numéro de la rue de l’employé lyonnais qui porte le numéro 1) SQL> UPDATE Employe e SET e.sal= 200, e.adr.rue=’130' WHERE e.adr.ville LIKE '%Ly%' and e.numero='1'; Utilisation d’alias obligatoire lors de la manipulation 10/12/13 Page 13
  • 14.
    Introduction •  Manipulation desTAD –  Interrogation des tuples •  Exemple (trouver tous les employés lyonnais) SQL> 10/12/13 Page 14 SELECT e.numero FROM employes e WHERE e.adr.ville LIKE '%Ly%’;
  • 15.
    Introduction •  Manipulation desTAD –  Suppression des tuples •  Exemple (supprimer(le(tuple(de(l’employé(dont( l’adresse(est(130(Ray(Lyon(6) SQL> 10/12/13 Page 15 DELETE FROM employes e WHERE e.adr = adresse_type(130,’Ray',’Lyon',’6’);
  • 16.
  • 17.
  • 18.
  • 19.
    Introduction! •  TAD!et!table!imbriquée! –  Exemple!(créer!le!type!SecretaireOtype)! SQL>CREATE OR REPLACE TYPE Secretaire-Type AS OBJECT! ! !(! ! !Nemp !VARCHAR2(3),! ! !Age !NUMBER,! ! !Nom !VARCHAR2(15))! /! Secretaire5type Nemp 10/12/13 Page 19 age nom
  • 20.
    Introduction! •  TAD!et!table!imbriquée! –  Exemple!(créer!le!type!SecretaireSOtype)! SQL>CREATE OR REPLACE TYPE Secretaire-Type AS OBJECT! ! !(! ! !Nemp !VARCHAR2(3),! ! !Age !NUMBER,! ! !Nom !VARCHAR2(15))! /! SQL> CREATE OR REPLACE TYPE SecretaireS_Type! !AS TABLE OF Secretaire-Type ! / ! SecretaireS_Type" Nemp 10/12/13 Page 20 age Nom
  • 21.
    Introduction! •  TAD!et!table!imbriquée! –  Exemple!(créer(la(table(Département)! SQL>CREATE TABLE Departement ( numdep VARCHAR2(5) PRIMARY KEY, budget NUMBER, secrétaires SecretaireS_Type ) NESTED TABLE secrétaires STORE AS tabsec; numdep Secrétaires budget Nemp 10/12/13 Page 21 D4 325000 125000 nom N2 26 Thuram N3 30 Barthez N5 D3 age 26 Dessailly N6 24 Lizarazu N7 32 Deschamps
  • 22.
    Introduction •  Manipulation desTAD –  Insertion des tuples dans une table imbriquée •  Exemple (insérer toutes les informations du département D3) SQL> INSERT INTO Departement VALUES ( ‘D3’, 325000, SecretaireS-Type(Secretaire-Type(‘N2’,26,’Thuram’), Secretaire-Type(‘N3’,30,’Barthez’) ) ) ; numdep Secrétaires budget Nemp 10/12/13 Page 22 D3 325000 age nom N2 26 Thuram N3 30 Barthez
  • 23.
    Introduction •  Manipulation desTAD –  Modification des tuples dans une table imbriquée •  Exemple (modifier l’âge de tous les secrétaires du département D3 dont le nom commence par la lettre B) SQL> UPDATE THE (SELECT e.Secrétaires FROM Departement e WHERE e.numdep=’D3') a SET a.age = 38 WHERE a.nom LIKE ‘B%'; numdep Secrétaires budget Nemp 10/12/13 Page 23 D3 325000 age nom N2 26 Thuram N3 30 Barthez
  • 24.
    Introduction •  Manipulation desTAD –  Interrogation des tuples dans une table imbriquée •  Exemple (trouver l'âge des secrétaires du département D3) SELECT la.age FROM THE (SELECT e.Secrétaires FROM Departement e WHERE e.numdep=’D3') la; SQL> numdep Secrétaires budget Nemp 10/12/13 Page 24 D3 325000 age nom N2 26 Thuram N3 30 Barthez
  • 25.
    Introduction •  Manipulation desTAD –  Interrogation des tuples dans une table imbriquée •  Exemple (trouver les secrétaires de chaque département) SQL> SELECT D.numdep, S.* FROM Departement D, TABLE (D.Secrétaires) S; numdep Secrétaires budget Nemp 10/12/13 Page 25 D3 325000 age nom N2 26 Thuram N3 30 Barthez
  • 26.
    Introduction •  Manipulation desTAD –  Suppression des tuples dans une table imbriquée •  Exemple (supprimer les tuples des secrétaires du département D3 ayant plus de 30 ans) SQL> DELETE FROM the (SELECT e.Secrétaires FROM Departement e WHERE e.numero=’D3') li WHERE li.age >= 30 ; numdep Secrétaires budget Nemp 10/12/13 Page 26 D3 325000 age nom N2 26 Thuram N3 30 Barthez
  • 27.
  • 28.
    Et si avaitle schéma suivant ? Véhicule Employe NumEmp dept salaire ADR N°Véhicule Num Type Marque Date … … … … .. … … … … … … … … … … … … … Contrat NumEmp Montant … … … 10/12/13 Page 28 N°Int … Intervention Poss. Date N° Ville Distance … … … … … … … … Approche relationnelle
  • 29.
    Comment le transformeren … Employe NumEmp dept sal @veh ADR NOR UE Lieux Interventions RUE VILLE CODE_POSTAL … … … … … … … Ville … Véhicule Distance Contrat Num Type Marque Date N°Int Montant … … … … … … … 10/12/13 Page 29 @contrat … … … … … Approche objet-relationnelle Date
  • 30.
    Table objet-relationnelle •  Définition – Une table est dite objet-relationnelle quand elle dépend d un TAD Les enregistrements d une table OR peuvent être considérés comme des objets car ils possèdent tous un Object ID (OID) 10/12/13 Page 30
  • 31.
    Table objet-relationnelle •  Pseudo-colonnes – ROWID •  Désigne une pseudo-colonne qui contient l adresse physique de chaque enregistrement d une base de données Oracle –  OID •  Dans Oracle, chaque objet (table, type, objets des tables, …) a un identificateur unique (OID) sur 16 positions –  REF •  Chaque objet, au sens Oracle du terme, possède un OID via une pseudo-colonne de type REF. Chaque REF est composé d une partie de l OID, des informations de la table objet-relationnelle et éventuellement du ROWID. 10/12/13 Page 31
  • 32.
    Table objet-relationnelle •  Pourcréer une table Objet-relationnelle ayant une structure d un type préalablement défini SQL> CREATE TABLE Nom_table OF Nom_Type ! ! ![(Contraintes_d_integrite)]! ;! 10/12/13 Page 32
  • 33.
    Table objet-relationnelle •  Créationdes types utilisés SQL> CREATE OR REPLACE TYPE contrat_typ AS OBJECT! ! !(no_int ! !VARCHAR2 (8),! ! !date_int !DATE,! ! !Montant ! !NUMBER)! /! contrat_typ No_int 10/12/13 Page 33 Date_int Montant
  • 34.
    Table objet-relationnelle •  Créationde la table SQL> CREATE TABLE Contrats OF contrat_typ! (CONSTRAINT PK_con PRIMARY KEY(no_int))! ;! 10/12/13 Page 34
  • 35.
    Table objet-relationnelle •  Créationdes types utilisés SQL> CREATE OR REPLACE TYPE veh_typ AS OBJECT! ! !(no_immat !VARCHAR2 (8),! ! !date_immat !DATE,! ! !type_v !VARCHAR2(7),! ! !marque !VARCHAR2(15))! /! veh_typ No_immat 10/12/13 Page 35 Date_immat Type_v marque
  • 36.
    Table objet-relationnelle •  Créationde la table SQL> CREATE TABLE Vehicules OF veh_typ! (CONSTRAINT PK_veh PRIMARY KEY(no_immat))! ;! 10/12/13 Page 36
  • 37.
    Table objet-relationnelle •  Créationdes types utilisés SQL> CREATE OR REPLACE TYPE adresse_type ! !AS OBJECT (! ! !norue NUMBER, ! ! !rue VARCHAR(20), ! ! !ville VARCHAR2(30), ! ! !code_postal VARCHAR2(10)) ! /! ADRESSE_TYPE NORUE 10/12/13 Page 37 RUE VILLE CODE_POSTAL
  • 38.
    Table objet-relationnelle •  Créationdes types utilisés –  Attention aux références/pointeurs SQL> CREATE OR REPLACE TYPE Lieu_intervention AS OBJECT! ! !(! ! !ref_contrat !REF contrat_typ,! ! !Ville ! !VARCHAR2(15),! ! !Distance !NUMBER)! /! Lieu_intervention ref_contrat 10/12/13 Page 38 Ville Distance
  • 39.
    Table objet-relationnelle •  Créationdes types utilisés (à partir d’un autre type) SQL> CREATE OR REPLACE TYPE Lieux_intervention! !AS TABLE OF lieu_intervention! / ! 10/12/13 Page 39
  • 40.
    Table objet-relationnelle •  Créationdes types utilisés SQL> CREATE OR REPLACE TYPE employe_type As OBJECT (! !numero ! !VARCHAR2(5),! !nom ! !VARCHAR2(15),! !prenom ! !VARCHAR2(15),! !dept ! !VARCHAR2(20),! !veh !REF !veh_typ,! !ADR !adresse_type,! !lieux_interventions!lieux_intervention)! / ! 10/12/13 Page 40
  • 41.
    Table objet-relationnelle •  Créationde la table OR SQL> CREATE TABLE Employes OF employe_type! !(CONSTRAINT PK_employe PRIMARY KEY(numero))! !NESTED TABLE lieux_interventions STORE AS tab_int! ;! 10/12/13 Page 41
  • 42.
    Le script SQLOR Employe NumEmp dept sal @veh ADR NOR UE Lieux Interventions RUE VILLE CODE_POSTAL … … … … … … … Ville … Véhicule Distance Contrat Num Type Marque Date N°Int Montant … … … … … … … 10/12/13 Page 42 @contrat … … … … … Date
  • 43.
    Le script SQLOR SQL> CREATE OR REPLACE TYPE veh_typ AS OBJECT! !(no_immat !VARCHAR2 (8),! !date_immat !DATE,! !type_v !VARCHAR2(7),! !marque !VARCHAR2(15))! /! SQL> CREATE TABLE Vehicules OF veh_typ! (CONSTRAINT PK_veh PRIMARY KEY(no_immat))! ;! Véhicule Num Type Marque Date … … … … … … … … SQL> CREATE OR REPLACE TYPE contrat_typ AS OBJECT! !(no_int !VARCHAR2 (8),! !date_int !DATE,! !Montant !NUMBER)! /! SQL> CREATE TABLE Contrats OF contrat_typ! (CONSTRAINT PK_con PRIMARY KEY(no_int))! ;! Contrat N°Int … 10/12/13 Page 43 Montant … … … Date
  • 44.
    Le script SQLOR Employe NumEmp dept sal @veh ADR NOR UE Lieux Interventions RUE VILLE CODE_POSTAL … … … … … … … … CREATE or replace TYPE adresse_type norue NUMBER, rue VARCHAR(20), ville VARCHAR2(30), @contrat / CREATE OR REPLACE TYPE employe_type As OBJECT ( numero AS OBJECT( NUMBER) REF ADR VARCHAR2(15), Distance VARCHAR2(20), veh ref_contrat REF contrat_typ, Ville VARCHAR2(15), dept CREATE OR REPLACE TYPE Lieu_intervention VARCHAR2(15), prenom / VARCHAR2(5), nom code_postal VARCHAR2(10)) 10/12/13 Page 44 Distance CREATE or REPLACE TYPE Lieux_intervention as Table of lieu_intervention AS OBJECT ( / Ville adresse_type, lieux_interventions veh_typ, lieux_intervention) / CREATE TABLE Employes OF employe_type (CONSTRAINT PK_employe PRIMARY KEY(numero)) NESTED TABLE lieux_interventions STORE AS tab_int;
  • 45.
    A vous •  Table!OR! Departement numdep Secrétaires budget Nemp D3 325000 D4 10/12/13 Page45 125000 N1 28 Zidane N2 26 Thuram N3 30 Barthez 26 Dessailly N6 24 Lizarazu N7 253000 nom N5 D2 age 32 Deschamps
  • 46.
    Insertion des tuples • Dans une table OR avec un attribut défini avec un TAD SQL> INSERT INTO Nom_Table ! ! !VALUES ( V1, V2, ….., Nom_Type( ! ! !val1, val2, ….) ! ! !); ! Constructeur 10/12/13 Page 46
  • 47.
    Insertion des tuples • Dans une table OR avec un attribut défini avec un TAD –  Exemple SQL> insert into contrats values('1','12/12/2006',500); SQL> insert into contrats values( contrat_typ( 1','12/12/2006',500) ); Contrat N°Int … 10/12/13 Page 47 Montant … … … Date
  • 48.
    Insertion des tuples • Dans une table OR avec un attribut défini avec un TAD –  Exemple SQL> insert into vehicules values( veh_typ( 2', BMW , X5 ,'12/12/2006') ); Véhicule Num Marque Date … … … … … 10/12/13 Page 48 Type … … …
  • 49.
    Insertion des tuples • Dans une table OR contenant un pointeur Employe NumEmp dept sal @veh SQL> INSERT INTO Employes … select 1,'Informatique', 2000, ref(a) from vehicules a where a.no_immat='2' … ; Véhicule Num Marque Date … … … … … 10/12/13 Page 49 Type … … …
  • 50.
    Insertion des tuples • Dans une table OR contenant une table imbriquée –  Syntaxe -- Initialisation de la table imbriquée à vide ! SQL> INSERT INTO Nom_Table VALUES ( V1, V2, ….., Ens_Nom_Type() ); -- Avec insertion de n-uplets dans la table imbriquée 10/12/13 Page 50 SQL> INSERT INTO Nom_Table VALUES ( V1, V2, ….., Ens_Nom_Type( Nom_type1 ( …….), Nom_type1 ( …….), Nom_type1 ( …….) ) );
  • 51.
    Insertion des tuples • Dans une table OR contenant une table imbriquée –  Exemple SQL> INSERT INTO Employes select 1, ’Simone', ’Dijon','Informatique', ref(a), adresse_type(98,'Faubourg Raines','Dijon','21000'), Lieux_Intervention() from vehicules a where a.no_immat='2' ; 10/12/13 Page 51
  • 52.
    Insertion des tuples • Dans une table OR contenant une table imbriquée –  Exemple SQL> INSERT INTO Employes select 1, ’Simone', ’Dijon','Informatique', ref(a), adresse_type(98,'Faubourg Raines','Dijon','21000'), Lieux_Intervention() SQL> INSERT vehicules a where a.no_immat='2' from INTO Employes select 2, ’Marqua', ’Xtophe','Informatique', ref(a), adresse_type(98,'Faubourg Raines','Dijon','21000'), ; Lieux_Intervention(Lieu_intervention(null,'Dijon',500)) from vehicules a where a.no_immat='2' ; 10/12/13 Page 52
  • 53.
    Insertion des tuples • Dans une table imbriquée contenant un pointeur –  Syntaxe SQL> INSERT INTO THE (SELECT t.Tab_Imb FROM Nom_table t WHERE t.Attr_i = Valeur) SELECT V1, V2, ,REF(n)FROM Table_R n WHERE n.Attr_j = Valeur ; 10/12/13 Page 53
  • 54.
    Insertion des tuples • Dans une table imbriquée contenant un pointeur –  Exemple nécessitant l’insertion dans la table principale SQL> INSERT INTO Employes select 3, ’Xavier', ’Dupont','Informatique', ref(a), adresse_type(98,'Faubourg Raines','Dijon','21000'), Lieux_Intervention(Lieu_intervention(null,'Dijon',500), Lieu_intervention(ref(v),'Lyon',600) ) from vehicules a, contrats v where v.no_int='2' and a.no_immat='2' ; 10/12/13 Page 54
  • 55.
    Insertion des tuples • Dans une table imbriquée contenant un pointeur –  Exemple ne nécessitant pas l’insertion dans la table principale SQL> INSERT INTO the (select e.Lieux_interventions from Employes e where e.numero='3') select ref(v), Paris',800 from contrats v where v.no_int='1' ; 10/12/13 Page 55
  • 56.
    Mise à jourdes tuples •  Dans une table principale –  Syntaxe SQL> UPDATE Nom_de_table Alias SET Alias.Nom_Attribut1 = expression1 Alias.Nom_Attribut2 = expression2 ……. [WHERE Condition ] ; 10/12/13 Page 56
  • 57.
    Mise à jourdes tuples •  Dans une table principale –  Exemple SQL> UPDATE Employes e SET e.Nom='Nicolle', e.Prenom='Christophe' WHERE e.adr.ville LIKE '%Dijon%' and e.numero='1'; 10/12/13 Page 57
  • 58.
    Mise à jourdes tuples •  Dans une table imbriquée –  Syntaxe SQL> 10/12/13 Page 58 UPDATE THE (SELECT Nom_Alias1.Table_imbriquée FROM Table Nom_Alias1 WHERE Condition ) Nom_alias2 SET Nom_alias2.Attribut = expression WHERE Condition ;
  • 59.
    Mise à jourdes tuples •  Dans une table imbriquée –  Exemple •  Modifier la distance d intervention à 8888 de l employé 1 dans la ville de Dijon SQL> UPDATE THE (SELECT e.lieux_interventions FROM Employes e WHERE e.numero='1') a SET a.distance = 8888 WHERE a.ville LIKE '%Dijon%'; 10/12/13 Page 59
  • 60.
    Mise à jourdes tuples •  Dans une table imbriquée –  Exemple •  Pour l’employé 2, changer son intervention associée à la ville de Dijon, la nouvelle référence ayant pour numéro T1234 SQL> UPDATE THE ( SELECT e.lieux_interventions FROM Employes e WHERE e.numero='2') a SET a.ref_contrat = (select ref(v) from contrats v where v.No_int ='T1234') WHERE a.ville LIKE '%Dijon% ; 10/12/13 Page 60
  • 61.
    Suppression des tuples • Syntaxe générale SQL> 10/12/13 Page 61 DELETE FROM Nom_table Alias WHERE Alias.Nom_attribut = Expression ;
  • 62.
    Suppression des tuples • Condition de suppression portant sur une table imbriquée –  Exemple •  Supprimer les employés qui ont eu des interventions à Lyon SQL> DELETE FROM Employes e WHERE EXISTS(select * from the (SELECT a.lieux_interventions FROM employes a WHERE a.numero=e.numero) li WHERE li.ville = Lyon') ; 10/12/13 Page 62
  • 63.
    Suppression des tuples • Condition de suppression portant sur les n-uplets d’une table imbriquée –  Exemple •  Supprimer les interventions de l’employé 2 qui se sont déroulées à Lyon SQL> DELETE FROM the (SELECT e.lieux_interventions FROM employes e WHERE e.numero='2') li WHERE li.ville LIKE '%Lyon% ; 10/12/13 Page 63
  • 64.
  • 65.
    Interrogation des tuples • Syntaxe générale SQL> SELECT t.Nom_attr1, t.Nom_ attr2, , …. FROM Table t; Utilisation d'un alias obligatoire pour les attributs structurés 10/12/13 Page 65
  • 66.
    Interrogation des tuples • Exemple –  Donnez le numéro, le nom et le prénom des employés qui ont un véhicule mis en circulation après le 01/06/2006 SQL> 10/12/13 Page 66 SELECT e.numero, e.nom, e.prenom FROM employes e WHERE e.VEH.date_immat>='01/12/2006';
  • 67.
    Interrogation des tuples • Exemple –  Donnez le nom des villes où intervient l’employé numéro 2 SELECT la.ville FROM THE (SELECT e.lieux_interventions FROM employes e WHERE e.numero='2') la; SQL> 10/12/13 Page 67
  • 68.
    Interrogation des tuples • Exemple –  Donnez le nom des villes où intervient tous les employés SQL> 10/12/13 Page 68 SELECT la.ville FROM employes e, TABLE(e.lieux_interventions) la;
  • 69.
    Interrogation des tuples • Exemple –  Donnez les numéros et les montants des contrats de l’employé numéro 1 SQL> 10/12/13 Page 69 SELECT le.ref_contrat.no_int, le.ref_contrat.montant FROM THE(SELECT e.lieux_interventions FROM employes e WHERE e.numero='1') le;
  • 70.
    Interrogation des tuples • Exemple –  Afficher les informations relatives aux contrats de l’employé numéro « 1 » SQL> SELECT (Li.ref_contrat) FROM THE (SELECT Emp.lieux_interventions FROM Employes Emp WHERE Emp.numero = '1') Li; 000022020876B2245DBE325C5FE03400400B40DCB176B2245DBE305C5FE034 00400B40DCB1 SQL> 10/12/13 Page 70 SELECT DEREF (Li.ref_contrat) FROM THE (SELECT Emp.lieux_interventions FROM Employes Emp WHERE Emp.numero = '1') Li;
  • 71.
    Interrogation des tuples • Utilisation des fonctions d agrégats (COUNT, SUM, AVG, MAX, MIN) –  Syntaxe SQL> 10/12/13 Page 71 SELECT Nom_de_fonction ( paramètres )! !FROM Nom_de_relation! ![WHERE condition1]! ![GROUP BY condition2 [HAVING condition3]]!
  • 72.
    Interrogation des tuples • Utilisation des fonctions d agrégats (COUNT, SUM, AVG, MAX, MIN) –  Exemple •  Afficher le nombre des employés qui habitent Dijon SQL> 10/12/13 Page 72 SELECT count(*) FROM Employes Emp WHERE emp.adr.ville = 'Dijon';
  • 73.
    Interrogation des tuples • Utilisation des fonctions d agrégats (COUNT, SUM, AVG, MAX, MIN) sur une table imbriquée –  Syntaxe SQL> SELECT Nom_de_fonction ( paramètres ) FROM THE (SELECT alias.tab_imb FROM Table alias WHERE alias.nom_attribut = valeur ); 10/12/13 Page 73
  • 74.
    Interrogation des tuples • Utilisation des fonctions d agrégats (COUNT, SUM, AVG, MAX, MIN) sur une table imbriquée –  Exemple •  Donnez le nombre de contrats de l’employé numéro 1 SQL> SELECT count (*) FROM THE (SELECT e.lieux_interventions FROM Employes e WHERE e.numero = 1); 10/12/13 Page 74
  • 75.
    Interrogation des tuples • Utilisation des fonctions d agrégats (COUNT, SUM, AVG, MAX, MIN) sur une table imbriquée –  Exemple •  Donnez le nombre de contrats dans la ville de Dijon pour l’employé numéro « 1 » SQL> SELECT count (*) FROM THE (SELECT e.lieux_interventions FROM Employes e WHERE e.numero = 1) li where li.ville='Dijon'; 10/12/13 Page 75
  • 76.
    Interrogation des tuples • Utilisation des curseurs –  Syntaxe SQL> SELECT alias. att, CURSOR ( SELECT ti.att2, ti.att2 FROM TABLE (Tab_Imb) ti) FROM table alias WHERE condition; 10/12/13 Page 76
  • 77.
    Interrogation des tuples • Utilisation des curseurs –  Exemple •  Donnez les employés (nom et prénom) et les villes respectives SQL> SELECT Emp.numero, Emp.nom, Emp.prenom, CURSOR (SELECT Li.ville FROM TABLE(lieux_interventions) Li) FROM employes Emp; 10/12/13 Page 77
  • 78.
    Interrogation des tuples • Utilisation des curseurs –  Exemple •  Donnez les employés (nom et prénom) et les contrats respectifs SQL> SELECT e.numero, e.nom, e.prenom, CURSOR (SELECT CURSOR (SELECT * FROM contrats p) FROM TABLE(e.lieux_interventions) d) FROM Employes e; 10/12/13 Page 78
  • 79.
    Heritage •  Pour utiliserdes sous-types dans SQL3, il faut définir des types non finaux –  Exemple SQL> CREATE or replace TYPE etudiant_type AS OBJECT (no_insee VARCHAR2(13), age NUMBER, nom VARCHAR2(30)) not final; / CREATE or replace TYPE etudiant_IUT UNDER etudiant_type (date_inscription DATE, situa_fam CHAR(1), annee varchar2(4)) final;/ 10/12/13 Page 79
  • 80.
    Heritage •  Pour utiliserdes sous-types dans SQL3, il faut définir des types non finaux –  Exemple SQL> CREATE TABLE etudiants_IUT of etudiant_IUT ; 10/12/13 Page 80
  • 81.
    Heritage •  Insertion –  Exemple SQL>INSERT INTO etudiants_IUT VALUES ('12345555',22,'Almamy','12/12/2005','1','IQ2'); 10/12/13 Page 81
  • 82.
    Méthodes •  Vous pouvez associerà chaque type un ensemble de méthodes ou fonctions –  Deux étapes sont à suivre 1.  Lors de déclaration de la fonction (Create ou ALTER) SQL> CREATE OR REPLACE TYPE Nom_Type ! ! !AS OBJECT (! ! ! !Nom_attribut1 !Type_Attribut,! ! ! !Nom_attribut2 !Type_Attribut,! ! ! !……..! ! ! !Nom_attributn !Type_Attribut ! [final|not final]! MEMBER FUNCTION nom_fonction1 RETURN type_données! MEMBER FUNCTION nom_fonction2 RETURN type_données! );! /! 10/12/13 Page 82
  • 83.
    Méthodes •  Vous pouvez associerà chaque type un ensemble de méthodes ou fonctions –  Deux étapes sont à suivre 2.  Spécification du corps de la fonction SQL> CREATE TYPE BODY Nom_Type AS MEMBER FUNCTION nom_fonction1() IS BEGIN END nom_fonction1() ; MEMBER FUNCTION nom_fonction2() IS BEGIN END nom_fonction2() ; … END; / 10/12/13 Page 83
  • 84.