6. 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
7. 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
8. Introduction
• Usage des TAD
– Dans une table
– Dans un attribut d’une table relationnelle
– Etc.
10/12/13
Page 8
9. 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
10. 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
11. 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
12. 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
13. 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
14. 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%’;
15. 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’);
22. 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
23. 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
24. 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
25. 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
26. 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
28. 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
29. 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
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
• 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
33. 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
34. 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
35. 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
36. 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
37. 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
38. 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
39. 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
40. 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
41. 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
42. 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
43. 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
44. 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;
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 à 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
57. 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
58. 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 ;
59. 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
60. 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
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
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 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
80. 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
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