Beruflich Dokumente
Kultur Dokumente
SQL
SQL
1. INTRODUCTION..........................................................................................................................................................5 1.1. DFINITIONS............................................................................................................................................................5 1.2. L'OFFRE ORACLE.................................................................................................................................................7 1.3. LES COMMANDES .....................................................................................................................................................8 1.4. LES OBJETS ............................................................................................................................................................9 2. INTERROGATION DES DONNES........................................................................................................................10 2.1. SYNTAXE DU VERBE SELECT ................................................................................................................................10 2.2. INDPENDANCE LOGIQUE EXTERNE..............................................................................................................................12 2.3. ELIMINATION DE DOUBLONS : DISTINCT..................................................................................................................19 EXERCICES SRIE 1.................................................................................................................................................20 2.4. OPRATION DE SLECTION........................................................................................................................................21 2.4.1. Oprateurs arithmtiques ...............................................................................................................................23 2.4.2. Critres de comparaison : oprateurs sur les chanes : LIKE et SOUNDEX................................................23
2.4.3. Critres de comparaison avec l'oprateur IN.................................................................................................27 2.4.4. Critres de comparaison avec l'oprateur BETWEEN...................................................................................28 2.4.5. Critres de comparaison avec une valeur nulle.............................................................................................29 2.4.6. Les oprateurs ANY, SOME et ALL................................................................................................................30 EXERCICES SRIE 2 ................................................................................................................................................32 2.5. EXPRESSIONS ET FONCTIONS .....................................................................................................................................33 2.5.1. Les expressions ...............................................................................................................................................34 2.5.2. Les fonctions ..................................................................................................................................................37 EXERCICES SRIE 3.................................................................................................................................................46 2.6. LES FONCTIONS DE GROUPE / UTILISATION DE FONCTIONS AGGRGATIVES............................................................................47 2.7. PRSENTATION DU RSULTAT TRI SELON UN ORDRE PRCIS.............................................................................................48 EXERCICES SRIE 4.................................................................................................................................................50 2.9. REQUTES MULTI-RELATIONS SANS SOUS -REQUTES : LA JOINTURE OU PRODUIT CARTSIEN....................................................51 2.10. REQUTES MULTI-RELATIONS AVEC LES OPRATEURS ENSEMBLISTES ................................................................................51 2.11. SOUS-INTERROGATIONS NON SYNCHRONISE................................................................................................................54 2.12. LA JOINTURE EXTERNE...........................................................................................................................................56 2.13. SOUS-INTERROGATIONS SYNCHRONISES .....................................................................................................................57 EXERCICES SRIE 5.................................................................................................................................................58 2.14. LA RECHERCHE HIRARCHIQUE.................................................................................................................................59 EXERCICES SRIE 6.................................................................................................................................................61 2.15. LE PARTITIONNEMENT ...........................................................................................................................................62 EXERCICES SRIE 7.................................................................................................................................................63 3. MISE JOUR DES DONNES.................................................................................................................................64 3.1. INSERTION DE LIGNES...............................................................................................................................................65 3.2. MODIFICATION DE LIGNES.........................................................................................................................................66 3.3. SUPPRESSION DE LIGNES...........................................................................................................................................67 3.3.1. VIA LA COMMANDE DELETE...............................................................................................................................67 3.3.2. VIA LA COMMANDE TRUNCATE.........................................................................................................................67 EXERCICES SRIE 8.................................................................................................................................................71 4. LE SCHMA DE DONNES.....................................................................................................................................72 4.1. DFINITION DU SCHMA : ASPECTS STATIQUES...............................................................................................................73 4.1.1. Les types de donnes Oracle...........................................................................................................................73 4.1.2. Cration d'une table........................................................................................................................................75 4.1.3. Cration d'un index.........................................................................................................................................80 EXERCICES SRIE 9.................................................................................................................................................81 4.2. DFINITION DU SCHMA : ASPECTS DYNAMIQUES...........................................................................................................82 4.2.1. Modification d'une table..................................................................................................................................82 EXERCICES SRIE 10...............................................................................................................................................88 4.3. LE DICTIONNAIRE DE DONNES...................................................................................................................................89 EXERCICES SRIE 11...............................................................................................................................................95 4.4. AUTRES OBJETS......................................................................................................................................................96 5. CONCURRENCE D'ACCS......................................................................................................................................97 5.1. TRANSACTION........................................................................................................................................................97 EXERCICES SRIE 12.............................................................................................................................................100 5.2. GESTION DES VERROUS...........................................................................................................................................101 EXERCICES SRIE 13.............................................................................................................................................108 6. LE SCHMA EXTERNE (LES VUES)..................................................................................................................114 6.1. DFINITION DU SCHMA EXTERNE.............................................................................................................................115 6.2. MANIPULATION SUR LES VUES.................................................................................................................................118 EXERCICES SRIE 14.............................................................................................................................................119 1. INTRODUCTION......................................................................................................................................................124 2. STRUCTURE D'UN BLOC PL/SQL.......................................................................................................................124 3. LES VARIABLES UTILISES DANS PL/SQL.....................................................................................................127 3.1. LES DIFFRENTS TYPES DE VARIABLES LOCALES ..........................................................................................................127 3.1.1. Variables de type ORACLE...........................................................................................................................128 3.1.2. Variables de type BOOLEEN........................................................................................................................129
PAGE 2
3.1.3. Variables faisant rfrence au dictionnaire de donnes..............................................................................130 3.1.4. Initialisation des variables ...........................................................................................................................133 3.1.5. Visibilit des variables .................................................................................................................................134 3.2. VARIABLES DE L'ENVIRONNEMENT EXTRIEUR PL/SQL.............................................................................................135 4. LES TRAITEMENTS ...............................................................................................................................................136 4.1. IF : TRAITEMENT CONDITIONNEL .............................................................................................................................136 4.2. BOUCLE DE BASE LOOP : TRAITEMENT RPTITIF.......................................................................................................137 4.3. BOUCLE FOR : TRAITEMENT RPTITIF.....................................................................................................................137 4.4. BOUCLE WHILE : TRAITEMENT RPTITIF................................................................................................................138 5. LES CURSEURS EN PL/SQL..................................................................................................................................140 5.1. DFINITIONS........................................................................................................................................................140 5.2. CURSEUR EXPLICITE..............................................................................................................................................141 5.3. LES ATTRIBUTS D'UN CURSEUR.................................................................................................................................146 5.3.1. %FOUND......................................................................................................................................................147 5.3.2. %NOTFOUND...............................................................................................................................................149 5.3.3. %ISOPEN......................................................................................................................................................150 5.3.4. %ROWCOUNT..............................................................................................................................................150 5.4. SIMPLIFICATION D'CRITURE....................................................................................................................................152 5.4.1. Dclaration de variables ..............................................................................................................................152 5.4.2. Traitement du curseur ..................................................................................................................................153 6. GESTION DES ERREURS EN PL/SQL.................................................................................................................155 7. EXERCICES PL/SQL...............................................................................................................................................160 7.1. EX1 : LES BOUCLES...............................................................................................................................................160 7.2. EX2 : LES CURSEURS .............................................................................................................................................160 7.3. EX3 : LES ERREURS...............................................................................................................................................160 1. PRSENTATION DE SQL*PLUS..........................................................................................................................162 2. LES COMMANDES DE L'DITEUR....................................................................................................................165 3. LES COMMANDES DE L'ENVIRONNEMENT..................................................................................................166 3.1. COMMANDES D'ENTRES / SORTIES..........................................................................................................................167 3.2. COMMANDES DE DIALOGUE.....................................................................................................................................168 3.3. COMMANDES DE FORMATAGE DE RAPPORT..................................................................................................................172 3.4. COMMANDES DE DFINITION DE L'ENVIRONNEMENT.......................................................................................................178 4. EXERCICE.................................................................................................................................................................183 ANNEXES ......................................................................................................................................................................184 ANNEXE A : ..............................................................................................................................................................185 SCHMA ET EXTENSION DE LA BASE ARIENNE...................................................................................................................185 ANNEXE B : VARIABLES D'ENVIRONNEMENT IMPORTANTES SOUS UNIX.............................................188
PAGE 3
SQL
PAGE 4
1. INTRODUCTION
1.1. Dfinitions
Une base de donnes est un ensemble d'informations structures. Un SGBDR (Systme de Gestion de Bases de Donnes Relationnel) est un logiciel qui permet de : - stocker, - consulter, - modifier, - supprimer les donnes de la base de donnes. Un SGBDR stocke les informations dans des tables.
PAGE 5
1.1. Dfinitions (suite ...) SQL (Strutured Query Language) : - est le langage utilis pour accder aux donnes d'une base de donnes. - est normalis. C'est un standard adopt par l'ANSI (American National Standards Institute). ANSI SQL89 - est un langage ensembliste (non procdural) - est un langage universel utilis par : * les administrateurs * les dveloppeurs * les utilisateurs pour : * administrer et contrler * dfinir et dvelopper * manipuler
PAGE 6
Progiciels
Oracle General Ledger Oracle Purchasing Oracle Payables Oracle Assets oracle 8 (sql): - standard et PLSQL - parallle - parallle Query - distribu MediaServer Textserver
Administration et interconnexion
Administration : Sqldba,, sqlloader, server manager, import/export Interconnexion : Sqlnet, Sqlconnect, Oracle Gateway
Outils Groupware et Multimdia Oracle office Textserver WB Oracle mail Oracle Media Object Developper 2000 : Forms, menu, reports, Graphics, book, powerobject, Sqlplus, pro*c, ...
Dveloppement d''applications
PAGE 7
PAGE 8
PAGE 9
FROM [schma].obj [t_alias], [schma].obj [t_alias], ... [WHERE <condition>] [CONNECT BY <condition> [START WITH <condition>]] [GROUP BY expr, expr, ... [HAVING <condition>]] [ORDER BY {expr|pos} [ASC|DESC], [{expr|pos} [ASC|DESC], ...]
PAGE 10
La clause :
est une traduction simple du langage naturel. Elle permet de rechercher les donnes dans la base dans une ou plusieurs tables, dans une ou plusieurs vues. Notes : | : choix entre diffrentes options {} : choix obligatoire [] : facultatif
a) obj : peut tre une TABLE, une VUE ou un SNAPSHOT b) expr est une expression base sur les valeurs d'une colonne c) c_alias est le renommage de l'expression d) t_alias est le renommage d'une table, vue ou shnapshot
PAGE 11
PRIX PROD# N COUT Prix Produit EMP# AUGM. -------- ---------- ---- -------- -------------- -------- ---------... ... ... cote ... ... .... - Redisposition horizontaux des colonnes - Calculs verticaux Renommage Calculs
PAGE 12
2.2. Indpendance logique externe (suite ...) LE RENOMMAGE : - alias d'attributs et - alias des tables Exemple : SQL> SELECT p.pl# num_pilote FROM pilote p;
NUM_PILOTE -------------------1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 16 ligne(s) slectionne(s).
PAGE 13
Exemple : Ecrire de 3 manires diffrentes une projection sur toutes les colonnes de la table PILOTE.
SQL> SELECT * FROM pilote; SQL> SELECT a.* FROM pilote a; SQL > SELECT pilote.* from pilote; Mme rsultat dans tous les cas :
PL# --1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 PLNOM -----------Miranda St-exupry Armstrong Tintin Gagarine Baudry Bush Ruskoi Math Yen Icare Mopolo Chretien Vernes Tournesol Concorde DNAISS -------16/08/52 16/10/32 11/03/30 01/08/29 12/08/34 31/08/59 28/02/24 16/08/30 12/08/38 19/09/42 17/12/62 04/11/55 04/11/45 04/11/35 04/11/29 04/08/66 ADR -------------------Sophia Antipolis Lyon Wapakoneta Bruxelles Klouchino Toulouse Milton Moscou Paris Munich Ithaques Nice Paris Bruxelles Paris TEL SAL ------------ --------93548254 18009 91548254 12300 96548254 24500 93548254 21100 93548454 22100 93548444 21000 44556254 22000 73548254 22000 23548254 15000 13548254 29000 73548211 17000,6 93958211 17000,6 73223322 15000,6 17000,6 15000,6 21000,6
16 ligne(s) slectionne(s).
PAGE 14
PAGE 15
LES CONSTANTES On peut rpter une constante pour chaque ligne ramene. Les constantes sont de type numrique ou alphanumrique (entre ' '). Exemple : SQL> SELECT plnom NOM , 'gagne' GAIN , sal SALAIRE FROM pilote;
NOM -----------Miranda St-exupry Armstrong Tintin Gagarine Baudry Bush Ruskoi Math Yen Icare Mopolo Chretien Vernes Tournesol Concorde GAIN SALAIRE ----- --------gagne 18009 gagne 12300 gagne 24500 gagne 21100 gagne 22100 gagne 21000 gagne 22000 gagne 22000 gagne 15000 gagne 29000 gagne 17000,6 gagne 17000,6 gagne 15000,6 gagne 17000,6 gagne 15000,6 gagne 21000,6
PAGE 16
LES CALCULS HORIZONTAUX Le calcul horizontal fait intervenir une ou plusieurs colonnes d'une mme table dans un tuple. Exemple : SQL> SELECT pl#, sal*12 "SALAIRE MENSUEL" FROM pilote;
PL# SALAIRE MENSUEL --- --------------1 216108 2 147600 3 294000 4 253200 5 265200 6 252000 8 264000 9 264000 10 180000 11 348000 12 204007,2 13 204007,2 14 180007,2 15 204007,2 16 180007,2 17 252007,2 16 ligne(s) slectionne(s).
PAGE 17
2.2. Indpendance logique externe (suite ...) LES CALCULS VERTICAUX Les calculs verticaux font intervenir les valeurs d'une colonne sur l'ensemble ou un sous-ensemble des tuples ramens par une requte. Remarque : l'alias d'une colonne ou d'une expression sera de 30 caractres max. et sera entre "" si l'alias contient des sparateurs. Exemple : SQL> SELECT avtype TYPE, SUM(cap) "CAPACITE TOTALE" FROM avion GROUP BY avtype;
TYPE CAPACITE TOTALE ---------- --------------A300 1300 A320 320 B707 400 B727 250 Caravelle 300 Concorde 650 6 ligne(s) slectionne(s).
PAGE 18
Il est possible de faire un DISTINCT de plusieurs colonnes. Exemple : SQL> SELECT DISTINCT avtype,cap FROM avion;
AVTYPE CAP ---------- --------A300 300 A300 400 A320 320 B707 400 B727 250 Caravelle 300 Concorde 300 Concorde 350
PAGE 19
EXERCICES Srie 1
Alias des attributs Ecrire la requte qui prsente tous les pilotes de la compagnie avec le listing suivant: Numro Nom Adresse Salaire Mensuel Redisposition des attributs Ecrire la requte qui prsente tous les pilotes de la compagnie avec le listing suivant Nom Salaire Mensuel Numro Adresse Alias d'une table Ecrire la requte qui renomme(alias) la relation PILOTE en P dans une requte. Calculs horizontaux Ecrire la requte qui calcule la dure d'un vol. Ecrire une requte qui calcule le salaire annuel SAL_ANN, pour chaque pilote. Calculs verticaux Ecrire une requte qui calcule la somme des salaires des pilotes. Distinct Donner tous les types d'avions de la compagnie
PAGE 20
OPERATEUR
- Les oprateurs logiques (AND, OR) peuvent tre utiliss dans le cas de prdicats multiples. - L'oprateur NOT inverse le sens du prdicat. - Pas de limite dans le nombre de prdicats.
PAGE 21
Exemples : Lister tous les pilotes de la compagnie SQL> SELECT * FROM pilote; ==> - pas de slection - tous les tuples de la relation PILOTE sont ramens
Lister les pilotes qui vivent Nice SQL> SELECT * FROM PILOTE WHERE ADR='Nice'; ==> - slection : clause WHERE - seuls les tuples de la relation PILOTE vrifant la clause WHERE sont ramens
PAGE 22
Dans les critres de la clause WHERE, nous pouvons avoir les oprateurs de comparaison arithmtiques suivants : = : gal,
<= : infrieur ou gal. Exemple : Liste des pilotes qui gagnent plus de 10000 et dont le numro de tel est 93000000 SQL> SELECT plnom FROM pilote WHERE sal > 10000 AND tel='93000000'; 2.4.2. Critres de comparaison : oprateurs sur les chanes : LIKE et SOUNDEX
PAGE 23
Oprateur LIKE Caractres jokers de l'oprateur LIKE : % : remplace 0 n caractres _ : remplace 1 et un seul caractre Exemple 1 : Slectionnez les pilotes dont le nom commence par M. SQL> SELECT * FROM pilote WHERE plnom LIKE 'M%'; Exemple 2 : Slectionnez les pilotes dont le nom contient un A en troisime position. SQL> SELECT * FROM pilote WHERE plnom LIKE '___A%';
PAGE 24
2.4.2. Critres de comparaison : oprateurs sur les chanes : LIKE et SOUNDEX (suite ...)
La clause ESCAPE permet de de-spcialiser les caractres jokers : _ et %. Le caractre prcis derrire la clause ESCAPE permet la recherche des caractres _ et % dans une chane de caractres. Exemple 3 : Slectionnez les pilotes dont le nom contient le caractre _. SQL> SELECT * FROM pilote WHERE plnom LIKE '%*_%' ESCAPE '*';
PAGE 25
2.4.2. Critres de comparaison : oprateurs sur les chanes : LIKE et SOUNDEX (suite ...)
Oprateur SOUNDEX SOUNDEX(chane) est une fonction qui permet une comparaison phontique. SOUNDEX(chane) gnre une valeur numrique sur 4 octets (selon un algorithme prcis). Pour faire une comparaison phontique entre 2 chanes : SOUNDEX(chane1) = SOUNDEX(chane2) Exemple : Slectionnez les pilotes dont le nom ressemble Tonton SQL> SELECT plnom FROM pilote WHERE SOUNDEX(plnom) = SOUNDEX('Tonton');
PLNOM -----------Tintin
PAGE 26
IN est l'oprateur qui permet de tester l'appartenance de la valeur d'une colonne une liste. Exemples : Liste des vols dont la ville d'arrive est Nice ou Paris. SQL> SELECT vol# FROM vol WHERE va IN ('Nice ', 'Paris');
PAGE 27
BETWEEN est l'oprateur qui permet de tester si une valeur appartient un intervalle. Remarque : les bornes sont incluses. Exemple : Salaire et nom des pilotes gagnant entre 15000 et 18000 SQL> SELECT plnom, sal FROM pilote WHERE sal BETWEEN 15000 AND 18000;
PLNOM SAL ------------ --------Math 15000 Icare 17000,6 Mopolo 17000,6 Chretien 15000,6 Vernes 17000,6 Tournesol 15000,6 6 ligne(s) slectionne(s).
PAGE 28
2.4.5. Critres de comparaison avec une valeur nulle IS NULL et IS NOT NULL sont les oprateurs qui permettent de tester si une valeur a t dfinie ou pas pour une colonne. NULL : non dfini. SELECT ... FROM table WHERE coli IS NULL; coli non renseigne ou SELECT ... FROM table WHERE coli IS NOT NULL; coli renseigne Remarque : pour tester l'absence de valeur , ne pas utiliser = NULL ou != NULL. Note : la syntaxe de comparaison est la suivante : colonne IS NULL | IS NOT NULL
Exemple : Nom des pilotes dont le numro de tl. n'est pas renseign SQL> SELECT plnom FROM pilote WHERE tel IS NULL;
PAGE 29
2.4.6. Les oprateurs ANY, SOME et ALL Ils se combinent avec l'un des oprateurs arithmtiques : {= | != | > | >= | < | <= } ANY : au moins 1 ...
Exemple 1 : Slectionnez les pilotes dont l'adresse est 'Nice' ou 'Paris' SQL> SELECT plnom FROM pilote WHERE adr = ANY ('Nice', 'Paris'); Remarques : - l'oprateur ANY est quivalent l'oprateur SOME. - la condition =ANY est quivalent l'oprateur IN.
PAGE 30
Exemple 2 : Slectionnez les pilotes dont le salaire n'est pas un nombre rond. SQL> SELECT plnom FROM pilote WHERE sal != ALL (12000, 13000, 14000, 15000, 16000, 17000, 18000, 19000, 20000, 21000, 22000, 24000, 25000, 26000, 27000, 28000,29000); Remarque : La condition != ALL est quivalente la condition NOT IN.
PAGE 31
EXERCICES Srie 2
"Quels sont les noms de pilotes comportant un 't' en quatrime position ou dont le nom se prononce 'Bodri'.
"Quels sont les avions dont la capacit est comprise entre 250 et 310 ?"
"Quels sont les pilotes dont l'adresse ou le tlphone sont inconnus ?" "Nom des pilotes ayant un 'a' et un 'e' dans leur nom" "Nom des pilotes ayant 2 'o' dans leur nom " "Nom des pilotes dont le numro de tlphone est renseign"
PAGE 32
PAGE 33
Oprateur
- Oprateurs arithmtiques : + - * / - Oprateur sur chanes de caractres : || - Pas d'oprateurs spcifiques aux dates. Exemple1 : Simuler une augmentation de 10% des salaires des pilotes SQL> SELECT sal * 1.10 AUGMENTATION FROM pilote; Exemple 2 : Pilotes dont le salaire est suprieur 2 fois 10000 SQL> SELECT * FROM pilote WHERE sal > 10 000 * 2;
PAGE 34
Exemple 3 : ajouter 3 jours une date '08-DEC-90' + 3 = '11-DEC-90' Exemple 4 : enlever 3 jours une date '11-DEC-90' - 3 = '08-DEC-90' Exemple 5 : nombre de jours entre 2 dates date1 - date 2 = nbjours
PAGE 35
Exemple 6 : Noms et adresses des pilotes SQL> SELECT plnom || '---->' || adr FROM pilote;
PLNOM||'---->'||ADR ------------------------------------Miranda ---->Sophia Antipolis St-exupry ---->Lyon Armstrong ---->Wapakoneta Tintin ---->Bruxelles Gagarine ---->Klouchino Baudry ---->Toulouse Bush ---->Milton Ruskoi ---->Moscou Math ---->Paris Yen ---->Munich Icare ---->Ithaques Mopolo ---->Nice Chretien ----> Vernes ---->Paris Tournesol ---->Bruxelles Concorde ---->Paris scott ---->Nice Conficius ---->Pekin 18 ligne(s) slectionne(s).
PAGE 36
2.5.2. Les fonctions Fonctions numriques - ABS(n) : valeur absolue de n - SIGN(n) : signe de n (-1 ou 0 ou +1) - CEIL(n) : plus petit entier >= n - FLOOR(n) : plus grand entier <= n - MOD(m,n) : reste de la division de m par n - POWER(m,n) : m lev la puissance n - SQRT(n) : racine carre de n (message d'erreur si n < 0) - ROUND(n,[m]) : arrondi de n 10-m Ex : ROUND(125.2) = 125 ROUND(1600,-3) = 2000 ROUND(1100,- 3) = 1000 ROUND(345.343,2) = 345.34 ROUND(345.347,2) = 345.35 - TRUNC(n,[m]) : n tronqu 10-m Ex : TRUNC(2500,-3) = 2000 TRUNC(2400,-3) = 2000 TRUNC(345.343,2) = 345.34 TRUNC(345.347,2) = 345.34
PAGE 37
Fonctions caractres - LENGTH(chane) : longueur de la chane - UPPER(chane) : toutes les lettres de la chane en majuscules - LOWER(chane) : toutes les lettres de la chane en minuscules - INITCAP(chane) : premire lettre de chaque mot de la chane en majuscules, les autres en minuscules) - LPAD(chane,lg,[chane]) : complter gauche par une chane de caractres sur une longueur donne. Exemple : LPAD('DUPOND',10,'*# ') = '*#*#DUPOND' - RPAD(chane,lg,[chane]) : complter droite par une chane de caractres sur une longueur donne. Exemple : RPAD('DUPOND',10,'* ') = 'DUPOND****' Remarque : LPAD et RPAD peuvent tronquer une chane si lg < longueur totale de la chane.
PAGE 38
2.5.2. Les fonctions (suite ...) - LTRIM(chane[,caractres]) : suppression gauche de caractres dans la chane. Exemple : LTRIM('DUPOND','DU ') = 'POND' - RTRIM(chane[,caractres]) : suppression droite de caractres dans la chane. Exemple : RTRIM('DUPOND','UD ') = 'DUPON' - SUBSTR(chane,position[,longueur]) : extraction d'une chane partir d'une position donne et sur une longueur donne Exemple : SUBSTR('DUPOND',2,3) = 'UPO' - INSTR(chane, sous_chane,[,position[,n]]) : recherche de la position de la n ime occurence d'une chane de caractres dans une autre chane de caractres partir d'une position donnes. Exemple : INSTR('DUPOND','D',1,2) = 6
PAGE 39
2.5.2. Les fonctions (suite ...) - REPLACE(chane,car[,chane]) : remplace un ensemble de caractres Exemples : REPLACE('TUTU','U', 'OU') = 'TOUTOU' REPLACE('TATA','T') = 'AA' - TRANSLATE(chane,car_source,car_cible) : trancodage de certains caractres par d'autres caractres dans une chane de caractres. Exemples : TRANSLATE(plnom,'AM','12') : - le A est remplac par 1 - le M est remplac par 2 dans les noms des pilotes - SOUNDEX(chane) : (voir 2.7.2) - ASCII(chane) : donne la correspondance ASCII du premier caractre de la chane. Exemple : ASCII('ADFGRSE') = 65 - CHR(n) : caractre correspondant la valeur de n en ASCII. Exemple : CHR(65) = 'A'
PAGE 40
2.5.2. Les fonctions (suite ...) Fonctions date : - LAST_DAY(date) : dernier jour du mois d'une date donne - NEXT_DAY(date, jour) : date du prochain jour partir d'une date donne. - ADD_MONTHS(date,n) : ajoute n mois une date donne. - MONTHS_BETWEEN(date1,date2) : nombre de mois entre 2 dates. - ROUND(date[,'precision']) : arrondi d'une date en fonction de la prcision Exemples : SYSDATE = '12-JUL-96' ROUND(sysdate,'MM') = '01-JUL-96' ROUND(sysdate + 4 ,'MM') = '01-AUG-96' ROUND(sysdate,'YY') = '01-JAN-97' - TRUNC(date[,'precision']) : truncature d'une date en fonction de la prcision Exemples : TRUNC(sysdate,'MM') = '01-JUL-96' TRUNC(sysdate + 4 ,'MM') = '01-JUL-96' TRUNC(sysdate,'YY') = '01-JAN-96'
PAGE 41
2.5.2. Les fonctions (suite ...) Fonctions de conversion de types : - TO_NUMBER(chane) : conversion d'une chane de caractres en nombre Exemple : TO_NUMBER('567') = 567 - TO_CHAR(chane[,'format']) : conversion d'une expression (date ou numrique) en chane de caractres selon un format de prsentation. - TO_DATE(chane[,'format']) : conversion d'une chane en date selon un format. Quelques formats numriques : 9 0 $ , . Affichage de cette valeur si elle est diffrente de 0 Affichage de zros gauche pour une valeur zro Affichage de la valeur prfixe par le signe '$ ' Affichage de ',' l'endroit indiqu Affichage du point dcima l'endroit indiqu
PAGE 42
2.5.2. Les fonctions (suite ...) Quelques formats de conversion de date : TO_CHAR(date[,'format']) FORMAT tant la combinaison de codes suivants: YYYY YY MM DD HH HH24 MI SS ... Exemple : SELECT TO_CHAR(SYSDATE,'DD MM YYYY HH24 : MI') FROM dual; ==> 01 07 1996 10 : 24 Anne 2 derniers chiffres de l'anne numro du mois numro du jour dans le mois heure sur 12 heures heure sur 24 heures minutes secondes
PAGE 43
Pour avoir les dates en lettres utiliser les formats suivants : YEAR anne en toutes lettres MONTH mois en toutes lettres MON nom du mois sur 3 lettres DAY nom du jour DY nom du jour sur 3 lettres SP nombre en toutes lettres ... Exemple : TO_CHAR(SYSDATE,' LE DD MONTH YYYY A HH24 : MI') ==> LE 26 SEPTEMBER 1996 A 16 : 30
PAGE 44
2.5.2. Les fonctions (suite ...) Fonctions diverses : NVL(expr,valeur) ==> Si expr IS NULL Alors valeur Sinon expr Finsi Exemple : SQL> SELECT NVL(sal,0) FROM pilote; DECODE(expression, valeur1, result1, [, valeur2, result2] ... [,defaut] ==> Si expression = valeur1 Alors result1 Sinon Si expression = valeur2 Alors result2 Sinon defaut Finsi Finsi Remarque : result1, result2, ... defaut peuvent tre de types diffrents.
PAGE 45
EXERCICES Srie 3
"Lister les pilotes avec leur salaire tronqus au millier" "Lister les pilotes avec leur salaire. Pour ceux gagnat 17000,6 remplacer le salaire par '****' " "Slectionner les pilotes et leur tlphone. Pour ceux dont le tlephone n'est pas renseign, mettre ? "
PAGE 46
- VARIANCE(expr) variance Remarques : - les valeurs NULL sont ignores. - COUNT(*) permet de compter les lignes d'une table. Exemple : SQL> SELECT adr, AVG(sal), COUNT(sal), MAX(sal), MIN(sal), STDDEV(sal),SUM(sal), VARIANCE(sal) FROM pilote GROUP BY adr ;
PAGE 47
Un rsultat peut tre tri grce la clause ORDER BY - de faon ascendante ASC ou - descendante DESC. Remarques : - par dfaut en Oracle le tri est toujours ascendant. - 16 critres de tri maximum. - dans un tri par ordre croissant les valeurs NULL apparaissent toujours en dernier Exemple : SQL> SELECT plnom, adr FROM pilote ORDER BY plnom;
PAGE 48
PAGE 49
EXERCICES Srie 4
"Ecrire une requte qui donne le salaire du pilote qui gagne le plus : <valeur calculer> "Max salaire Pilote " "Quels sont les noms, l'adresse et le salaire des pilotes de la compagnie, tris en ordre croissant sur l'adresse, et pour une mme adresse en ordre dcroissant sur le salaire ? " "Ecrire une requte qui recherche si l'utilisateur courant d'Oracle est un pilote ?" "Ecrire une requte qui rend ROWID, USER, SYSDATE, Numros de vol de tous les vols effectus la date d'aujourd'hui par le pilote Numro 4 ?". L'heure de dpart et d'arrive doivent apparatre dans la liste des colonnes de projection.
PAGE 50
PAGE 51
L'objectif est de manipuler les ensembles ramens par plusieurs SELECT l'aide des oprateurs ensemblistes. Les oprateurs ensemblistes sont : - l'union : UNION, - l'intersection : INTERSECT et - la diffrence : MINUS Principe : SELECT ... FROM ... WHERE ... oprateur ensembliste SELECT ... FROM ... WHERE ... oprateur ensembliste SELECT ... FROM ... WHERE ... ... SELECT ... FROM ... WHERE ... [ORDER BY] ==> ensemble ==> ensemble ==> ensemble ==> ensemble
PAGE 52
Rgles : - mme nombre de variables en projection - correspondance du type - colonne de tri rfrences par numro d'ordre Rsultat : - les titres des colonnes sont ceux du premier SELECT - la largeur de la colonne est celle de la plus grande largeur parmi les SELECT - opration distincte implicite (sauf UNION ALL)
PAGE 53
PAGE 54
L'oprateur EXISTS : la sous-interrogation ramne VRAI s'il existe au moins une ligne en rponse la sous-interrogation, FAUX sinon. L'interrogation principale s'excute si VRAI. Syntaxe : SELECT ... FROM ... WHERE [NOT] EXISTS (SELECT ...)
PAGE 55
PAGE 56
PAGE 57
EXERCICES Srie 5
Requtes avec alias obligatoires (auto-jointure) et prfixage d'attributs(naming) "Donner toutes les paires de noms de pilotes distincts, habitant la mme ville" Requtes effectuant une jointure syntaxique "Donner tous les noms des pilotes qui ont des noms d'avions ?" "Ecrire la requte qui donne les noms des pilotes qui conduisent un A300 ou B727 ?". "Tester la requte suivante : (SELECT PILOTE#, VD, VA FROM vol) INTERSECT (SELECT AVION#, VD, VA FROM VOL ); Quel est sa signification en langage naturel ? Sous-requtes connectes par les oprateurs ANY, ALL, EXISTS, IN. "Quel est le nom des avions dont la capacit est suprieure la capacit de chaque avion localis Nice ?" "Quel est le nom des avions dont la capacit est au moins gale celle d'un avion localis Nice ? " "Quel est le nom des pilotes assurant un vol au dpart de Nice ?" "Quel est le nom des pilotes assurant au moins un vol ?" "Quel est le nom des pilotes dont le salaire est suprieure au salaire maximum de tous les pilotes effectuant un vol au dpart de Paris ?"
Requtes multi-relations avec sous-requtes indpendantes "Quels sont les noms des pilotes qui gagnent plus que le pilote nr. 5?" "Donner le nom des pilotes, et pour ceux qui sont en service, la liste des numros de vols qu'ils assurent ?"
PAGE 58
PAGE 59
2.14. La recherche hirarchique (suite ...) Limites : - une requte hirarchique ne doit pas contenir de jointure - une requte hirarchique ne peut tre effectue sur une vue de jointure - la clause ORDER BY est prioritaire la clause CONNECT BY Remarque : ORACLE dtecte les boucles ventuelles dans le CONNECT BY. L'ordre est interrompu et un message est envoy l'utilisateur. Remarque sur le prdicat de slection : - si il est plac l'extrieur de la clause CONNECT BY, il limine certaines valeurs uniquement (le parcours de l'arborescence n'est pas interrompu) - si il est plac l'intrieur de la clause CONNECT BY, il limine certaines valeurs et leurs dpendances (le parcours de l'arborescence est interrompu).
PAGE 60
EXERCICES Srie 6
"Quels sont les vols en correspondance (direct ou indirecte) au dpart de Paris ?" Note : - NICE ne doit pas tre une escale de dpart.
PAGE 61
2.15. Le partitionnement
(voir 2.9.)
Le partitionnement permet de regrouper les lignes rsultat en fonction des diffrentes valeurs prises par une colonne spcifie. SELECT ... FROM <Nom_table> , ... GROUP BY<Colonne> [, <colonne>, ...] [HAVING <condition>] ; La spcification de la clause GROUP BY entrane la cration d'autant de sous-tables qu'il y a de valeurs diffrentes pour la colonne de partitionnement spcifie. De mme que la clause WHERE joue le rle de filtre pour la clause SELECT, la clause HAVING joue le rle de filtre pour la clause GROUP BY. L'excution de la clause HAVING sera effectue juste aprs celle du GROUP BY, pour slectionner les sous-tables qui satisfont la condition spcifie. Contraintes : - la colonne de partitionnement doit figurer dans la clause SELECT. - un seul GROUP BY est autoris par requte. -pas de GROUP BY dans une sous-requte.
PAGE 62
EXERCICES Srie 7
"Pour chaque ville de localisation d'avions de la compagnie (sauf "Paris") donner le nombre, les capacits minimales et maximales d'avions qui s'y trouvent ?" "Quels sont les pilotes (avec leur nombre de vols ) parmi les pilotes N 1, 2, 3 , 4 et 13 qui assurent au moins 2 vols ?" "Quelle est la capacit moyenne des avions par ville et par type ? "
PAGE 63
PAGE 64
Remarque : si toutes les valeurs des colonnes de la table sont insrees, il est inutile de prciser les colonnes. Si seules quelques valeurs sont insres, prciser les colonnes. Exemples : SQL> insert into pilote(pl#,plnom,dnaiss,sal) values(2, 'St-exupry', '16/10/32', 12300.0); SQL> insert into avion values(7, 'Mercure', 300, 'Paris', 'En service'); SQL> insert into vol2 select * from vol where vd='Paris';
PAGE 65
WHERE <critres_de_qualification>; Exemple : Augmenter les pilotes habitant Nice de 10% SQL> UPDATE pilote SET sal = sal *1.10 WHERE adr='Nice';
PAGE 66
TRUNCATE TABLE nom_table [DROP STORAGE | REUSE STORAGE] Cette commande permet d'effectuer des suppressions rapides. C'est une commande du LDD d'Oracle et ce titre quivaut un commit. Exemple : SQL> TRUNCATE TABLE pilote;
Remarque : Autre manire de supprimer les donnes d 'une table : - la supprimer, - la recrer Exemple : SQL> DROP TABLE pilote; SQL> CREATE TABLE pilote(...);
PAGE 68
1re option DELETE : - la suppression avec DELETE consomme de nombreuses ressources : espace RedoLog, rollbck segment, ... - pour chaque ligne supprime, des triggers peuvent se dclencher - la place prise par les lignes de la table n'est pas libre. Elle reste associe la table.
2me option DROP : - tous les index, contraintes d'intgrit et triggers associs la table sont gelement supprims - tous les GRANT sur cette table sont supprims
PAGE 69
3me option TRUNCATE : - truncate est plus rapide car cette commande ne gnre pas d'informations (rollback) permettant de dfaire cette suppression. L'ordre est valid (commit) de suite. - truncate est irrversible pour la mme raison. - les contraintes, triggers et autorisations associs la table ne sont pas impacts - l'espace prise par la table et ses index peut tre libr (drop storage) - les triggers ne sont pas dclenchs
PAGE 70
EXERCICES Srie 8
Effectuer des insertions respectivement dans pilote, avion et vol. Vrifier si les contraintes l'intgrits structurelles (entitit, domaine et de rfrence) sont prises en comptes. Vrifier aussi les valeurs nulles. Note : insrer un pilote ayant votre nom de login oracle et 2 vols effectus par ce pilote.
Effectuer une insertion dans la table PILOTE2 via une sous-requte sur PILOTE. Mettre jour le salaire du pilote numro 3 19000 F et Valider. Supprimer le pilote numro 11 et invalider. Supprimer les lignes de la tables PILOTE2 via TRUNCATE. Tentez un ROLLBACK.
PAGE 71
4. Le schma de donnes
Les chapitres pcdents nous ont permis d'aborder l'aspect Manipulation de Donnes (LMD) du langage SQL.
Ce chapitre va nous permettre d'aborder l'aspect dfinition des donnes : le Langage de Dfinition de Donnes (LDD).
PAGE 72
NUMBER(n1[, n2]) : n1 = nombre de digits du dcimal (de 1 38) n2 = nombre de digits aprs la virgule ROWID : Chane hex. reprsentant l'adresse unique d'une ligne d'une table.
Remarque : une seule colonne de type LONG ou LONG RAW par table. 4.1.1. Les types de donnes Oracle (suite ...)
PAGE 73
Comparaison varchar2 / char * Comparaison 1: Oracle ajoute des blancs au char le plus petit pour que les 2 chanes aient la mme longueur. Oracle compare ensuite car. par car. Ds qu'il y a une diffrence il conclut lequel est plus grand. ==> utilise si les 2 valeurs comparer sont de type CHAR * Comparaison 2 : Oracle compare car. par car. Ds qu'il y a une diffrence il conclut lequel est plus grand. Si on a atteint la fin du 1er varchar sans rencontrer de diffrence avec le deuxime, c'est le plus long (le 2me) qui est considr comme le plus grand. ==> utilise ds qu'une des 2 valeurs est de type varchar2 dans l'expression. COMP1 'ab' > 'aa' 'ab' > 'a ' 'ab' > 'a' 'ab' = 'ab' 'a ' = 'a' COMP2 'ab' > 'aa' 'ab' > 'a ' 'ab' > 'a' 'ab' = 'ab' 'a ' > 'a'
PAGE 74
4.1.2. Cration d'une table CREATE TABLE <user>.<nom_table> {( <def_colonne1>, <def_colonne2>, ... <def_colonne2> [contrainte_table] )] | as subquery}; Avec : <def_colonne> : nom_colonne type_colonne [DEFAULT expr] [contrainte_col] [contrainte_col] : CONSTRAINT <nom_contrainte> [NOT] NULL | UNIQUE |PRIMARY KEY | REFERENCES [<user>].<table>(col...) [ON DELETE CASCADE) | CHECK (condition)
PAGE 75
[contrainte_table] : CONSTRAINT <nom_contrainte> UNIQUE (col...) | PRIMARY KEY (col...) | FOREIGN KEY (col...) REFERENCES table (col...) [ON DELETE CASCADE) | CHECK (condition)
PRIMARY KEY vs UNIQUE toutes les valeurs sont distinctes P.K. oui Unique oui pas oblig.
la colonne est dfinie en NOT NULL oui dfinit l'identifiant prcis une seule fois par table fait lien avec REFERENCES oui oui oui
PAGE 76
4.1.2. Cration d'une table (suite ...) EXEMPLE : Dfinition du schma de la base de donnes arienne. create table pilote( pl# number(4) primary key, plnom char(12) not null unique, dnaiss date not null, adr char(20) default 'PARIS', tel char(12), sal number(7,4) not null CHECK(sal < 70000.0) ); create table avion( av# number(4) primary key, avtype char(10) CONSTRAINT chk_type CHECK(avtype IN ('A300', 'A310', 'A320', 'B707', 'Caravelle', 'B727', 'Concorde'), cap number(4) not null, loc char(20) not null, remarq long );
PAGE 77
create table vol( vol# number(4) PRIMARY KEY, pilote# number(4) CONSTRAINT fk_pilote REFERENCES PILOTE(PL#) ON DELETE CASCADE, avion# number(4) NOT NULL, vd char(20), va char(20), hd number(4) NOT NULL, ha number(4) CONSTRAINT ck_ha CHECK(HA > HD), dat date, FOREIGN KEY (avion#) REFERENCES AVION(AV#)
);
PAGE 78
4.1.2. Cration d'une table (suite ...) Remarques : - les mots cls PRIMARY KEY et REFERENCES permettent dfinir des contraintes d'intgrit d'entit et de rfrence. Sous Oracle 7 ils sont totalement supports mais servent la documentation sous Oracle 6 ; - l'option DELETE CASCADE permet de propager les suppressions ; - le mot cl FOREIGN KEY est identique REFERENCES sauf qu'il s'applique au niveau table ; - le mot cl CONSTRAINT permet de nommer explicitement les contraintes ; - l'option CHECK permet de contrler par exemple les contraintes d'intgrit de domaine ; - la contrainte NOT NULL permet d'indiquer que la colonne doit toujours tre renseigne ; - la clause DEFAULT permet de fixer une valeur par dfaut - la clause UNIQUE permet d'liminer les doublons (un index est implicitement cr idem pour primary key).
PAGE 79
4.1.3. Cration d'un index Les index premettent d'accder plus rapidement aux donnes. Ils servent galement grer l'unicit des cls primaires : un index UNIQUE est cr sur la ou les colonnes identifiant la cl primaire. Les index sont stocks dans une structure externe la table. On peut crer plusieurs index sur une table. Les index sont mis jour par ORACLE lors des ordres INSERT, UPDATE, DELETE. La cration d'un index se fait grce la clause suivante : CREATE [UNIQUE] INDEX nom_index ON nom_table(colonne, colonne, ...) ; Note : Dans Oracle V6, le seul moyen d'assurer l'intgrit d'entit est de crer un index unique sur la cl primaire. Les inconvnients sont : les risques de suppression et d'oubli de la cration de l'index.
PAGE 80
EXERCICES Srie 9
"Crer une relation FORMATION, qui contiendra les renseignements suivants : - le numro de pilote , - le type de formation (ATT, VDN, PAI, ...) - type d'appareil - date de la formation " Attention : - un pilote une date donne participe une formation - un type d'appareil doit tre : 'A300', 'A310', 'A320', 'B707' , 'Caravelle', 'B727' ou 'Concorde' Crer la cl primaire (comme en V6 : sans utiliser la clause PRIMARY KEY) sur le numro du pilote et la date de formation. Crer un index unique sur le plnom de la table pilote que constatez vous Crer galement un index sur la colonne TYPEAPP de la table Formation
PAGE 81
* d'ajouter de nouvelles contraintes d'intgrit ALTER TABLE [<nom_user>.] <Table> ADD <table_contrainte> ...
PAGE 82
4.2.1. Modification d'une table (suite ...) * de redfinir une colonne (type de donnes, taille, valeur par dfaut) ALTER TABLE [<nom_user>.] <Table> MODIFY <def_col> ... avec <def_col> : (colonne[type_de_donnes] [DEFAULTexpr] [col_contrainte]) ; Note : NOT NULL est la seule contrainte pouvant tre ajoute par MODIFY. * de modifier les paramtres de stockages (v. cours admin.) * d'activer/dsactiver/supprimer une contrainte d'intgrit ALTER TABLE [<nom_user>.] <Table> ENABLE <clause> | DISABLE <clause> | DROP <clause> ... avec <clause> : UNIQUE (col1[,col2 ...]) [CASCADE] | PRIMARY KEY [CASCADE] | CONSTRAINT <nom_contrainte> [CASCADE] * d'allouer explicitement des extensions de fichiers (v. adm)
PAGE 83
4.2.1. Modification d'une table (suite ...) Restrictions aux modifications des tables AJOUT - on peut ajouter une colonne de type NOT NULL uniquement si la table est vide - on peut ajouter une contrainte uniquement au niveau table MODIFICATION - on peut retrcir une colonne uniquement si elle est vide - on peut passer une colonne de NULL autoris NOT NULL uniquement si la colonne ne contient pas de valeur NULL - on ne peut modifier une contrainte SUPPRESSION - on ne peut supprimer une colonne - on peut supprimer une contrainte par son nom
PAGE 84
4.2.1. Modification d'une table (suite ...) Commentaires sur les tables ou les colonnes Le commentaire sur une colonne se fait par la clause SQL suivante : COMMENT ON TABLE nom_table | COLUMN table.colonne IS chane ; Note : les commentaires sont insrs dans le Dictionnaire de Donnes.Leur consultation se fait entre autre travers la vue USER_COL_COMMENTS. Exemple : SQL> COMMENT ON COLUMN pilote.pl# IS 'Numro identifiant le pilote'; Pour supprimer un commentaire : SQL> COMMENT ON COLUMN pilote.pl# IS '';
PAGE 85
Consultation de la structure d'une table Clause de listage des colonnes d'une table : DESC[RIBE] [user.]nom_table ; La clause DESCRIBE permet de lister les colonnes d'une table. L'utilisateur doit tre propritaire de la table ou en avoir reu les droits. Exemples : SQL> DESC pilote; SQL> DESCRIBE vol;
PAGE 86
4.2.1. Modification d'une table (suite ...) Synonyme d'une table CREATE [PUBLIC] SYNONYM [<user>.]<nom_synonyme> FOR [<user>.]<nom_table> ; Un synonyme est utilis pour la scurit et la facilit de manipulation. ATTENTION : son utilisation abusive augmente le temps d'excution des requtes. Notes : - [Public] : le synonyme est accessible par tous les users. - sert rfrencer les objets sans indiquer leur propritaire - sert rfrencer les objets sans indiquer leur base - fournit un autre nom un objet : alias - un synonyme priv doit avoir un nom distinct dans le schma d'un utilisateur - un synonyme public peut avoir le nom de la table dans son schma. Remarque : on peut galement crer des synonymes pour des vues, squences, procdures, ... et mme synonymes.
PAGE 87
EXERCICES Srie 10
"Ajouter la colonne AGE la table PILOTE. Un pilote doit avoir entre 25 et 60 ans. "Ajouter une contrainte d'intgrit de rfrence au niveau table la relation FORMATION (colonne PILOTE)" "Modifier la colonne PL# de la table PILOTE en number(5). Ajouter une valeur par dfaut la colonne VD dans VOL. "Associer l'attribut SALAIRE d'un pilote un commentaire puis s'assurer de son existence. Comment supprime - t-on un commentaire ?" "Consulter la liste des colonnes de la table FORMATION" "Attribuer un synonyme "Conducteurs" la table PILOTE.
PAGE 88
PAGE 89
- obj$ : objets dfinis sur la base de donnes - tab$ : tables dfinies dans la base de donnes y compris les clusters - ind$ : index dfinis dans la base de donnes - col$ : colonnes dfinies dans la base de donnes - ts$ : tablespaces dfinis dans la base de donnes ...
Notes : - tables accessibles uniquement par l'utilisateur SYS. - tables se terminant par un $ - il est interdit de mettre jour directement ces tables.
PAGE 90
Les vues - accessible_tables : contient les tables et vues accessibles par l'utilisateur - all_catalog : tables, vues , synonym, ... accessibles par le user - all_tab_columns : synonyme de la table accessible_table
- all_tab_grants : synonyme de la table table_privileges - all_tables : description des tables accessibles par un user - all_users : informations sur l'ensemble des users d'une base - all_views : textes des vues accessibles par un utilisateur - ... - dba_catalog : toutes les tables, les vues, synonymes et squences de la base
PAGE 91
- dba_data_files: informations sur les fichiers de la base de donnes - dba_free_space : espace restant libre dans les fichiers de la base - dba_users : informations sur l'ensemble des users de la base - dba_tables : informations sur l'ensembles des tables de la base - dba_views : texte de toutes les vues de la base - ... - user_catalog propritaire : tables, vues, ... dont l'utilisateur est
- user_free_space : Extent libre dans un tablespace accessible par le user - user_indexes : Descriptions des index de l'utilisateur - user_tables : tables dont l'utilisateur est propritaire
PAGE 92
- user_views : textes des vues de l'utilisateur - user_users : info sur le user courant - ... Notes : USER_* sont des vues donnant des informations sur les objets dont l'utilisateur est propritaire ALL_* sont des vues donnant des informations sur les objets auxquels l'utilisateur a accs DBA_* sont des vues sur tous les objets de la base - les vues commenant par dba_ sont accessibles par le DBA - les vues commenant par all_ et user_ sont accessibles le DBA et l'utilisateur.
PAGE 93
4.3. Le dictionnaire de donnes (suite ...) Les synonymes - cat - clu - cols - dict - ind - seq - syn - tab ...
- v$process - v$bgprocess - v$licence - v$lock - v$parameter - v$session - v$transaction
: synonyme de la vue user_catalog : synonyme de la vue user_clusters : synonyme de la vue user_tab_columns : synonyme de la vue DICTIONARY : synonyme de la vue user_indexes : synonyme de la vue user_sequences : synonyme de la vue user_synonyms : synonyme de la vue user_tables
- ... Note : - ce sont les tables dynamiques de gestion des performances - ces tables commences par un v$.
PAGE 94
EXERCICES Srie 11
"Quels sont les noms des colonnes de la table VOL ?" "Quels sont les tables et les vues de votre schma ?" Notes :-col ou cols est un synonyme de user_tab_columns -cat est un synonyme de user_catalog -Tabletyp est le type de la colonne (une table, une vue...) "Quelles sont les tables qui contiennent une colonne PLNUM ?" "Quelles sont les vues du dictionnaire d'Oracle (voir DICT ou DICTIONARY) ? " "Quels sont les tables appartenant l'utilisateur SCOTT ?" "Quels sont les contraintes existant dans votre schma pour la table PILOTE ?"
PAGE 95
PAGE 96
5. Concurrence d'accs
5.1. Transaction
Dfinition Une transaction (unit logique de traitement) est une squence d'instructions SQL qui doivent s'excuter comme un tout.
PAGE 97
Dbut et fin d'une transaction Oracle Une transaction dbute : - la connexion un outil - la fin de la transaction prcdente.
Une transaction SQL se termine : - par un ordre COMMIT ou ROLLBACK - par un ordre du LDD valide : CREATE, DROP, RENAME, ALTER, ... ==> La transaction est valide : COMMIT ; - la dconnexion d'un outil : DISCONNECT, EXEC SQL, RELEASE). ==> La transaction est valide : COMMIT ; - lors d'une fin anormale du processus utilisateur. ==> La transaction est invalide : ROLLBACK.
PAGE 98
5.1. Transaction (suite ...) Contrle du droulement d'une transaction Les clauses de contrle du droulement des transactions sont : COMMIT [WORK] SAVEPOINT savepoint_id ROLLBACK [WORK] [TO savepoint_id] COMMIT : - valide l'ensemble des modifications depuis le dbut de la transaction - libre les verrous ROLLBACK : - restitue les donnes leur valeur de dbut de transaction - libre les verrous ROLLBACK TO SAVEPOINT : 1. Pose d'tiquette : SAVEPOINT nom 2 . Annulation partielle : ROLLBACK TO [SAVEPOINT] nom Note : - l'utilisation de WORK est facultative - le paramtre SAVEPOINT dans init.ora fixe le nombre de points de sauvegardes : "savepoints" (par dfaut 5)
PAGE 99
EXERCICES Srie 12
T1 : INSERT INTO pilote values(18, 'Conficias', '19-SEP-42', 'Pekin', '13548254', 39000.0,null); COMMIT ; UPDATE pilote SET plnom='Conficios' WHERE plnom='Conficias'; ROLLBACK ; UPDATE pilote SET plnom='Conficies' WHERE plnom='Conficias'; SAVEPOINT updt_conf1; UPDATE pilote SET plnom='Conficius' WHERE plnom='Conficies'; SAVEPOINT updt_conf2 ; UPDATE pilote SET plnom='Conficios' WHERE plnom='Conficius'; ROLLBACK TO updt_conf1 ; UPDATE pilote SET plnom='Conficius' WHERE plnom='Conficies'; UPDATE pilote SET sal=40000.0 WHERE plnom='Conficius'; COMMIT ;
T2 : T3 :
PAGE 100
PAGE 101
5.2. Gestion des verrous (suite ...) Verrous ligne (TX) : implicitement, un verrou exclusif est pos lors d'un ordre : - INSERT ou - UPDATE ou - DELETE ou - SELECT ... FOR UPDATE Les autres utilisateurs ne pourront accder aux ressources concernes jusqu' la libration des verrous. Verrous table (TM) : Si une transaction pose un verrou ligne exclusif, il est galement pos automatiquement un verrou table sur la table concerne. Un verrou table est pos lors d'un ordre : - INSERT ou - UPDATE ou - DELETE ou - SELECT ... FOR UPDATE ou - LOCK TABLE
PAGE 102
5.2. Gestion des verrous (suite ...) Ce verrou table vite la pose de tout verrou exclusif sur la table pour des oprations de DDL (Data Definition Language) Ainsi il vite qu'un autre utilisateur puisse modifier ou supprimer la table ... lors d'une interrogation, modification ou suppression de lignes. Les diffrents types de Verrous : X : Verrou EXCLUSIF permet aux autres d'interroger une table mais leur interdit les modifications dans la table et la pose d'un verrou S S : Verrou SHARE favorise la lecture dans une table mais interdit les MISES A JOUR (X, SRX, RX) RS: Verrou ROW SHARE (SHARE UPDATE) permet l'accs concurrent une table. Aide se prmunir d'un verrou X RX: Verrou ROW EXCLUSIVE se comporte comme RS mais interdit la pose de verrous S, SRX ou X SRX: Verrou SHARED ROW EXCLUSIVE. Favorise vos MAJ sans risquer S, SRX, RX ou X
PAGE 103
Le tableau ci-dessous indique les diffrents modes de verrouillages et les actions autorises et interdites
Commande SQL Mode de verrouillage (niveau table) aucun Actions autorises Actions interdites
Toutes On peut poser les verrous suivants : RS row share RX row exclusive S share SRX share row exclusive X exclusive - SELECT - INSERT - UPDATE - DELETE
aucune
- UPDATE table, Row exclusif - INSERT INTO (RX) table, - DELETE FROM table, - LOCK TABLE table IN row exclusive mode
- SELECT ... Row Share FOR UPDATE, (RS) - LOCK TABLE table IN ROW SHARE MODE
Commande SQL
On peut poser les avec les ordres : verrous suivants : RX, RS LOCK TABLE IN - share mode - share row exclusive - exclusive mode - SELECT Accs en mode - INSERT exclusif en criture - UPDATE X - DELETE avec l'ordre : On peut poser les verrous suivants : LOCK TABLE In RX, RS, S, RSX exclusive mode Actions autorises Actions interdites
PAGE 104
- SELECT - INSERT - SELECT ... FOR - UPDATE UPDATE - DELETE On peut poser les Verrous : verrous suivants : RX, SRX, X RS, S avec les ordres : LOCK TABLE IN - share row exclusive mode - exclusive mode - row exclusive mode - INSERT - UPDATE - DELETE Verrous : RX, S, SRX, X avec les ordres : LOCK TABLE IN - share mode - share row exclusive mode - exclusive mode - row exclusive mode Tout sauf les requtes.
lock table table in Share Row share row Exclusif exclusive mode (SRX)
PAGE 105
Verrous par dfaut Commande SQL SELECT INSERT UPDATE DELETE SELECT ... FOR UPDATE LOCK table IN ROW SHARE MODE LOCK table IN ROW EXCLUSIVE MODE LOCK table IN SHARE EXCLUSIF MODE LOCK table IN SHARE MODE LOCK table IN EXCLUSIVE MODE DDL / DCL Verrous Mode de ligne verrouillage de la table --oui RX oui RX oui RX oui RS ------RS RX SRX S X X
PAGE 106
5.2. Gestion des verrous (suite ...) Verrous au niveau table La clause de verrouillage explicite au niveau d'une table est : LOCK TABLE <liste_de_table> IN <type_de_verrou> MODE [NOWAIT] (voir le tableau ci-dessus) Note : - si un utilisateur A tente de verrouiller une table dans un mode incompatible avec un verrou pos par l'utilisateur B, il est mis en attente jusqu' ce que B fasse COMMIT ou ROLLBACK (libre les verrous). L'option NOWAIT permet d'viter le blocage de A si la ressource n'est pas libre. Exemple : T1 (B) : LOCK TABLE pilote EXCLUSIF MODE ; T2 (A) : LOCK TABLE pilote SHARED UPDATE NOWAIT ;
PAGE 107
5.2. Gestion des verrous (suite ...) Verrous au niveau ligne Les commandes SELECT FOR UPDATE, INSERT, DELETE, UPDATE placent un verrou exclusif sur une ou plusieurs lignes d'une table. Au niveau table, un verrou RS (row share) est pos pour la commande SELECT FOR UPDATE et un verrou RX (row exclusif). Un verrou ligne est toujours pos implicitement. Les verrous acquis grce la commande LOCK TABLE sont des verrous tables, ils ne verrouillent pas directement des lignes mais servent se prmunir de certains verrous. Exemple : SELECT * FROM PILOTE WHERE ADR='Paris' FOR UPDATE OF SAL ; Cette commande verrouille les lignes de tous les pilotes habitant Paris. Toutes les lignes slectionnes sont verrouilles, pas seulement les champs apparaissant aprs OF. Ensuite on peut effectuer des mises jours comme suit : UPDATE PILOTE SET SAL = 1.1 * SAL WHERE ADR='Paris'; Note : L'option FOR UPDATE ne s'emploie pas avec DISTINCT, GROUP BY, les oprateurs ensemblistes et les fonctions de groupes.
EXERCICES Srie 13
PAGE 108
Pour effectuer ces tests il est ncessaire d'ouvrir deux sessions. Commentez les tapes o il y a un ?
Transaction 1
LOCK TABLE pilote IN ROW SHARE MODE ;
Temps
1 2 3
Transaction 2
DROP TABLE pilote ; ? LOCK TABLE pilote IN EXCLUSIVE MODE NOWAIT ? select sal from pilote where pilote.adr= 'Paris' FOR UPDATE OF sal ;
UPDATE pilote set sal = 12000.9 where adr = 'Paris'; (attente de T2)
10
LOCK TABLE pilote IN EXCLUSIVE MODE NOWAIT; ? LOCK TABLE pilote IN SHARE ROW EXCLUSIVE MODE NOWAIT ; ? LOCK TABLE pilote IN SHARE MODE NOWAIT; ?
11
PAGE 109
12
15
UPDATE pilote set sal = 12000.9 where adr = 'Paris'; (attente T1) ? ROLLBACK;
16 17 18 19
20
21 22 23
24
LOCK TABLE pilote IN EXCLUSIVE MODE NOWAIT ; ? LOCK TABLE pilote IN SHARE ROW EXCLUSIVE MODE NOWAIT ; ? LOCK TABLE pilote IN SHARE MODE ; ? select sal from pilote where user.adr= 'Paris'; ? select sal from pilote where adr= 'Paris' FOR UPDATE OF sal ; ? UPDATE pilote set sal = 12000.9 where adr = 'Paris'; (attente T1) X lignes modifies (aprs libration du verrou par T1) ROLLBACK ;
ROLLBACK ;
25 26 27 ROW
PAGE 110
28
29
30 31
32 33 34
35
UPDATE pilote set sal = 12000.9 where adr = 'Paris'; (attente T2) ?
36
LOCK TABLE pilote in EXCLUSIVE MODE NOWAIT; ? LOCK TABLE pilote in SHARE ROW EXCLUSIVE MODE NOWAIT; ? LOCK TABLE pilote in SHARE MODE NOWAIT; ? LOCK TABLE pilote in ROW EXCLUSIVE MODE NOWAIT; ? LOCK TABLE pilote IN ROW SHARE MODE; ? select sal from pilote where adr= 'Paris'; ? select sal from pilote where adr= 'Paris' FOR UPDATE OF sal ; ? UPDATE pilote set sal = 12000.9 where adr = 'Paris'; (attente T1) deadlock
37 38
? ROLLBACK;
PAGE 111
39 40 LOCK TABLE pilote IN EXCLUSIVE MODE NOWAIT; ? LOCK TABLE pilote IN SHARE ROW EXCLUSIVE MODE NOWAIT; ? LOCK TABLE pilote IN SHARE MODE NOWAIT; ? LOCK TABLE pilote IN ROW EXCLUSIVE MODE NOWAIT; ? LOCK TABLE pilote IN ROW SHARE MODE NOWAIT; ? select sal from pilote where adr= 'Paris' ? select sal from pilote where adr= 'Paris' FOR UPDATE OF sal ; ?
41
42 43
44
45 46
47
48 49
PAGE 112
Choix d'un type de verrou Le moteur Oracle pose des verrous implicites. Ceux-ci peuvent tre remis en cause par l'utilisateur grce aux commandes SELECT FOR UPDATE ou LOCK TABLE. Les verrous explicites pouvant influencer ngativement les performances, leurs pose doit se faire avec prcautions : - ne poser de verrous exclusifs sur une table que si le traitement l'exige ; - poser les verrous de prfrence au niveau ligne pour favoriser la concurrence ; - poser un verrou share (S) pour favoriser les applications en lecture. Un verrou ligne favorise la concurrence mais pnalise les applications effectuant de nombreuses mises jours. Dans le cas d'une application bancaire, la ralisation de l'opration DEBIT-CREDIT ncessite probablement un verrou EXCLUSIVE (X) au niveau table. La consultation de la table restant possible, les transactions de consultations de comptes se feront paralllement.
PAGE 113
PAGE 114
PAGE 115
Cration d'une vue pour assurer l'intgrit : contraintes structurelles (ORACLE V6) La gestion de l'intgrit de cette faon n'est pas intressante avec la version 7 d'Oracle. Elle est prise en charge dans le noyau. Dans Oracle 6 l'approche ci-dessous est utile. Intgrit de domaine Note : - avec oracle 7 on peut utiliser les clauses CONSTRAINT ou CHECK dans la structure d'une table. - pas de domaine smantique Intgrit de relation (ou d'entit) Deux conditions pour assurer l'unicit de la cl doivent tre remplies : - pas de valeurs nulles dans la cl (option NOT NULL) ; - pas de doublon (CREATE UNIQUE INDEX). Note : Avec Oracle 7 la clause PRIMARY KEY permet de prendre en compte automatiquement l'intgrit d'entit.
PAGE 116
6.1. Dfinition du schma externe (suite ...) Intgrit de rfrence La vrification des contraintes d'intgrits de rfrence sous Oracle V6 peut tre simule grce aux vues avec la clause WITH CHECK OPTION qui assure la vrification de la contrainte. Note : sous Oracle 7, les clauses REFERENCES et FOREIGN KEY permettent de prendre en compte automatiquement les contraintes d'intgrit de rfrence.
PAGE 117
* Vue avec une colonne issue d'une expression : Delete : OUI Update : OUI Insert : OUI sur autres col. sur autre col. * Vue avec au moins une colonne NOT NULL absente : Delete : OUI Update : OUI Insert : NON
PAGE 118
EXERCICES Srie 14
Indpendance logique/externe : vue de slection - "Crer une vue AVA300 qui donne tous les A300 dans la compagnie" - "Que se passe - t-il l'insertion d'un "B707" dans la vue ?" Indpendance logique/externe : renommage et r-ordonnancement des colonnes
- "Crer une vue PAYE qui donne pour chaque pilote son salaire mensuel et annuel" - "Crer une vue AVPLUS qui donne tous les numros d'avions conduits par plus d'un pilote." - "Crer une vue PILPARIS qui donne les noms, les numros de vols, des pilotes qui assurent au moins un vol au dpart de Paris"
Cration d'une vue pour assurer la confidentialit
"Crer une vue PILSANS qui donne les renseignements concernant les pilotes, sans le salaire."
Cration d'une vue pour assurer l'intgrit : contraintes structurelles (ORACLE V6) Intgrit de domaine "Crer une vue qui assurer les contraintes de domaine suivantes dans la table AVION : - AVTYPE {A300, A320, Concorde, B707, Caravelle } - AV# entre 200 et 500 "Crer une vue PIL25 qui vrifie que chaque pilote insr a plus de 25 ans." Intgrit de rfrence "Crer les tables PILOTE6, AVION6 et VOL6 (sans les clauses REFERENCES et FOREIGN KEY d'Oracle 7) partir de PILOTE, AVION, VOL. Crer ensuite une vue VOLSURS vrifiant l'intgrit de rfrence en insertion dans VOL6. La contrainte vrifier est : pour tout nouveau vol, le pilote et l'avion doivent exister. Test : insert into volsurs values(150,1,20,'NICE', 'Paris',1345,1500,'3-MAR-89' ); insert into volsurs values(100,1,1,'NICE', 'Nantes',1345,1500,'4-MAR-89' ); "Crer une vue PILOTSUP sur PILOTE6 et VOL6 dans laquelle on accde tous les pilotes qui ne conduisent aucun vol. La contrainte vrifier est qu'un Pilote ne peut - tre supprim que s'il ne conduit aucun Avion." Test : delete from pilotsup where pl# = 1; delete from pilotsup where pl# = 6; PAGE 119
PAGE 120
Vues issues d'une table "Crer une vue AVIONNICE : Ensemble des avions localiss Nice" Modification travers une vue 1) Lister l'extension de la vue AVIONNICE 2) Mise jour d'un tuple dans cette vue : localiser l'avion de n 5 Paris 3) Mise jour d'un tuple dans cette vue : localiser l'avion n 7 Paris 4) Lister la table de base AVION. Que constatez-vous ? Insertion dans la vue 1) Insrer le tuple (11, 'A300', 220, 'Nice', 'EN service'); 2) lister l'extension de la vue AVIONNICE 3) lister la table de base AVION. Suppression dans la vue 1) Suppression de l'avion N 11 2) lister l'extension de la vue AVIONNICE 3) lister la table AVION. Vues issues de plusieurs tables "Crer une vue AVSERVPARIS : Ensemble des avions en service localiss Paris" Modification de la vue 1) lister l'extension de la vue AVSERVPARIS 2) mise jour d'un tuple de cette vue. Que remarque-t-on ?" Insertion dans la vue 1) recrez la vue avec jointure 2) insertion d'un tuple dans la vue AVSERVPARIS. Que remarque-t-on? suppression dans la vue 1) suppression de tous les pilotes de n infrieur 7 dans AVSERVPARIS Vues contenant des colonnes virtuelles "Reprendre la vue PAYE et lister son contenu" Modification via la vue 1) Mise jour d'un tuple dans cette vue : mettre le salaire du pilote 1 0 2) lister le contenu de cette vue. Que remarque--on ? Insertion via la vue 1) insertion d'un tuple dans la vue PAYE . Que remarque-t-on ? Suppression via la vue 1) suppression de tous les pilotes dont le salaire annuel est suprieur 180000. Vues contenant une clause GROUP BY "Reprenons la vue AVPLUS. Llister cette vue" PAGE 121
"Quels sont le n d'avions conduits par plus d'un pilote et localiss Paris ?
PAGE 122
PL/SQL
PAGE 123
1. INTRODUCTION
SQL : est un langage ensembliste et non procdural PL/SQL : est un langage procdural qui intgre des ordres SQL de gestion de la base de donnes Instructions SQL intgres dans PL/SQL : - SELECT - INSERT, UPDATE, DELETE - COMMIT, ROLLBACK, SAVEPOINT - TO_CHAR, TO_DATE, UPPER, ... Instructions spcifiques PL/SQL : - dfinition de variables - traitements conditionnels - traitements rptitifs - traitement des curseurs - traitement des erreurs
Un bloc PL/SQL est divis en 3 sections : DECLARE Dclaration de variables, constantes, exceptions, curseurs BEGIN [nom_du_bloc] Instructions SQL et PL/SQL EXCEPTION Traitement des exceptions (gestion des erreurs) END [nom_du_bloc] ; Remarques : - les sections DECLARE et EXCEPTION sont facultatives. - chaque instruction se termine par un ; - Les commentaires : -- sur une ligne ou /* sur plusieurs lignes */
PAGE 125
2. Structure d'un bloc PL/SQL (suite ...) Exemple : PROMPT nom du produit ACCEPT prod DECLARE qte NUMBER(5) SQL PL/SQL
BEGIN SELECT quantite INTO qte FROM stock WHERE produit= '&prod'; -- on contrle le stock IF qte > 0 THEN UPDATE stock SET quantite = quantite - 1 WHERE produit = '&prod'; INSERT INTO vente VALUES('&prod' || 'VENDU' , SYSDATE); ELSE INSERT INTO commande VALUES('&prod' || 'DEMANDE' , SYSDATE); END IF; COMMIT; END; /
PAGE 126
Les variables locales se dclarent dans la partie DECLARE du bloc PL/SQL. Diffrents types de variables : * Variables de types ORACLE * Variables de type BOOLEAN * Variables faisant rfrence au disctionnaire de donnes Initialisation des variables Visibilit des variables
PAGE 127
Syntaxe : nom_var TYPE_ORACLE; Exemple : DECLARE nom CHAR(20); prenom CHAR(15); age NUMBER(3); BEGIN ... END;
PAGE 128
BOOLEAN;
PAGE 129
* Variable de mme type qu'un attribut d'une table de la base Syntaxe : nom_var
table.colonne%TYPE;
PAGE 130
- Variable de mme structure qu'une ligne d'une table de la base Syntaxe : nom_var table%ROWTYPE;
Exemple : DECLARE ligne pilote%ROWTYPE; BEGIN ... END; Remarque : La structure ligne contient autant de variables que de colonnes de la table. Ces variables portent le mme nom et sont de mme type que les colonnes de la table. Pour y accder : ligne.<nom_col1> ligne.<nom_col2> ... ligne.<nom_coln>
PAGE 131
- Variable de mme type qu'une autre variable Syntaxe : nom_var2 Exemple : DECLARE ancien_sal nouveau_sal BEGIN ... END; NUMBER(5); ancien_sal%TYPE;--NUMBER(5); nom_var1%TYPE;
PAGE 132
3.1.4. Initialisation des variables Avec : oprateur := ou SELECT ... INTO ... Exemple : DECLARE var1 CHAR(10) := 'DUPONT'; var2 NUMBER(5,2) := 100; var3 CHAR(10); var4 DATE; BEGIN SELECT col1, col2 INTO var3, var4 FROM ... ; ... END; Remarque : le SELECT doit ramener une et une seule ligne, sinon erreur.
PAGE 133
3.1.5. Visibilit des variables Une variable est visible dans le bloc o elle a t dclare et dans les blocs imbriqus si elle n'a pas t redfinie. DECLARE var1 NUMBER(3); var2 CHAR(10); BEGIN ... var1 NUMBER(3) ... var2 CHAR(10) DECLARE var1 CHAR(10); var3 DATE; BEGIN ... var1 CHAR(10) ... var2 ... var3 END; ... DECLARE var4 NUMBER(5,2); BEGIN ... var1 NUMBER(3) ... var2 ... var4 END; ... var1 NUMBER(3) ... var2 CHAR(10) END;
PAGE 134
Outre les variables locales vues prcdemment, un bloc PL/SQL peut utiliser d'autres variables : - les champs d'crans FORMS, - les variables dfinies en langage hte (prfixe de :) - les variables dfinies dans SQL*Plus (prfixe de &)
PAGE 135
4. Les traitements
4.1. IF : traitement conditionnel
Excution d'un traitement en fonction d'une condition. IF condition1 THEN traitement 1; ELSIF condition2 THEN traitement 2; [ELSE traitement 3;] END IF; Les oprateurs utiliss dans les conditions sont les mmes que dans SQL : =, <, ... IS NULL, LIKE, ... Ds que l'une des conditions est vraie, le traitement qui suit le THEN est excut. Si aucune condition n'est vraie, c'est le traitement qui suit le ELSE qui est excut.
PAGE 136
Excution d'un traitement un certain nombre de fois. Le nombre tant connu. BEGIN FOR indice IN [REVERSE] exp1 ... exp2 LOOP instructions; END LOOP; END; Remarques : - inutile de dclarer indice - indice varie de exp1 exp2 de 1 en 1 - si REVERSE est prcis, indice varie de exp2 exp1 avec un pas de -1. Exemple : calcul de la factorielle 5 DECLARE fact NUMBER := 1; BEGIN FOR i IN 1 .. 5 LOOP fact := fact * i ; END LOOP; END;
PAGE 138
Excution d'un traitement trant qu'une condition reste vraie. BEGIN WHILE condition LOOP instructions; END LOOP; END; Exemple : reste de la division de 5432 par 5 DECLARE reste NUMBER := 5432; BEGIN WHILE reste >= 5 LOOP reste := reste -5; END LOOP; END;
PAGE 139
- CURSEUR EXPLICITE : curseur SQL gnr et gr par l'utilisateur pour traiter un ordre SELECT qui ramne plus d'une ligne.
PAGE 140
4 tapes : - dclaration du curseur - ouverture du curseur - traitement des lignes - fermeture du curseur
PAGE 141
Dclaration du curseur dclaration dans la section DECLARE du bloc. on indique le nom du curseur et l'ordre SQL associ Syntaxe : CURSOR nom_curseur IS ordre_select ;
Exemple : DECLARE CURSOR pl_nice IS SELECT pl#, plnom FROM pilote WHERE adr='Nice'; BEGIN ... END ;
PAGE 142
Ouverture du curseur L'ouverture du curseur lance l'excution de l'odre SELECT associ au curseur. Ouverture dans la section BEGIN du bloc. Syntaxe : OPEN nom_curseur ;
Exemple : DECLARE CURSOR pl_nice IS SELECT pl#, plnom FROM pilote WHERE adr='Nice'; BEGIN ... OPEN pl_nice; ... END ;
PAGE 143
5.2. Curseur explicite (suite ...) Traitement des lignes Aprs l'excution du SELECT les lignes ramenes sont traites une par une, la valeur de chaque colonne du SELECT doit tre stocke dans une variable rceptrice. Syntaxe : FETCH nom_curseur INTO liste_variables ; Exemple : DECLARE CURSOR pl_nice IS SELECT pl#, plnom, sal FROM pilote WHERE adr='Nice'; num pilote.pl#%TYPE; nom pilote.plnom%TYPE; salaire pilote.sal%TYPE; BEGIN OPEN pl_nice; LOOP FETCH pl_nice INTO num, nom,salaire; ... EXIT WHEN sal > 10 000; END LOOP; END ;
PAGE 144
5.2. Curseur explicite (suite ...) Fermeture du curseur Pour librer la mmoire prise par le curseur, il faut le fermer ds qu'on n'en a plus besoin. Syntaxe : CLOSE nom_curseur ; Exemple : DECLARE CURSOR pl_nice IS SELECT pl#, plnom, sal FROM pilote WHERE adr='Nice'; num pilote.pl#%TYPE; nom pilote.plnom%TYPE; salaire pilote.sal%TYPE; BEGIN OPEN pl_nice; LOOP FETCH pl_nice INTO num, nom,salaire; ... EXIT WHEN sal > 10 000; END LOOP; CLOSE pl_nice; END ;
PAGE 145
PAGE 146
5.3.1. %FOUND
curseur implicite : SQL%FOUND TRUE * si INSERT, UPDATE, DELETE traite au moins une ligne * si SELECT ... INTO ... ligne ramne une et une seule
PAGE 147
Exemple : DECLARE CURSOR pl_nice IS SELECT pl#, plnom, sal FROM pilote WHERE adr='Nice'; num pilote.pl#%TYPE; nom pilote.plnom%TYPE; salaire pilote.sal%TYPE; BEGIN OPEN pl_nice; FETCH pl_nice INTO num, nom,salaire; WHILE pl_nice%FOUND LOOP ... FETCH pl_nice INTO num, nom,salaire; END LOOP; CLOSE pl_nice; END ;
PAGE 148
5.3.2. %NOTFOUND
curseur implicite : SQL%NOTFOUND TRUE * si INSERT, UPDATE, DELETE ne traite aucune ligne * si SELECT ... INTO ... ne ramne pas de ligne
curseur explicite : nom_curseur%NOTFOUND TRUE * si le dernier FETCH n'a pas ramen de ligne.
PAGE 149
5.3.3. %ISOPEN curseur implicite : SQL%ISOPEN toujours FALSE car ORACLE referme les curseurs aprs utilisation. curseur explicite : nom_curseur%ISOPEN TRUE si le curseur est ouvert. Exemple : DECLARE CURSOR pl_nice IS SELECT pl#, plnom, sal FROM pilote WHERE adr='Nice'; num pilote.pl#%TYPE; nom pilote.plnom%TYPE; salaire pilote.sal%TYPE; BEGIN IF NOT(pl_nice%ISOPEN) THEN OPEN pl_nice; END IF; ... END ; 5.3.4. %ROWCOUNT
PAGE 150
curseur implicite : SQL%ROWCOUNT nombre de lignes traites par INSERT, UPDATE, DELETE 0 : SELECT ... INTO : ne ramne aucune ligne 1 : SELECT ... INTO : ramne 1 ligne 2 : SELECT ... INTO : ramne plus d'une ligne curseur explicite : nom_curseur%ROWCOUNT traduit la nime ligne ramene par le FETCH
PAGE 151
Au lieu de dclarer autant de variables que d'attributs ramens par le SELECT du curseur, on peut utiliser une structure. Syntaxe : DECLARE CURSOR nom_curseur IS ordre_select; nom_structure nom_curseur%ROWTYPE; Pour renseigner la structure : FETCH nom_curseur INTO nom_structure; Pour accder aux lments de la structure : nom_structure.nom_colonne
PAGE 152
5.4.2. Traitement du curseur Au lieu d'crire : DECLARE CURSOR nom_curseur IS SELECT ... ; nom_struct nom_curseur%ROWTYPE; BEGIN OPEN nom_curseur; LOOP FETCH nom_curseur INTO nom_struct; EXIT WHEN nom_curseur%NOTFOUND; ... END LOOP; CLOSE nom_curseur; END; il suffit d'crire : DECLARE CURSOR nom_curseur IS SELECT ... ; BEGIN FOR nom_struct IN nom_curseur LOOP ... END LOOP; END;
PAGE 153
PAGE 154
PAGE 155
Syntaxe erreur utilisateur : DECLARE nom_erreur EXCEPTION; on donne un nom l'erreur ... BEGIN IF ... THEN RAISE nom_erreur; on dclenche l'erreur ... EXCEPTION WHEN nom_erreur THEN ... traitement de l'erreur END; Remarque : on sort du bloc aprs le traitement de l'erreur.
PAGE 156
Syntaxe erreur ORACLE non prdfinie : DECLARE nom_erreur EXCEPTION; on donne un nom l'erreur PRAGMA EXCEPTION_INIT(nom_erreur,code_erreur) on associe le nom de l'erreur un code erreur BEGIN ...
... l'erreur Oracle est dtecte par le systme EXCEPTION WHEN nom_erreur THEN ... traitement de l'erreur END; Remarque : on sort du bloc aprs le traitement de l'erreur.
PAGE 157
Syntaxe erreur ORACLE prdfinie : Certaines erreurs ORACLE ont dj un nom. Il est donc inutile de les dclarer comme prcdemment. On utilise leur nom dans la section EXCEPTION. DECLARE ... BEGIN ... l'erreur Oracle est dtecte par le systme EXCEPTION WHEN nom_erreur THEN ... traitement de l'erreur END; Exemple d'erreurs prdfinies : - DUP_VAL_ON_INDEX - NO_DATA_FOUND - ... - OTHERS
PAGE 158
Complment - SQLCODE renvoie le code de l'erreur courante (numrique) - SQLERRM[(code_erreur)] renvoie le libell de l'erreur courante ou le libell de l'erreur dont le numro est pass en paramtre.
PAGE 159
7. Exercices PL/SQL
7.1. Ex1 : les boucles
Crer une table MULTIPLICATION(op CHAR(5), res char(3)). Ecrire un fichier de commande qui permette le calcul et l'affichage d'une table de multiplication. Rsoudre l'exerice de 3 manires diffrentes (utiliser les 3 boucles)
PAGE 160
SQL*Plus
PAGE 161
1. Prsentation de SQL*Plus
SQL*Plus est un outil Oracle permettant l'accs aux donnes des bases de donnes Oracle.
Il autorise les commandes suivantes : ordre SQL commandes lies l'diteur commandes lies l'environnement
PAGE 162
S.E.
exit ou quit
login.sql
(taille page, ligne, ...) 3.4.
SQL>
PAGE 163
1. Prsentation de SQL*Plus (suite) Toute commande SQL est mise dans un buffer. Pour excuter la commande, on la termine par un ; ou un / la ligne suivante.
L'utilisateur aura accs ce buffer via les commandes de l'diteur. Note : pour excuter de nouveau la commande du buffer, utiliser la commande R ou /. Exemple :
SQL> l [ENTER] SQL > Select * from avion;
PAGE 164
L L* Ln Lm n i i texte a del
Liste le contenu du buffer Liste la ligne courante Liste la nime ligne qui devient courante Liste de la ligne m la ligne n Insertion aprs la ligne courante Insertion d'une ligne dont le contenu est texte Ajoute du texte en fin de ligne courante Supprime la ligne courante Remplace la premire occurrence de la chane 1 par la chane 2 dans la ligne courante Supprime la chane dans la ligne courante
C/ch1/ch2 C/ch
PAGE 165
PAGE 166
start nom_file ou @nom_file ouvre le fichier nom_file.sql, le charge dans le buffer et excute les commandes. spool nom_file spool off spool out ouvre un fichier d'impression (.lis ou .lst) qui contiendra la trace cran ferme le fichier d'impression id. plus envoi l'imprimante
PAGE 167
PAGE 168
3. Les commandes de l'environnement 3.2. Commandes de dialogue (suite) Exemple de requte paramtre : SQL> SELECT * FROM avion WHERE av# = &num_avion / ENTER VALUE FOR num_avion : <saisie du user> -- excution de la requte avec la valeur saisie -Remarque : &var : la variable est dfinie pour une excution &&var : la variable est dfinie pour la session Complment : L'utilisateur pourra donner les valeurs lors de l'appel du script contenant les commandes SQL. Pour cela les variables devront s'appeler &1, &2, ... &9. Exemple : fichier test.sql Select * from &1 where av# = &2; lancement : SQL> @test avion 20
PAGE 169
3. Les commandes de l'environnement 3.2. Commandes de dialogue (suite) DEF renvoie les valeurs de toutes les variables dfinies affecte une valeur la variable de faon permanente supprime la dfinition de la variable
UNDEF var
PAGE 170
3. Les commandes de l'environnement 3.2. Commandes de dialogue (suite) Les commandes de dialogue Rappel :
SQL> SELECT * FROM avion WHERE av# = &num_avion / ENTER VALUE FOR num_avion : <saisie du user>
Les commandes de dialogue vont permettre de donner la main l'utilisateur de faon plus conviviale. prompt texte affiche le message l'utilisateur
accept var [PROMPT texte] attend que l'utilisateur rentre une une valeur pour var Exemple : test2.sql PROMPT entrez le numro de l'avion ACCEPT num_avion PROMPT 'Num : ' SELECT * FROM avion WHERE av# = &num_avion;
PAGE 171
PAGE 172
3. Les commandes de l'environnement (suite) 3.3. Commandes de formatage de rapport (suite) COL(umn) nom_col [FORMAT format] def. la taille et le format ex : A10 (alpha), 99990 (num.) [HEADING texte] en_tte de la col. [JUSTIFY L|C|R] cadre l'en-tte de la col. [NEW_VALUE var] met la nvelle val. dans var [OLD_VALUE var] met l'ancienne val. dans var [PRINT |NOPRINT] affiche ou pas la col. [NEWLINE] passage la ligne Exemple : COL pilnom FORMAT A16 HEADING NOM DU | PILOTE Remarques : COL renvoie toutes les informations de toutes les colonnes. COL nom_col id. pour une colonne COL nom_col CLEAR supprime le formatage de la col. CLEAR COL Id. pour toutes les colonnes.
PAGE 173
3. Les commandes de l'environnement (suite) 3.3. Commandes de formatage de rapport (suite) TTITLE texte texte est le titre qui apparatra chaque page du rapport Exemple : TTITLE AVIONS DE LA COMPAGNIE | : pour un saut la ligne - : suite ligne suivante Remarque : TTITLE sans option gnre : - la date en haut gauche - le n de page en haut droite - le titre centr (nom valable pour TTILE avec options) TTITLE [OPTIONS [texte|var]] | [ON | OFF] Options : LEFT, CENTER, RIGHT, BOLD, ... Variables : SQL.LNO : n de ligne SQL.PNO : n de page SQL.RELEASE : version d'ORACLE SQL.USER : nom utilisateur
PAGE 174
3. Les commandes de l'environnement (suite) 3.3. Commandes de formatage de rapport (suite) BTITLE texte Id. TTILE mais en titre de bas de page
TTITLE : renvoie les informations sur le titre haut de page BTITLE : renvoie les informations sur le titre bas de page TTITLE ON |OFF : active ou dsactive l'emploi d'un titre haut de page BTITLE ON |OFF : active ou dsactive l'emploi d'un titre bas de page
PAGE 175
3. Les commandes de l'environnement (suite) 3.3. Commandes de formatage de rapport (suite) BREAK ON critere_de rupture action dfinit une rupture et dclenche une action chaque fois qu'elle se produit avec : critere_de_rupture : nom_col | ROW | REPORT action : SKIP (n|PAGE) DUP|NODUP
exemple : BREAK ON PL# SKIP 2 ==> saute deux lignes chaque changement de pilote. Remarque : bien entendu les donnes ramenes par le SELECT doivent tre en cohrence avec le BREAK. BREAK : donne les informations sur les ruptures dfinies CLEAR BREAK : annule la rupture dfinie
PAGE 176
3. Les commandes de l'environnement (suite) 3.3. Commandes de formatage de rapport (suite) COMPUTE {AVG | COUNT | MAX | MIN | NUMBER | STD | SUM | VAR } OF col1 {col2 ...} ON {col_break | ROW | REPORT } Exemple : COMPUTE SUM OF sal ON adr REPORT REMARQUE IMPORTANTE : dfinir le COMPUTE en cohrence avec le BREAK COMPUTE renvoie les informations sur le calcul CLEAR COMPUTE annule les calculs dfinis Exemple : BREAK ON avtype SKIP 1 ON REPORT COMPUTE SUM OF cap ON avtype REPORT select * from avion; (somme des cap. par avtype puis pour tous les enregts.)
PAGE 177
SET
nom_variable
valeur
affecter une valeur une variable SHOW nom_variable consulter la valeur d'une variable SHOW ALL id. pour toutes les variables
PAGE 178
3. Les commandes de l'environnement (suite) 3.4. Commandes de dfinition de l'environnement (suite) impression SET LINE SET PAGES SET NUM SET NEWP SET NULL SET SPACE SET UND n n n n ch n car nb de car. / ligne nb lignes / page largeur par def. des nb nb de lignes sauter en haut de chaque page valeur de la chane NULL nb expaces entre les colonnes caractre de soulignement des en-ttes de colonnes
PAGE 179
3. Les commandes de l'environnement (suite) 3.4. Commandes de dfinition de l'environnement (suite) affichage, excution SET TERM SET ECHO SET FEED SET SHOW SET HEA SET PAUSE SET SQLN SET SQLP ON|OFF ON|OFF ON|OFF ON|OFF ON|OFF affichage O/N raffichage de la cde SQL nb lignes ramenes affichage des paramtres sql*plus affichage du titre des col. arrt en fin de page (message)
PAGE 180
3. Les commandes de l'environnement (suite) 3.4. Commandes de dfinition de l'environnement (suite) SET TIME SET VERIFY SET TIMING ON|OFF ON|OFF ON|OFF affichage de l'heure gauche du prompt affichage des cdes avant et aprs substitution information sur les temps d'excution
PAGE 181
3. Les commandes de l'environnement (suite) 3.4. Commandes de dfinition de l'environnement (suite) divers SET DEFINE car caractre de substitution pour les paramtres ( & par dfaut) SET SCAN ON|OFF Autorisation d'utilisation des paramtres SET SQLTERMINATOR Dfaut : ; SET HEADS Dfaut : | SET SUFFIX car|ON|OFF car
chane
PAGE 182
4. Exercice
1. Faire une interrogation de tous les attibuts et de toutes les lignes de la relation AVION. Rsultat tri par type d'avion. Remarquez la prsentation des rultats peu prsentable. 2. Faites un describe de la relation AVION. Remarquez que AV# et LOC sont des NUMBER(4). Pourtant dans le SELECT prcdent leur affichage tait sur une longueur suprieure. Comment expliquez vous cela ? 3. Modifier la prsentation des colonnes avec COL pour que l'interrogation faite en 1. soit plus prsentable : - AV# : - titre : NAVION - lg : 10 - AVTYPE : - titre TYPE - CAP : - titre : CAPACITE - LOC : - titre : LOCALISATION - REMARQ : - titre : REMARQUE - lg : 20 Excuter la requte. Corriger la longueur de LOCALISATION pour voir le titre totalement. 4. Titre : Liste des avions de la compagnie Excuter la requte. 5. Dfinir un break sur le type d'avion et sauter 2 lignes. Excuter la requte. 6. Caculer la capacit moyenne de tous les avions de la compagnie pour chaque type d'avion Excuter la requte.
PAGE 183
Annexes
Annexe A : Schma et extension de la base arienne Annexe B : Quelques variables d'environnement
PAGE 184
drop table avion CASCADE CONSTRAINTS ; create table avion( av# number(4) not null primary key, avtype varchar2(10) not null CONSTRAINT avion_chk_type CHECK (avtype in ('A300','A310','A320','B707','B727','CONCORDE','CARAVELLE')), cap number(4) not null, loc varchar2(20) not null, remarq long );
PAGE 185
drop table vol CASCADE CONSTRAINTS ; create table vol( vol# number(4) not null primary key, pilote# number(4) not null CONSTRAINT vol_fk_pilote REFERENCES PILOTE(PL#) ON DELETE CASCADE, avion# number(4) not null, vd varchar2(20), va varchar2(20), hd number(4) not null, ha number(4), dat date, CONSTRAINT vol_chk_ha CHECK (ha>hd), FOREIGN KEY (avion#) REFERENCES AVION(AV#) ); REM insertion des valeurs dans les tables insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into pilote values(1, 'Miranda', '16-AUG-52','Sophia-Antipolis', '93548254', 18009.0,50); pilote values(2, 'St-exupery', '16-OCT-32', 'Lyon', '91548254', 12300.0,50); pilote values(3, 'Armstrong ', '11-MAR-30', 'Wapakoneta','96548254', 24500.0,50); pilote values(4, 'Tintin', '01-AUG-29', 'Bruxelles','93548254', 21100.0,50); pilote values(5, 'Gagarine', '12-AUG-34', 'Klouchino','93548454', 22100.0,50); pilote values(6, 'Baudry', '31-AUG-59', 'Toulouse','93548444', 21000.0,50); pilote values(8, 'Bush', '28-FEB-24', 'Milton','44556254', 22000.0,50); pilote values(9, 'Ruskoi', '16-AUG-30', 'Moscou','73548254', 22000.0,50); pilote values(10, 'Math', '12-AUG-38', 'Paris', '23548254', 15000.0,50); pilote values(11, 'Yen', '19-SEP-42', 'Munich','13548254', 29000.0,50); pilote values(12, 'Icare', '17-DEC-62', 'Ithaques','73548211', 17000.6,50); pilote values(13, 'Mopolo', '04-NOV-55', 'Nice','93958211', 17000.6,50); pilote values(14, 'Chretien', '04-NOV-45', '','73223322', 15000.6,50); pilote values(15, 'Vernes', '04-NOV-35', 'Paris', '',17000.6,50); pilote values(16, 'Tournesol', '04-AUG-29', 'Bruxelles','', 15000.6,50); pilote values(17, 'Concorde', '04-AUG-66', 'Paris', '',21000.6,50);
REM Insertion des avions insert into avion values(1, 'A300', 300, 'Nice', 'En service'); insert into avion values(2, 'A300', 300, 'Nice', 'En service'); insert into avion values(3, 'A320', 320, 'Paris', 'En service'); insert into avion values(4, 'A300', 300, 'Paris', 'En service'); insert into avion values(5, 'CONCORDE', 300, 'Nice', 'En service'); insert into avion values(6, 'B707', 400, 'Paris', 'En panne'); insert into avion values(7, 'CARAVELLE', 300, 'Paris', 'En service'); insert into avion values(8, 'B727', 250, 'Toulouse', 'En service'); insert into avion values(9, 'CONCORDE', 350, 'Toulouse', 'En service'); insert into avion values(10, 'A300', 400, 'Paris', 'En service'); REM Insertion des vols insert into vol values(100, 1,1,'Nice', 'Paris', '1345', '1500','3-MAR-89' ); PAGE 186
insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into insert into commit;
vol values(110, 3,6,'Nice', 'Toulouse', '1230', '1325','6-MAR-89' ); vol values(120,4,3,'Nice', 'Paris', '0745', '0900','21-JUN-89' ); vol values(125, 12,6,'Paris', 'Nice', '1330', '1845','10-JAN-89' ); vol values(130, 4,8,'Toulouse', 'Beauvais', '0630','0750', '27-MAR-89' ); vol values(111, 5,3,'Nice', 'Paris', '0800', '0920','4-DEC-89' ); vol values(135, 8,5,'Paris', 'Toulouse', '1200','1320','22-MAR-89' ); vol values(140, 14,9,'Lyon', 'Nice', '0700', '0750','4-JUN-89' ); vol values(150, 1,1,'Paris', 'Nantes','1630', '1725','28-MAR-89' ); vol values(153, 2,3,'Lyon', 'Nice', '1210', '1300','6-NOV-89' ); vol values(156, 9,2,'Paris', 'Lyon', '0230', '0320','14-JAN-89' ); vol values(200, 5,3,'Nice', 'Toulouse', '2030', '2125','17-JUN-89' ); vol values(210, 14,7,'Nice', 'Nantes', '1430', '1525','14-OCT-89' ); vol values(236, 8,4,'Lyon', 'Toulouse', '2130', '2250','15-OCT-89' ); vol values(240, 13,10, 'Nice', 'Paris', '2300', '2355','19-NOV-89' ); vol values(250, 13,4,'Bordeaux', 'Paris', '2300','2355', '25-DEC-89' ); vol values(260, 13,5,'Bordeaux', 'Paris', '2300','2355', '30-NOV-89' ); vol values(270, 13,9,'Paris', 'New york', '1400','2300', '3-JAN-89' ); vol values(280, 8,9,'Nice', 'Mulhouse', '1200','1320','21-MAR-89' ); vol values(290, 3,8,'Beauvais', 'Marseille', '1230','1425', '9-MAR-89' );
PAGE 187
PAGE 188