SQL Complet
SQL Complet
SQL
Introduction
Historique du Langage SQL
2
Norme et Standard du langage SQL
3
Caractéristiques de la norme SQL
4
Les sous-langages de SQL
5
SQL avancé
6
Apprendre SQL avec Oracle
7
Offre complète d’Oracle :
Produits proposés
8
Offre complète d’Oracle (suite)
• Enterprise Manager
– Interface graphique pour administrer la base de données distante
(DBA)
– Administration système Oracle
– Ajout, modification et suppression de tous les objets de la base
– Surveillance des activités
• SQL*Net
– Driver propriétaire de communication client et serveur
– Nécessaire en Client - Serveur et les BD réparties
• Oracle Application Server
– Pilier de NCA (Network Computing Architecture)
– Serveur Web Transactionnel
– Cartouches PL/SQL, Java...
– Intègre le standard CORBA et IIOP
9
Offre complète d’Oracle (suite)
• Oracle WareHouse
– Serveur OLAP
– Analyse décisionnelle
• Oracle Database Designer
– Atelier de génie logiciel
– Construction du système d’information (données et
programme)
– Reverse engineering
• Oracle Developer 2000
– Outil graphique de développement propriétaire
– Intègre le produit SQL*Forms
10
Offre complète d’Oracle (fin)
• Oracle Inter-Office
– Outil de Workflow
– Gestion des flux de documents électronique
– Concurrents : Lotus Notes et Exchange
• Oracle Portal
– Portail d’entreprise
– Point d’entrée unique de travail
• Certains produits sont aujourd’hui proposés en
standard avec Oracle 9i
11
SQL*Plus
LDD
Les ordres et les objets
• Ordre CREATE
– Création de la structure de l’objet DD
• Ordre DROP
– Suppression des données et de la structure
• Ordre ALTER
– Modification de la structure (contenant)
• Syntaxe <Ordre> <Objet> < nom_objet>
• Objet TABLE
• Objet INDEX
• Objet CLUSTER
• Objet SEQUENCE
14
Objet Table et Contraintes
CREATE : Syntaxe
PRIMARY KEY
15
Objet Table et Contraintes
Les types de données
16
Objet Table et Contraintes
CREATE : Exemples
-- Table ‘Mère’
17
Objet Table et Contraintes
CREATE : Exemples (suite)
-- Table ‘Fille’
CREATE TABLE employe
(IdEmploye NUMBER(5),
NomEmploye VARCHAR(30),
Indice NUMBER(3),
DateEmbauche DATE DEFAULT SYSDATE,
IdService CHAR(3)
CONSTRAINT nn_emp_ser NOT NULL,
CONSTRAINT pk_employe
PRIMARY KEY(IdEmploye),
CONSTRAINT fk_emp_ser FOREIGN KEY(IdService)
REFERENCES service(IdService),
CONSTRAINT ck_emp_indice CHECK
(indice BETWEEN 100 AND 900)
);
18
Objet Table : DROP
19
Modification de la structure
ALTER TABLE
Ajout de colonnes
Modification de colonnes
Suppression de colonnes
ALTER TABLE nom_table
DROP COLUMN (colonne1, colonne2);
20
ALTER TABLE
Exemples de modifications
21
Contraintes
constraint nomcontrainte
{ unique | primary key (col1[,col2]...)
| foreign key (col1[,col2]...)
references [schema].table (col1[,col2]...)
[ON DELETE CASCADE]
| check (condition) }
22
Modification des contraintes
Ajout et Suppression
Ajout de contraintes
23
Modification des contraintes
Exemples
24
Activation et désactivation
de contraintes
Désactivation de contraintes
25
Activation d’une contrainte
désactivée
Activation de contraintes
26
Ajout ou activation de contraintes :
Récupération des lignes en erreur
Activation de contraintes
27
Vérification de Contraintes différées
28
Vérification de Contraintes différées
Exemples
CREATE TABLE emps ...
dept_id NUMBER(6)
CONSTRAINT fk_emp_dept REFERENCES depts
DEFERRABLE INITIALLY IMMEDIATE);
SQL> COMMIT;
COMMIT
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02291: integrity constraint (MICHEL.FK_EMP_DEPT_ID)
violated - parent key not found
29
Les fichiers Index :
organisation en B-Arbre
Entrée d'index
Racine
Branche
31
Apport des Index
32
Cluster : Jointure physique
20 Ventes Xavier
No_emp nom_emp no_dept
100 Pierre Bloc2
104 Corinne
------ ------- -------
100 Pierre 20
30 Achats Paul
EMP 101 Sylvie 10 Bloc3
102 Michel 10
104 Corinne 20
1.Création du cluster
36
Objet Séquence
37
Objet Séquence
création et utilisation
38
Objet Séquence
Exemple de mise en oeuvre
40
Le Langage de Manipulation
de Données
LMD
Les ordres SQL de manipulation
• INSERT
– Insertion (ajout) de ligne(s) dans une table
– Utiliser SQL*LOAD pour des chargements externes
• UPDATE
– Mise à jour (modification) de une ou plusieurs colonnes
de une ou plusieurs lignes
• DELETE
– Suppression de une ou plusieurs lignes
• COMMIT / ROLLBACK
– Fin d’une transaction
42
INSERT
Exemples :
43
INSERT (suite)
44
UPDATE
UPDATE nom_table
SET colonne1 = valeur1
[,colonne2 = valeur2 ….]
[ WHERE prédicat];
Exemples :
UPDATE employe
SET nom = ‘Michel’, adresse = ‘Toulouse’
WHERE idEmp = 100;
UPDATE employe
SET salaire = salaire * 1.1
WHERE idSer = ‘info’;
Exemples :
46
COMMIT / ROLLBACK
47
Le Langage d’Interrogation
de Données
LID
Mono-table
Mise en forme des résultats
Sélection et Affichage
Mono Table
• Ordre SELECT
• Sélection : restriction sur les lignes
• Projection : fonctions de groupage et restrictions
sur les groupages
• Ordres de Tris
• Fonctions Chaînes et Calculs
• Mise en page des résultats
49
Ordre SELECT
SELECT {DISTINCT|*|col1[,col2,….]
[AS nom_col]}
FROM nom_de_table
50
Exemples de SELECT MONO (1)
51
Exemples de SELECT MONO (2)
colonne virtuelle ROWNUM
52
Exemples de SELECT MONO (3)
tri du résultat
SELECT * FROM (
SELECT idService,nome,indice FROM emp
ORDER BY 1 , 3 DESC, 2)
WHERE ROWNUM < 15; Affichage des 15 premiers triés
53
Exemples de SELECT MONO (4)
clause DISTINCT
54
Clause de groupage : GROUP BY
fonctions de groupage
55
Restriction sur les groupages :
HAVING
56
Mécanisme du GROUP BY et DISTINCT
57
Fonctions de groupages (agrégats)
AVG Moyenne
COUNT Nombre de lignes
GROUPING Composer des regroupements
(datawarehouse)
MAX Maximum
MIN Minimum
STDDEV Écart type
SUM Somme
VARIANCE Variance
58
Fonctions numériques (1)
59
Fonctions numériques (2)
60
Fonctions chaînes de caractères(1)
62
Fonctions pour les dates
63
Mise en forme des résultats
• Principe
– Amélioration de la présentation du résultat d’une requête SQL
• Formatage de colonnes
– Instruction COLUMN pour afficher des entêtes
• Formatage de pages
– Instruction BREAK pour gérer les ruptures
– Instruction COMPUTE avec les fonctions SUM, MIN, MAX, AVG,
STD, VAR, COUNT, NUM pour des calculs
– Directive SET avec les paramètres NEWPAGE, PAGESIZE,
LINESIZE pour la mise en page des états de sortie
– Instructions TTITLE, BTITLE pour l’affichage des titres des
états de sortie
• Ordres SQL*PLUS
64
Affichage avec COLUMN
CLEAR COLUMN
65
Rupture de séquences : BREAK
CLEAR BREAK
66
Exemple de BREAK
rx daniel
françois
si jacques
jean
67
Opérations de calculs
68
Exemple de COMPUTE
69
Résultat de la requête
70
État de sortie
Entêtes de page
TTITLE option {texte | variable}
option : COL n, SKIP n, TAB n,
LEFT, CENTER, RIGHT, BOLD FORMAT…
Variables
SQL.LNO numéro de la ligne courante
SQL.PNO numéro de la ligne courante
SQL.RELEASE version d’Oracle
SQL.USER nom du user
Pieds de page
BTITLE option {texte | variable}
71
Exemples d’état de sortie
SET NEWPAGE 1
SET PAGESIZE 30
SET LINESIZE 80
COL JOUR NOPRINT NEW_VALUE AUJOURDHUI
TTITLE LEFT 'PAGE' SQL.PNO SKIP LEFT AUJOURDHUI -
SKIP CENTER ‘Comptes' SKIP CENTER 'par client' SKIP2
BTITLE CENTER 'Fin du rapport'
BREAK ON "Numéro Client"
COMPUTE SUM LABEL "Solde Compte" -
OF solde_compte ON "Numéro Client"
SELECT TO_CHAR(sysdate,('DD/MM/YYYY')) AS jour,
num_client AS "Numéro Client" ,
libelle_compte,solde_compte FROM comptes
ORDER BY 1;
TTITLE OFF
BTITLE OFF
CLEAR BREAKS
CLEAR COMPUTES
CLEAR COLUMNS
72
Exemples d’état de sortie (suite)
PAGE 1
14/10/2003 Comptes
par client
75
Gestion des fichiers SPOOL
fichier.lst
76
Le Langage d’Interrogation
de Données
LID
Multi-table
Jointures
Les différentes méthodes de Jointure
• Opérateurs ensemblistes
– UNION, INTERSECT et MINUS
• Jointure en forme procédurale déconnectée
– SELECT imbriqués déconnectés
• Jointure en forme procédurale synchronisée
– SELECT imbriqués synchronisés
• Jointure en forme non procédurale ou relationnelle
– Pas d’imbrication : 1 seul bloc SELECT-FROM-WHERE
– Jointure complète ou externe (gauche ou droite)
• Requêtes hiérarchiques
– Parcours d’arbre : association réflexive 1-N
78
L’opérateur ensembliste UNION
81
Composition d’opérateurs ensemblistes
82
Jointure forme procédurale déconnectée
imbrication de SELECT
84
Jointure forme procédurale déconnectée
Exemple 2 : employés les mieux payés
85
Jointure forme procédurale déconnectée
Exemple 3 : employé responsable
86
Jointure forme procédurale déconnectée
Avantages et inconvénients
87
Jointure forme procédurale déconnectée
Exemple 4 : ALL
88
Jointure en forme procédurale synchronisée
Présentation
89
Jointure en forme procédurale synchronisée
Exemple 1
SERVICE
idSer nomSer nbEmp
UPDATE service s
25 Info 3 SET s.nbEmp =
(SELECT COUNT(e.idEmp) FROM emp e
30 Stat 1 WHERE e.idSer=s.idSer);
50 Maths 1
60 Bd 0 s
e
91
Jointure en forme procédurale synchronisée
Test d’existence : [NOT] EXISTS
92
Jointure en forme procédurale synchronisée
Exemple 3 : Test d’existence
– A–B=
et
B–A=
94
Jointure en forme procédurale synchronisée
Exemple 4 : DIVISION
95
Jointure en forme Relationnelle
96
Jointure en forme Relationnelle
Exemple 1 : ouvrages empruntés
BREAK ON nom
SELECT et.nom,o.titre,o.auteur
FROM ouvrage o, emprunt ep, etudiant et
WHERE et.ufr='Informatique' AND
et.idEtudiant=ep.idEtudiant AND
ep.dateEmprunt = SYSDATE AND
ep.idOuvrage=o.idOuvrage
ORDER BY 1,2;
CLEAR BREAK
97
Jointure en forme Relationnelle
Exemple 2 : employé responsable
98
Jointure en forme Relationnelle
Exemple 3 : autre jointure
101
Requêtes hiérarchiques
102
Requêtes hiérarchiques
Syntaxe d’une requête
103
Requêtes hiérarchiques
exemple : table scott.emp
14 ligne(s) sélectionnée(s).
104
Requêtes hiérarchiques
mise en oeuvre
105
Requêtes hiérarchiques
exemple (1)
SELECT empno,ename,job,mgr
FROM emp
START WITH empno=7654 Départ
CONNECT BY PRIOR mgr = empno;
106
Utilisation de la fonction LPAD
ex. de LPAD
----------------------
Indentation de 6
107
Requêtes hiérarchiques
exemple final
SELECT e.nom
FROM etudiant e
WHERE EXISTS
33 (SELECT 'trouvé' FROM emprunt ep
WHERE ep.idOuv = '&ouvlu‘
AND e.idEtu = ep.idEtu);
SELECT e.nom
FROM etudiant e, emprunt ep
44 WHERE ep.idOuv = '&ouvlu'
AND e.idEtu = ep.idEtu;
110
7 Façons de résoudre une requête (suite)
SELECT e.nom
FROM etudiant e
WHERE 0 <
55 (SELECT COUNT(*) FROM emprunt ep
WHERE ep.idOuv = '&ouvlu'
AND e.idEtu = ep.idEtu);
SELECT e.nom
FROM etudiant e
66 WHERE '&ouvlu' IN
(SELECT ep.idOuv FROM emprunt ep
WHERE e.idEtu = ep.idEtu);
111
7 Façons de résoudre une requête (fin)
SELECT e.nom
FROM etudiant e
77 WHERE '&ouvlu' = ANY
(SELECT ep.idOuv FROM emprunt ep
WHERE e.idEtu = ep.idEtu);
Je préfère
la 4 !!
112
Optimisation des Requêtes
Plan d’exécution
EXPLAIN PLAN
Optimisation des requêtes :
Visualisation du graphe
114
Structure de PLAN_TABLE
115
Opérations / Options (1)
MERGE Merges several bitmaps resulting from a range scan into one bitmap
Subtracts bits of one bitmap from another. Row source is used for negated
MINUS predicates. Can be used only if there are nonnegated predicates yielding a
bitmap from which the subtraction can take place
CONNECT
Retrieves rows in hierarchical order for a query containing a CONNECT BY clause
BY
116
Opérations / Options (2)
HASH JOIN Operation joining two sets of rows and returning the result
117
Opérations / Options (3)
118
Opérations / Options (4)
119
Opérations / Options (5)
HASH Retrieval of rows from table based on hash cluster key value
120
Visualisation du graphe
Mise en œuvre (1)
• Contenu de PLAN_TABLE
OPERATION OPTIONS OBJET ID PARENT_ID POSITION
------------------ --------------- ---------- --- --------- --------
SELECT STATEMENT 0
NESTED LOOPS 1 0 1
TABLE ACCESS FULL COMPTES 2 1 1
TABLE ACCESS BY INDEX ROWID CLIENTS 3 1 2
INDEX UNIQUE SCAN PK_CLIENT 4 3 1
• Graphe correspondant
TABLE ACCESS
2
COMPTES
122
Visualisation du graphe
autres exemples (1)
123
Visualisation du graphe
autres exemples (2)
select * from clients
where num_client IN
(select num_client from clients
minus
select num_client from comptes);
plan de la requête
------------------------------------------
SELECT STATEMENT ()
NESTED LOOPS ()
VIEW (VW_NSO_1)
MINUS ()
SORTUNIQUE ()
TABLE ACCESSFULL (CLIENTS)
SORTUNIQUE ()
TABLE ACCESSFULL (COMPTES)
TABLE ACCESSBY INDEX ROWID (CLIENTS)
INDEXUNIQUE SCAN (PK_CLIENT)
125
Le Langage de Contrôle
de Données
LCD
Contrôle des Données
• Notion de Sous–Schéma
– Restriction de la vision
– Restriction des actions
• Privilèges
– Systèmes
– Objets
• Rôles
– Regroupement de privilèges
• Contraintes évènementielles : Trigger (plus loin)
– Contrôles avant une modification
– Mises à jour automatique
127
Restreindre les accès à une BD
de la vision VIEW
RESTRICTION
des actions GRANT
128
Restriction des accès
Sous-schéma ou schéma externe
DBA
Utilisateur2
BD
Utilisateur1
129
L’objet VUE
130
Utilisation d’une VUE
131
Création et suppression
d’une VUE
132
Exemples de création de VUES (1)
133
Exemples de création de VUES (2)
134
Exemples de création de VUES (3)
135
Exemples de création de VUES (4)
• Simplification de requêtes
• Pas de modifications possibles dans ce type de
vue ( voir trigger ‘instead of’)
• Tables temporaires ‘virtuelles’ de travail
• Transformation de la présentation des données
Schéma externe
CREATE VIEW emp_ser(nom_service, nom_employe)
AS SELECT s.noms,e.nome FROM emp e,service s
WHERE e.idSer=s.idSer;
2 Tables
137
Exemples de vues multi-tables
Table T
Vue VT
Contraintes
Contraintes
génériques
spécifiques
139
Exemple de vue avec Contrainte
140
Restriction des Actions :
Les privilèges
141
Privilèges système
142
Exemples de privilèges systèmes
PROCEDURE
ANY PROCEDURE
TABLE
ANY TABLE
SESSION
TABLESPACE
USER
VIEW
………
143
Délégation et suppression
de privilèges
• Délégation : GRANT
GRANT {privilège_système | rôle}
[,{privilège2 | rôle2}...]
TO {utilisateur1 | rôle | PUBLIC}
[,{utilisateur2 ...}]
[WITH ADMIN OPTION] ;
• Suppression : REVOKE
REVOKE {privilège_système | rôle}
[,{privilège2 | rôle2}...]
FROM {utilisateur1 | rôle | PUBLIC}
[,{utilisateur2 ...}] ;
144
Exemple de délégation et de suppression
de privilèges Système
145
Privilèges Objet
146
Privilèges Objet
Délégation et suppression
• Délégation : GRANT
GRANT privilège1 [,privilège2 ...]
[(colonne [,colonne2.])] ON schéma.objet
TO {utilisateur1 | rôle | PUBLIC}
[,{utilisateur2 ...}]
[WITH GRANT OPTION] ;
• Suppression : REVOKE
REVOKE privilège1 [,privilège2 ...]
[(colonne [,colonne2...])]
ON schéma.objet
FROM {utilisateur1 | rôle | PUBLIC}
[,{utilisateur2 ...}]
[CASCADE CONSTRAINTS] ;
147
Privilèges Objet
Exemples
148
Les privilèges Objet :
objets et actions possibles
Procédure
Objets
Table Vue Séquence Fonction Snapshot
Actions Package
ALTER
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE
149
Les Rôles
150
Les Rôles : évitent le produit cartésien
Privilège1
ROLE1
Privilège2
Privilège3
ROLE2
Privilège4
ROLE3 Privilège5
Privilège6
151
Manipulation des rôles :
Ordres
152
Manipulation des rôles :
Exemples
GRANT secretariat_info TO
laurent, thomas, corinne ;
153
Rôles prédéfinis
• DBA
– Tous les privilèges système et objet
• RESOURCE
– Création de tous les objets ‘classiques’
– Propriétaire des données (‘owner’)
• CONNECT
– Connexion à la base
– Attente de privilèges objet
• EXP_FULL_DATABASE
– Exportation de tous les objets
• IMP_FULL_DATABASE
– Importation d’objets
154
Dictionnaire de données
• ROLE_SYS_PRIVS
– privilèges systèmes accordés aux rôles
• ROLE_TAB_PRIVS
– privilèges objets accordés aux rôles
• USER_ROLE_PRIVS
– rôles accessibles par l’utilisateur
155
Le Langage de Contrôle
de Données
TRIGGERS
Généralités sur les Triggers
157
12 types de Triggers
158
Syntaxe de création
160
Trigger de contraintes :
‘lever’ une erreur
RAISE_APPLICATION_ERROR(n°erreur,’texte erreur’)
161
Exemples de row trigger :
prise de commande
(1) produits
idProd NomProd QtStock Seuil
détail_commandes
IdCom idProd QtCom p1 Produit 1 20 15
P2 Produit 2 50 12
1001 p1 10
INSERT (2) ……
(3)
• (1) Contrôle réapprovisionnement
– QtStock > QtCom ? idProd NomProd QtStock Seuil
• (2) Mise à jour
– QtStock=QtStock-QtCom
• (3) génération évènements
– Ajout dans réappro si
– Seuil >= QtStock
162
Prise de commande :
(1) contrôle quantité en stock ?
163
Prise de commande :
(2) Mise à jour quantité en stock
164
Prise de commande :
(3) génération d’un réapprovisionnement
165
Les prédicats dans un trigger
•CREATE
On peutTRIGGER
regrouper tous les triggers d’un même
<nom_trigger>
type : BEFORE ou AFTER
{BEFORE|AFTER}
•INSERT OR DELETE
On précise OR UPDATE
l’ordre dans le BEGIN[OF colonnes]}
ON <nom_table>
[FOR EACH ROW]
[DECLARE]
-- déclaration de variables, exceptions
BEGIN
IF UPDATING(’colonne’) THEN …… END IF;
IF DELETING THEN …… END IF;
IF INSERTING THEN …… END IF;
END;
/
166
Limitation des Trigger
X3
167
Les triggers d’état
ou ‘Statement trigger’
168
Exemple de Statement Trigger
169
Les Triggers ‘INSTEAD OF’
170
Exemple de trigger ‘instead of’
ETUDIANT
S
ETUDIANT_LICENCE
T
A
ETUDIANT_MASTERE
G
E
ETUDIANT_DOCTORAT
171
Exemple de trigger ‘instead of’
Construction de la vue ETUDIANT
Colonne virtuelle
CREATE VIEW etudiant
(ine,nom,adresse,cycle,nomstage,adstage)
AS SELECT el.ine,el.nom,el.adr,’L’,s.noms,s.ads
FROM etudiant_licence el, stage s
WHERE el.ine=s.ine
UNION
SELECT em.ine,em.nom,em.adr,’M’,s.noms,s.ads
FROM etudiant_mastere em, stage s
WHERE em.ine=s.ine
UNION
SELECT ed.ine,ed.nom,ed.adr,’D’,s.noms,s.ads
FROM etudiant_doctorat ed, stage s
WHERE ed.ine=s.ine;
172
Exemple de trigger ‘instead of’
utilisation de la vue : INSERT
ETUDIANT
173
Exemple de trigger ‘instead of’
trigger pour INSERT
• USER_TRIGGERS
TRIGGER_NAME VARCHAR2(30)
TRIGGER_TYPE VARCHAR2(16)
TRIGGERING_EVENT VARCHAR2(227)
TABLE_OWNER VARCHAR2(30)
BASE_OBJECT_TYPE VARCHAR2(16)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
REFERENCING_NAMES VARCHAR2(128)
WHEN_CLAUSE VARCHAR2(4000)
STATUS VARCHAR2(8)
DESCRIPTION VARCHAR2(4000)
ACTION_TYPE VARCHAR2(11)
TRIGGER_BODY LONG
176
Dictionnaire des Données (suite)
• USER_TRIGGER_COLS
TRIGGER_OWNER VARCHAR2(30)
TRIGGER_NAME VARCHAR2(30)
TABLE_OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
COLUMN_LIST VARCHAR2(3)
COLUMN_USAGE VARCHAR2(17)
177
Le Langage de BLOC
PL/SQL
Le Langage de Bloc
PL/SQL # SQL
179
Requêtes SQL
CLIENT SERVEUR
INSERT INTO … Exécute INSERT
Résultat
DELETE FROM … Exécute DELETE
Résultat
UPDATE … Exécute UPDATE
Résultat
SELECT …
Exécute SELECT
……. Résultat
180
Bloc PL/SQL
CLIENT SERVEUR
BEGIN
Exécution
INSERT …
SI …. ALORS du bloc
SELECT … PL/SQL
FSI
END;
Résultat
181
Format d’un bloc PL/SQL
182
Variables simples
fin BOOLEAN ;
reponse BOOLEAN DEFAULT TRUE ;
ok BOOLEAN := TRUE;
183
Variables faisant référence
au dictionnaire de données
TYPE type_nom_tab
IS TABLE OF VARCHAR(30) i:=1;
INDEX BY BINARY_INTEGER; tab_noms(i):= 'toto';
tab_noms type_nom_tab;
i NUMBER;
186
Tableaux dynamiques
variables simples avec héritage
TYPE type_nom_tab
IS TABLE OF etudiant.nom%TYPE i:=1;
INDEX BY BINARY_INTEGER; tab_noms(i):= 'toto';
tab_noms type_nom_tab;
i NUMBER;
187
Tableaux dynamiques
avec des éléments de type RECORD
TYPE type_emp_record
(idEmp NUMBER,
nomEmp VARCHAR(30),
adrEmp VARCHAR(80)); i:=1;
tab_emps(i).idEmp:= 100;
tab_emps(i).nomEmp:= 'toto';
tab_emps(i).adrEmp:= 'tlse';
TYPE type_emp_tab
IS TABLE OF type_emp_record
INDEX BY BINARY_INTEGER;
tab_emps type_emp_tab;
i NUMBER;
188
Tableaux dynamiques
avec des éléments de type ROW
TYPE type_emp_tab
IS TABLE OF employe%ROWTYPE
INDEX BY BINARY_INTEGER;
tab_emps type_emp_tab;
i NUMBER;
i:=1;
tab_emps(i).idE:= 100;
tab_emps(i).nom:= 'toto';
tab_emps(i).adresse:= 'tlse';
189
Variables paramétrées
lues sous SQLPLUS : &
DECLARE
-- déclarations
BEGIN
PL -- travail avec le contenu de plu :
-- &plu si numérique
-- '&plu' si caractère
END;
/
+ -- Ordre SQL .....
190
Variables en sortie
sous SQLPLUS : :
+ VARIABLE i NUMBER
SQL> print i
BEGIN
:i := 15;
PL END; I
/ ----------
+ PRINT i
15
191
Instructions PL
• Affectation (:=)
– A := B;
• Structure alternative ou conditionnelle
– Opérateurs SQL : >,<,….,OR,AND,….,BETWEEN,LIKE,IN
– IF …. THEN ….. ELSE ……END IF;
IF condition THEN
instructions;
ELSE
instructions;
IF condition THEN instructions;
ELSIF condition THEN instructions;
ELSE instructions;
END IF;
192
Structure alternative : CASE (1)
CASE variable
END CASE;
193
Structure alternative : CASE (2)
CASE
END CASE;
194
Structure itérative
LOOP
• LOOP instructions;
EXIT WHEN (condition);
END LOOP;
195
Affichage de résultats intermédiaires
Package DBMS_OUTPUT
197
Sélection mono – ligne
SELECT …. INTO
• Toute valeur de colonne est rangée dans une
variable avec INTO
SELECT nom,adresse,tel INTO vnom,vadresse,vtel
FROM etudiant WHERE ine=&nolu;
SELECT nom,adresse,libDip INTO vnom,vadresse,vdip
FROM etudiant e, diplôme d WHERE ine=&nolu
AND e.idDip=d.idDip;
• Variable ROWTYPE
SELECT * INTO vretud FROM etudiant WHERE ine=&nolu;
…………
DBMS_OUTPUT.PUT_LINE('Nom étudiant : '||vretud.nom);
…………
198
Sélection multi – ligne : les CURSEURS
Principe des curseurs
199
Démarche générale des curseurs
200
Traitement d’un curseur
Programme PL/SQL
SGA
FETCH
variables
DECLARE
CURSOR c1 IS SELECT ……;
BEGIN
OPEN c1;
FETCH c1 INTO ………;
WHILE (c1%FOUND) LOOP
………
……… OPEN
FETCH c1 INTO ………;
END LOOP;
CLOSE c1;
END; BD
201
Gestion ‘classique’ d’un curseur
DECLARE
CURSOR c1 IS SELECT nom,moyenne FROM etudiant ORDER BY 1;
vnom etudiant.nom%TYPE;
vmoyenne etudiant.moyenne%TYPE;
e1 ,e2 NUMBER;
BEGIN
OPEN c1;
FETCH c1 INTO vnom,vmoyenne;
WHILE c1%FOUND LOOP
IF vmoyenne < 10 THEN e1:=e1+1;
INSERT INTO liste_refus VALUES(vnom);
ELSE e2:=e2+1;
INSERT INTO liste_refus VALUES(vnom);
END IF;
FETCH c1 INTO vnom,vmoyenne;
END LOOP;
CLOSE c1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e2)||'Reçus ');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e1)||'Collés ');
COMMIT;
END;
202
Les variables système des Curseurs
• Curseur%FOUND
– Variable booléenne
– Curseur toujours ‘ouvert’ (encore des lignes)
• Curseur%NOTFOUND
– Opposé au précédent
– Curseur ‘fermé’ (plus de lignes)
• Curseur%COUNT
– Variable number
– Nombre de lignes déjà retournées
• Curseur%ISOPEN
– Booléen : curseur ouvert ?
203
Gestion ‘automatique’ des curseurs
DECLARE
CURSOR c1 IS SELECT nom,moyenne FROM etudiant ORDER BY 1;
-- PAS DE DECLARATION DE VARIABLE DE RECEPTION
e1 ,e2 NUMBER;
BEGIN
--PAS D’OUVERTURE DE CURSEUR
--PAS DE FETCH Variable STRUCT de réception
FOR c1_ligne IN c1 LOOP
IF c1_ligne.moyenne < 10 THEN e1:=e1+1;
INSERT INTO liste_refus VALUES(c1_ligne.nom);
ELSE e2:=e2+1;
INSERT INTO liste_refus VALUES(c1_ligne.nom);
END IF;
END LOOP;
--PAS DE CLOSE
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e2)||'Reçus ');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e1)||'Collés ');
COMMIT;
END;
204
Curseurs et Tableaux
exemple final
DECLARE
CURSOR c1 IS SELECT nom,moyenne FROM etudiant
WHERE moyenne>=10 ORDER BY 2 DESC;
TYPE type_nom_tab IS TABLE OF etudiant.nom%TYPE
INDEX BY BINARY_INTEGER;
tab_noms type_nom_tab;
i,j NUMBER;
BEGIN /* Remplissage tableau */
i:=1;
FOR c1_ligne IN c1 LOOP
tab_noms(i):= c1.ligne.nom;
i:=i+1;
END LOOP; /* Affichage du tableau */
FOR j IN 1..i-1 LOOP
DBMS_OUTPUT.PUT_LINE('Rang : '||TO_CHAR(j)||
'Etudiant : '||tab_nom(j));
END LOOP;
END;
205
Gestion des Exceptions
Principe
• Toute erreur (SQL ou applicative) entraîne
automatiquement un débranchement vers le
paragraphe EXCEPTION :
Débranchement involontaire (erreur SQL)
BEGIN
instruction1; ou volontaire (erreur applicative)
instruction2;
……
instructionn;
EXCEPTION
WHEN exception1 THEN
………
WHEN exception2 THEN
………
WHEN OTHERS THEN
………
END;
206
Deux types d’exceptions
• Exceptions SQL
– Déjà définies (pas de déclaration)
• DUP_VAL_ON_INDEX
• NO_DATA_FOUND
• OTHERS
– Non définies
• Déclaration obligatoire avec le n° erreur (sqlcode)
nomerreur EXCEPTION;
PRAGMA EXCEPTION_INIT(nomerreur,n°erreur);
• Exceptions applicatives
– Déclaration sans n° erreur
nomerreur EXCEPTION;
207
Exemple de gestion d’exception (1)
DECLARE
tropemprunt EXCEPTION;
i NUMBER;
BEGIN
i:=1;
SELECT ……
i:=2;
SELECT ……
IF ……… THEN RAISE tropemprunt; ………
EXCEPTION
WHEN NO_DATA_FOUND THEN
IF i=1 THEN ……
ELSE
END IF;
WHEN tropemprunt THEN
………
WHEN OTHERS THEN
………
END;
208
Exemple de gestion d’exception (2)
DECLARE
enfant_sans_parent EXCEPTION;
PRAGMA EXCEPTION_INIT(enfant_sans_parent,-2291);
BEGIN
INSERT INTO fils VALUES ( ……. );
EXCEPTION
WHEN enfant_sans_parent THEN
………
WHEN OTHERS THEN
………
END;
209
Procédures Stockées
Fonctions
Paquetages
Procédures Stockées : Principe (1)
211
Procédures Stockées : Principe (2)
CLIENT SERVEUR
PROCEDURE P(v1,v2) AS
EXECUTE P(p1, p2); P
BEGIN
Ordre SQL et PL/SQL
………..
END P;
Retour résultats
212
Optimisation des procédures
liens avec les objets
Références croisées
Procédure P1 Table1
Procédure P2
Index1
Procédure P3
Table2
Procédure P4
Procédure P5 index2
213
Optimisation des procédures
214
Avantages des procédures stockées
215
Déclaration d’une procédure stockée
216
Exemple 1 de procédure stockée
inscription d’un étudiant
• A partir de sqlplus
• A partir de PL/SQL
inscription(nom,……, dip);
• A partir de pro*c
EXEC SQL EXECUTE
BEGIN
inscription(:nom, ……… ,:dip);
END;
END-EXEC;
218
Exemple 2 : avec retour de valeurs
suppression d’un étudiant
../..
219
Exemple 2 : avec retour de valeurs
suppression d’un étudiant (suite)
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Etudiant'||TO_CHAR(pidEtu)||'inconnu);
retour:=1;
WHEN inscriptions THEN
DBMS_OUTPUT.PUT_LINE('Encore des inscriptions');
retour:=2;
…………
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
retour:=9;
END;
/
220
Exemple 2 : appel avec retour
221
Les Fonctions stockées
222
Déclaration d’une fonction stockée
RETURN(variable);
END;
/
1 ou plusieurs RETURN
223
Exemple 1 de fonction stockée
224
Utilisation d’une fonction
BEGIN
………
IF moy_points_marques(equipe) > 20 THEN ………
END;
225
Exemple 2 de fonction stockée
BEGIN
………
IF bon_client(client,10000) THEN ………
…………
226
Les Paquetages
P1 P3
ETUDIANT
P2
227
Structure d’un paquetage
228
Déclaration d’un paquetage
partie spécification
-- Partie Spécification
229
Déclaration d’un paquetage
partie body
-- Partie body
CREATE [OR REPLACE] PACKAGE BODY nom_package AS
Procédure1(liste des paramètres)IS
…………
BEGIN
…………
END Procédure1;
Fonction1(liste des paramètres) RETURN type IS
…………
BEGIN
…………
RETURN(……);
END Fonction2;
END nom_package;
/
230
Exemple : package ‘étudiant’ (1)
231
Exemple : package ‘étudiant’ (2)
233
Appel d’un programme d’un package
234