Beruflich Dokumente
Kultur Dokumente
www.tellora.fr
Sommaire
1 2 3 La base de donnes Oracle 11g .................................................................................... 5 La documentation ...................................................................................................... 10 Les Outils daccs la base ....................................................................................... 11 1.1 1.2
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5
1.3 4 5
Le langage SQL .......................................................................................................... 23 1.4 1.5 Notion de schema ............................................................................................. 23 Rgles de nommage .......................................................................................... 23 Requtes avec comparaisons .............................................................................. 26
La clause IN ............................................................................................................ 27 La clause LIKE ........................................................................................................ 27 La valeur NULL ........................................................................................................ 28 La clause BETWEEN ................................................................................................ 29 Trier laffichage dune requte ................................................................................ 29 Eliminer les doublons .............................................................................................. 30
1.7
1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6
1.8
1.8.1
Page 2/124
1.8.2 1.8.3
1.9
1.9.1 1.9.2 1.9.3 1.9.4 1.9.5
1.10 1.11
1.11.1 1.11.2 1.11.3
1.12 1.13
1.13.1 1.13.2
1.14 1.15 8
1.15.1 1.15.2 1.15.3 1.15.4 1.15.5 1.15.6 1.15.7 1.15.8 1.15.9
Les vues .................................................................................................................... 69 1.16 1.17 1.18 Crer une vue .................................................................................................. 69 Supprimer une vue............................................................................................ 73 Les synonymes ................................................................................................. 73 Script de cration des tables ............................................................................... 76 Manipulation des LOB ........................................................................................ 79 Manipulation des BFILEs..................................................................................... 80 Les contraintes dintgrit .................................................................................. 84
Contraintes immdiates ou diffres ...................................................................... 84 Crer des contraintes dintgrit ............................................................................ 85 Dsactiver les contraintes dintgrit ..................................................................... 86
10
Page 3/124
2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3 3.1 3.2 3.3 11 3.4
3.4.1 3.4.2
Les colonnes virtuelles en 11g ............................................................................ 86 Le ROWID ........................................................................................................ 87 Bloc Oracle et lignes de tables ............................................................................ 88 Crer une table partir dune table existante ........................................................ 90 Renommer une table ......................................................................................... 90 Les tables temporaires ....................................................................................... 91 Les tables externes ........................................................................................... 91 Les vues Matrialises ....................................................................................... 92 Organisation logique .......................................................................................... 93 Organisation physique ....................................................................................... 94 Accs par index B*-Tree .................................................................................... 96 Modifier les lignes dans une tables ......................................................................... 98 Insrer des lignes dans une table ........................................................................ 98
La commande INSERT ............................................................................................. 98 Insertion partir dune table existante .................................................................. 99
3.5
3.5.1 3.5.2 3.5.3 3.5.4
3.6 3.7
3.7.1 3.7.2
Spcifier la valeur par dfaut dune colonne .........................................................107 Supprimer les lignes dune table .........................................................................109
La commande DELETE ........................................................................................... 109 Vider une table ..................................................................................................... 110
12 3.8 3.9
Les squences ...................................................................................................... 112 Crer une squence..........................................................................................112 Utiliser une squence .......................................................................................113 Modifier une squence ......................................................................................114 Supprimer une squence ...................................................................................114 Dcouper une transaction..................................................................................117 Gestion des accs concurrents ...........................................................................117 Les verrous .....................................................................................................118 Accs concurrents en mise jours ......................................................................119 Les rollbacks segments ou segments dannulation .................................................120
Page 4/124
Oracle Database 11g reprsente la nouvelle gnration de la gestion des informations en entreprise, qui permet de faire face aux exigences qu'imposent la croissance rapide des volumes de donnes, l'volution constante de l'environnement et la ncessit de fournir une qualit de service maximale tout en rduisant et en contrlant les cots informatiques. Oracle Database 11g reste centr sur le grid computing : il permet de constituer des matrices de serveurs et de systmes de stockage conomiques capables de traiter les donnes de faon rapide, fiable et volutive, en supportant les environnements les plus exigeants, qu'il s'agisse de datawarehouse, de transactionnel ou de gestion de contenus. Oracle Database 11g intgre de multiples nouveauts et amliorations. Ainsi, Oracle 11g offre une performance amliore du stockage sur fichiers, des fonctionnalits renforces pour la scurit, d'importantes amliorations de performances pour Oracle XML DB, et des fonctions nouvelles pour l'OLAP et le datawarehouse.
Oracle 11g multiplie les outils de gestion et introduits de nouvelles fonctionnalits d'auto gestion et d'automatisation. Automatic SQL, Partitioning Advisor ou Support Workbench accompagnent les administrateurs pour amliorer les performances et les informer le plus rapidement possible des incidents. Ainsi -- Oracle Flashback Transaction permet de revenir plus facilement sur une erreur de transaction et des dpendances. Parallel Backup and Restore augmente les performances des sauvegardes sur les grosses bases. -- Hot Patching permet d'appliquer les mises jour sans arrter les bases. -- Data Recovery Advisor accompagne les administrateurs pour dterminer intelligemment les plans de secours. -- Oracle Fast Files adopte un comportement proche des systmes de fichiers (file systems), ce qui est un gage de performances avec les LOBs (Large Objects) ou des fichiers contenant du texte, des images, ou des donnes XML, objets tridimensionnels, etc. -- Oracle XML DB permet de stockes et manipules nativement les donnes XML. Le langage XML se rvle lourd, et avec cette approche Oracle 11g limite la dgradation de ses performances. De mme la base supporte les interfaces standard XQuery, Java Specification Requests (JSR)-170 et SQL/XML. -- Oracle Transparent Data Encryption permet de crypter les donnes des tables, des index ou encore les donnes stockes de type LOB. -- Cubes OLAP, apporte des fonctionnalits de datawarehouse (fermes de donnes), Oracle 11g embarque les cubes OLAP pour visualiser les informations stockes, ce qui autorise le dveloppement de requtes au format SQL. -- Continuous Query Notification notifie immdiatement les changements apports dans la base. -- avec Query Result Caches, requtes et fonctionnalit de la base ou d'applications tierces sont places en cache afin de les acclrer ou de les rutiliser. -- Database Resident Connection Pooling est destin aux applications qui ne sont pas multithreades (ou les dveloppeurs qui ne matrisent pas cette technologie parallle), en particulier pour les systmes web, Oracle 11g permet de crer des 'pool' de connexions.
Page 5/124
Les diffrents produits dOracle sont proposs en trois gammes : Enterprise Edition - La gamme pour les grosses applications critiques de lentreprise. Standard Edition - La gamme pour les applications des groupes de travail ou des dpartements de lentreprise, elle est destine des serveurs possdant 4 processeurs. Standard Edition ONE - la gamme destine un bi-processeur. Personal Edition - La gamme pour lutilisateur indpendant (dveloppeur, consultant, ), elle utilise un noyau Enterprise Edition.
Les composants dvelopps par Oracle pour le Grid Computing sont : Real Application cluster (RAC) : Supporte lexcution dOracle sur un cluster dordinateurs qui utilisent un logiciel de cluster indpendant de la plate forme assurant la transparence de linterconnexion. Automatic Storage Management (ASM) : Regroupe des disques de fabricants diffrents dans des groupes disponibles pour toute la grille. ASM simplifie ladministration car au lieu de devoir grer de nombreux fichiers de bases de donnes, on ne gre que quelques groupes de disques. Oracle Ressource Manager : Permet de contrler lallocation des ressources des nuds de la grille Oracle Scheduler : contrle la distribution des jobs aux nuds de la grille qui disposent de ressources non utilises. Oracle Streams : Transfre des donnes entre les nuds de la grille tout en assurant la synchronisation des copies. Reprsente la meilleure mthode de rplication.
Quatre nouvelles options offrent des possibilits exclusives de gestion des donnes pour Oracle Database 11g Enterprise Edition : Oracle Real Application Testing Oracle Advanced Compression Oracle Total Recall Oracle Active Data Guard
Oracle Real Application Testing aide ces clients rduire les dlais, les risques et les cots de test de ces modifications de leur environnement informatique, de faon contrle et conomique. Outil de tests et de gestion des changements, cet outil est bienvenu l o les infrastructures et environnements sont plus que jamais multiples. Oracle Advanced Compression intgre de nouveaux mcanismes de compression applicables tous les types de donnes permettant d'atteindre des taux de compression de 2x ou 3x, et parfois plus. Associ de nouveaux mcanismes de partitionnement, Oracle Advanced Compression permet de dployer dans la base de donnes des stratgies de gestion du cycle de vie des informations, sans avoir modifier les applications, afin de rduire encore plus les besoins de stockage. Oracle Total Recall permet de conserver et de retrouver les historiques des donnes modifies, mais aussi d'en simplifier l'accs.Les administrateurs peuvent intervenir plus tt dans les processus, ce qui apporte une nouvelle dimension de temps dans la gestion des donnes, comme le tracking (suivi, en temps rel des flux d'informations), les audits ou le respect des rgles. Oracle DATA GUARD porte la protection des donnes jusqu'aux risques de dfaillances des systmes et de dsastres. L'application permet simultanment d'crire et rcuprer les donnes
Page 6/124
d'une base de donnes, ce qui augmente les performances et apporte une solution conomique de 'Disaster Recovery'. Oracle Active Data Guard peut tre employ pour amliorer la performance des bases de donnes de production en transfrant vers une base de donnes physique secondaire des oprations requrrant beaucoup de ressources, telles que certaines requtes ou les sauvegardes. Cette solution amliore fortement le retour sur investissement pour une base de donnes physique de secours, car celle-ci peut tre utilise la fois pour la protection en cas de panne gnrale et pour l'amlioration de la qualit de service de l'environnement de production.
Notion de Grid Computing La base de donnes intgre la notion de Grid Computing (rseau distribu dordinateurs htrognes en grille). Le but du Grid est de crer des pools de ressources : de stockage de serveurs
Le Grid Computing autorise un accs transparent et volutif (en termes de capacit de traitement et de stockage) un rseau distribu dordinateurs htrognes. Oracle 11g permet ces machines dintroprer ; lensemble tant considr comme une seule ressource unifie. Chaque ressource est vue comme un service. Il est possible de mettre en place des rseaux grille nationaux, voire mondiaux. Ainsi chaque nouveau systme peut tre rapidement mis disposition partir du pool de composants
Exemple dapplication en Grid Computing Les deux applications prsentes ci-dessous, Facturation et Comptabilit se partagent des ressources de deux serveurs. Chacune peut tre hberge sur nimporte lequel dentre eux et les fichiers de base de donnes peuvent se trouver sur nimporte quel disque.
Page 7/124
La nouvelle fonctionnalit Automatic Storage Management (ASM) permet la base de donnes de grer directement les disques bruts, elle limine le besoin pour un gestionnaire de fichier de grer la fois des fichiers de donnes et des fichiers de journaux. LASM rpartit automatiquement toutes les donnes de bases de donnes entre tous les disques, dlivrant le dbit le plus lev sans aucun cot de gestion. Au fur et mesure de lajout et de labandon de disques, lASM actualise automatiquement la rpartition des donnes. Pour utiliser ASM vous devez dmarrer une instance appele ASM instance qui doit tre dmarre avant de dmarrer linstance de votre propre base de donnes. Les instances ASM ne montent pas de base de donnes (ensemble de fichiers constituant la base) mais gre les metadatas requises pour rendre les fichiers ASM disponibles nimporte quelle instance de base de donnes. Les deux, instance ASM et instance ordinaire ont accs au contenu des fichiers. Communicant avec linstance ASM seulement pour connatre le layout des fichiers utiliss.
Page 8/124
Outils de dveloppement Oracle offre l'accs un choix d'outils et processus de dveloppement, avec de nouvelles fonctionnalits comme Client Side Caching, Binary XML, un nouveau compilateur Java, l'intgration native avec Microsoft Visual Studio 2005 pour les applications .NET, Oracle Application Express pour les outils de migration, ou encore SQL Developer pour coder rapidement les routines SQL et PL/SQL.
Page 9/124
La documentation
Page 10/124
Trois outils sont prsents pour accder une base de donnes Oracle iSQL*Plus, peut tre utilis en application indpendante ou connect un rfrentiel Oracle Management Server (OMS) SQL*Plus (sqlplus), interface daccs la base de donnes en mode commande Oracle Enterprise Manager (OEM), appel Grid Control ou Database Control. o o Database control est cr la cration dune base oracle et ne permet dadministrer graphiquement que cette base de donnes Grid control est un outil qui permet dadministrer une ferme de bases de donnes (oracle ou non oracle).
1.1
Loutil iSQL*Plus
Outil Internet daccs une base de donnes Oracle, permettant dcrire des requtes SQL (dune faon plus ou moins graphique).
Par dfaut, seule la connexion en tant quutilisateur normal (non SYSDBA ou SYSOPER) est autorise. Par contre, la connexion en tant quutilisateur SYSDBA ou SYSOPER est protge par une authentification au niveau du serveur HTTP
Page 11/124
Pour lautoriser, il faut au choix : Ajouter des entres (utilisateur / mot de passe) laide de lutilitaire htpasswd dans un fichier dauthentification du serveur HTTP (dfini par dfaut dans le fichier de configuration isqlplus.conf : ORACLE_HOME\sqlplus\admin\iplusdba.pw Dsactiver lauthentification du serveur HTTP pour ce type de connexion (directive <Location /isqlplusdba> dans le fichier de configuration isqlplus.conf)
1.2
Loutil SQL*Plus
Il permet de saisir et dexcuter des ordres SQL ou du code PL/SQL et dispose en plus dun certain nombre de commandes.
-- sans connexion C:\> SQLPLUS /NOLOG -- avec connexion C:\> SQLPLUS system/tahiti@tahiti -- avec connexion et lancement dun script sur la ligne de commande C:\> SQLPLUS system/tahiti@tahiti @info.sql -- sous dos --------------set ORACLE_SID=TAHITI -- connection sans fichier de mot de passe SQL> connect /as sysdba Connect. SQL> show user USER est "SYS" -- sous unix --------------Export ORACLE_SID=TAHITI -- Connexion avec un fichier de mots de passe SQL> connect sys/secret as sysdba Connect. SQL> show user USER est "SYS" SQL>
Page 12/124
1.2.1
Environnement de travail
SQL*PLUS est avant tout un interprteur de commandes SQL. Il est galement fortement interfac avec le systme d'exploitation. Par exemple, sous UNIX, on pourra lancer des commandes UNIX sans quitter sa session SQL*PLUS. Un SGBDR est une application qui fonctionne sur un systme dexploitation donn. Par consquent, il faut se connecter au systme avant douvrir une session ORACLE. Cette connexion peut tre implicite ou explicite. Pour lancer SQL Plus sans se connecter une base de donnes utilisez la commande :
C:\> sqlplus /nolog
Pour dmarrer une session SQL Plus sous dos il suffit de se mettre en commande DOS puis dexcuter la commande SQL PLUS .
-- avec connexion C:\> SQLPLUS charly/secret@tahiti SQL> show user USER est "charly" SQL>
Page 13/124
Nous avons install au pralable les couches clients ORACLE sur le Poste Client. Cette installation est simple, il suffit de renseigner les modules installer et le protocole TCP/IP utiliser (il peut y en avoir plusieurs sur une mme machine). Depuis le groupe ORACLE, double cliquer sur licne SQL*Plus ...
La bote de dialogue suivante permet de saisir un compte et un mot de passe ORACLE ...
Le nom de la Chane hte correspond au nom du service Oracle Net de la base de donne laquelle lutilisateur veut se connecter. Celle ci se trouve le plus souvent sur un serveur distant. La session SQL*PLUS est ouverte ...
Pour se positionner dans le rpertoire courant il suffit deffectuer la manipulation suivante : Fichier Ouvrir (jusqu se que lon voit le contenu du rpertoire de travail dans la bote de dialogue) OK pour sortir de la bote de dialogue
Page 14/124
1.2.2
Le prompt SQL*Plus
Une fois une session SQL*PLUS dbute lutilisateur peut travailler en interactif ou non. Dans le premier cas il saisira ses commandes sous le prompt SQL et devra les terminer par le caractre ; pour lancer linterprtation. Dans le second cas, il construit ses scripts (avec lextension .sql ) et les lance sous le prompt SQL en les faisant prcder de start ou @. Une session SQL*PLUS se termine par la commande exit. La transaction en cours est alors valide. Une requte peut scrire sur plusieurs lignes. A chaque retour chariot linterprteur incrmente le numro de ligne jusquau ; final qui marque la fin de la saisie.
SQL> select * 2 from 3 avion; ID_AVION ---------1 2 3 4 NOM_AVION -----------------------------Caravelle Boeing Planeur A_Caravelle_2
SQL> start all_avion; ID_AVION ---------1 2 3 4 NOM_AVION -----------------------------Caravelle Boeing Planeur A_Caravelle_2
Lditeur par dfaut avec lequel sinterface SQL*PLUS est le Bloc Notes (c:\windows\notepad.exe). Les principes prcdents restent les mmes.
SQL*Plus est un outil compos de commandes de mise en forme et daffichage A ne pas confondre avec des commandes SQL.
Page 15/124
1.2.3
COL COL
ADRESSE
FORMAT
A20, formater laffichage dune colonne ADRESSE sur 20 caractres 99.99, formater laffichage dune colonne PRIXUNIT
PRIXUNIT FORMAT
CLEAR
SET LINESIZE 100, reformater la taille de la ligne 100 caractres SET SHOW PAUSE ON, afficher un rsultat page par page
CONNECT , se connecter linstance User/MotPass@adresseServeur , permet de changer de session utilisateur CLEAR SCREEN, r-initialiser lcran
SET SQLPROMPT TEST> , afficher le prompt SQL en : TEST> DESC Nom_Table, afficher la structure dune table ou dune vue @ nom_ficher, permet dexcuter le contenu dun fichier sql /, r-active la dernire commande SET ECHO ON/OFF, affiche ou non le texte de la requte ou de la commande excuter SAVE nom_ficher [append|create|replace], permet de sauvegarder le contenu du buffer courant dans un fichier .sql . TIMING ON|OFF, provoque laffichage dinformations sur le temps coul, le nombre dE/S aprs chaque requte TI ON|OFF, provoque laffichage de lheure avec linvite TERM [ON|OFF], supprime tout laffichage sur le terminal lors de lexcution dun fichier VER [ON|OFF], provoque laffichage des lignes de commandes avant et aprs chaque substitution de paramtre. SQL }, spcifie le caractre } comme tant le caractre de continuation dune commande SQL*Plus. SUFFIX txt, spcifie lextension par dfaut des fichiers de commande SQL*Plus
1.2.4
La commande SPOOL permet de gnrer un fichier rsultat contenant toutes les commandes passes lcran SPOOL NomFichier.txt, permet dactiver un fichier de format texte dans lequel on retrouvera les commandes et rsultas affichs dans SQL Plus.
Page 16/124
SPOOL MonFichier.txt -- commandes SQL affiches -- commandes SQL affiches -- commandes SQL affiches Spool OFF
1.2.5
Dclarer un diteur
Pour dclarer NotPad comme diteur SQL*PLUS, et lextension .txt pour excuter un script il suffit de saisir ces deux lignes de commandes :
SET
SUFFIX
TXT
DEFINE
_EDITOR = NOTPAD
Aprs avoir tap ces 2 lignes de commandes taper : ED Pour afficher lditeur NotPad.
1.3
Utilisation de paramtres
Linstruction ACCEPT permet de saisir des valeurs de paramtres (ce ne sont pas des variables et ce titre ne ncessitent aucune dclaration).
ACCEPT reference NUMBER PROMPT 'Entrez la rfrence dun avion: ' select * from avion where Id_avion=&reference;
SQL> @essai Entrez la rfrence dun avion: 1 ID_AVION NOM_AVION ---------- -----------------------------1 Caravelle
Page 17/124
Le dictionnaire de donnes
Cest un ensemble de tables et de vues qui donne des informations sur le contenu dune base de donnes. Il contient : Les structures de stockage Les utilisateurs et leurs droits Les objets (tables, vues, index, procdures, fonctions, )
Le dictionnaire de donnes charg en mmoire est utilis par Oracle pour traiter les requtes.
Il appartient lutilisateur SYS et est stock dans le tablespace SYSTEM. Sauf exception, toutes les informations sont stockes en MAJUSCULE. Il contient plus de 866 vues.
Il est cr lors de la cration de la base de donnes, et mis jour par Oracle lorsque des ordres DDL (Data Dfinition Langage) sont excuts, par exemple CREATE, ALTER, DROP
Il est accessible en lecture par des ordres SQL (SELECT) et est compos de deux grands groupes de tables/vues : Les tables et vues statiques Bases sur de vraies tables stockes dans le tablespace SYSTEM Accessible uniquement quand la base est ouverte OPEN Les tables et vues dynamiques de performance Sont en fait uniquement bases sur des informations en mmoire ou extraites du fichier de contrle Sinterrogent nanmoins comme de vraies tables/vues Donnent des informations sur le fonctionnement de la base, notamment sur les performances (do leur nom) Pour la plupart accessibles mme lorsque la base nest pas compltement ouverte (MOUNT)
Les vues statiques de performances sont stockes dans le fichier de contrle, et disponibles louverture de celui-ci (voir dmarrage et arret dune base Oracle).
Page 18/124
Les vues statiques sont constitues de 3 catgories caractrises par leur prfixe : USER_* : Informations sur les objets qui appartiennent lutilisateur ALL_* : Information sur les objets auxquels lutilisateur a accs (les siens et ceux sur lesquels il a reu des droits) DBA_* : Information sur tous les objets de la base
Derrire le prfixe, le reste du nom de la vue est reprsentatif de linformation accessible. Les vues DICTIONARY et DICT_COLUMNS donnent la description de toutes les tables et vues du dictionnaire. Oracle propose des synonymes sur certaines vues :
Les vues dynamiques de performance sont : Prfixes par V$ Derrire le prfixe, le reste du nom de la vue est reprsentatif de linformation accessible Dcrites dans les vues DICTIONARY et DICT_COLUMNS
Page 19/124
La base Exemple
Nous vous prsentons la base de donnes TAHITI qui servira de support aux exemples prsents dans le cours.
1.3.1
Modle Conceptuel de Donnes Projet Auteur : Tahiti : Clotilde Attouche Version 22/08/2004 Modle : Tahiti
Utilise
Est Equipage
Est Patron de 0,n 0,n Avion Id_Avion Nom_Avion I VA30 Employe ID_Emp I Nom VA30 Salaire N4 Emploi VA20 1,n Dirige
Page 20/124
1.3.2
Les contraintes dintgrit Oracle sont prsentes ci-dessous : UNIQUE pour interdire les doublons sur le champ concern, NOT NULL pour une valeur obligatoire du champ Cl primaire (PRIMARY KEY) pour lidentification des lignes (une valeur de cl primaire = une et une seule ligne), Cl trangre (FOREIGN KEY) prcisant quune colonne rfrence une colonne dune autre table, CHECK pour prciser des domaines de valeurs.
1.3.3
Le passage du Modle Conceptuel de Donnes en Modle Physique de donnes se fait en appliquant les rgles cites ci-dessous : Les entits deviennent des tables Les identifiants des entits deviennent les cls primaires de ces tables Les relations ternaires, dont toutes les cardinalits sont 0,N ou 1,N de chaque ct de la relation deviennent des tables La concatnation des identifiants des entits qui concourent la relation devient la cl primaire de la table issue de la relation ; chacun, pris sparment, devient cl trangre. Pour les relations possdant des cardinalits 0,1 ou 1,1 dun seul ct de la relation, on fait migrer lidentifiant cot 0,N dans lentit cot 0,1 devenue table, lidentifiant devient alors cl trangre ; Pour les relations possdant des cardinalits 0,1 et 1,1 de chaque ct de la relation, il est prfrable de crer une table, mais lon peut galement faire migrer lidentifiant dans lune des deux entits ; celui ci devient alors cl trangre (cest ce que font des outils comme Power AMC)
Page 21/124
1.3.4
Nous appliquons les rgles de passage du MCD au MPD pour gnrer le modle prsent ci-dessous avec Power AMC . Le Modle Physique de Donnes cr, une phase doptimisation doit tre effectue avant de crer la base de donnes . Durant cette phase, des index sont positionns sur les colonnes des tables les plus couramment utilises dans des requtes ; des informations seront dupliques.
Modle Physique de Donnes Projet : Tahiti Version 22/08/2004 Modle : Tahiti Auteur : Clotilde Attouche
VOL NO_VOL VOL_DEPART VOL_ARRIVE DESTINATION ID_AVION INTEGER DATE DATE CHAR(20) INTEGER not null not null null not null not null
NO_VOL = NO_VOL
EST_EQUIPAGE
ID_AVION = ID_AVION
ID_EMP NO_VOL
ID_EMP = ID_EMP
ID_EMP = EMP_ID_EMP
ID_AVION NOM_AVION
Page 22/124
Le langage SQL
Le langage SQL (Structured Query Langage) sappuie sur les normes SQL ANSI en vigueur et est conforme la norme SQL92 ou SQLV2 (ANSI X3.135-1889n, ISO Standard 9075, FIPS 127). Il a t dvelopp dans le milieu des annes 1970 par IBM (System R). En 1979 Oracle Corporation est le premier commercialiser un SGBD/R comprenant une incrmentation de SQL. Oracle comme acteur significatif intgre ses propres extensions aux ordres SQL. Depuis larrive dinternet et de lobjet Oracle fait voluer la base de donnes et lui donne une orientation objet, on parle SGBDR/O : System de Base de Donnes relationnel Objet. Les sous langages du SQL sont : LID : Langage dInterrogation des donnes, verbe SELECT LMD : Langage de Manipulation des Donnes, utilis pour la mise jour des donnes, verbes INSERT, UPDATE, DELETE, COMMIT, ROLLBACK LDD : Langage de dfinition des donnes, utilis pour la dfinition et la manipulation dobjets tels que les tables, les vues, les index , verbe CREATE, ALTER, DROP, RENAME, TRUNCATE LCD : Langage de Contrle des Donnes, utilis pour la gestion des autorisations et des privilges, verbe GRANT, REVOKE
1.4
Notion de schema
Le terme SCHMA dsigne lensemble des objets qui appartiennent un utilisateur, ces objets sont prfixs par le nom de lutilisateur qui les a crs. En gnral on indique sous le terme de schma, lensemble des tables et des index dune mme application. Principaux types dobjets de schma : Tables et index Vues, squences et synonymes Programmes PL/SQL (procdures, fonctions, packages, triggers)
1.5
Rgles de nommage
Un nom de structure Oracle doit respecter les rgles suivantes : 30 caractres maximums Doit commencer par une lettre Peut contenir des lettres, des chiffres et certains caractres spciaux (_$#) Nest pas sensible la casse Ne doit pas tre un mot rserv Oracle
Page 23/124
La commande SELECT
La commande SELECT permet diuntrroger des lignes de tables. Cette commande extrait les donnes des tables en relation les une avec les autres.
SELECT SELECT FROM WHERE AND Liste des colonnes dans lordre daffichage Liste des tables utilises Jointures Conditions
SQL> connect charly/charly@tahiti Connect. SQL> desc employe Nom ----------------------------------------ID_EMP NOM SALAIRE EMPLOI EMP_ID_EMP
SQL> 2 3 4
select nom, salaire, emploi from employe where salaire >=2000 order by nom ;
NOM SALAIRE EMPLOI ------------------------------ ---------- -----------------Marilyne 2000 Hotesse de l'Air Spirou 2000 Pilote
- Affiche le nom, le salaire et lemploi des employs dont le salaire est suprieur ou gal 2000 Euros.
Page 24/124
SELECT
WHERE
EMPLOYE
ID_EMP
1 2 3 4 NOM Gaston Spirou Titeuf Marilyne SALAIRE 1700 2000 1800 2000 EMPLOI Directeur Pilote Stewart Hotesse de lair 1 2 1 EMP_ID_EMP
Comme on peut sen rendre compte, une requte SELECT est trs intuitive car elle se rapproche du langage quotidien. Cest une des raisons du succs du SQL. Cependant, le SQL est avant tout un langage de dfinition et dextraction de donnes. Ses possibilits algorithmiques, de saisie, ou daffichage sont limites. Ce nest dailleurs pas sa finalit. Lorsquil ne suffit plus (impossibilit syntaxique ou requte trop lourde), on utilise un autre langage qui offre une plus grande puissance algorithmique ou graphique. Le SQL se contente alors dextraire les donnes ncessaires pour le langage hte (PL/SQL, Pro*C, etc. ...). Beaucoup doutils offrent en standard un interprteur SQL pour consulter les donnes dune base relationnelle (ORACLE ou autre).
Tous nos exemples vont sappuyer sur la base exemple qui se prsente dans ltat suivant :
SQL> select * from ID_AVION ---------1 2 3 4
AVION;
Page 25/124
VOL;
VOL_ARRI -------05/09/04 10/09/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2
EST_EQUIPAGE;
EMPLOYE;
NOM SALAIRE EMPLOI EMP_ID_EMP -------------------------- ------- ------------------ ---------Gaston 1700 Directeur Spirou 2000 Pilote 1 Titeuf 1800 Stewart 2 Marilyne 2000 Hotesse de l'Air 1
Nous avons class les diffrents types de requtes par thme : Requtes avec comparaisons Requtes avec jointures Requtes avec groupement Requtes ensemblistes Sous requtes Balayage dune arborescence
1.6
AND, OR, BETWEEN, NOT, IN, =, <>, !=, >, >=, <=
Ces oprateurs sappliquent aux valeurs numriques, aux chanes de caractres, et aux dates. Les chanes de caractres et les dates doivent tre encadres par '...' contrairement aux nombres.
Page 26/124
SQL> select * from avion 2 where id_avion between 1 and 2 3 and nom_avion like 'C%' ; ID_AVION NOM_AVION ---------- -----------------------------1 Caravelle
1.6.1
La clause IN
SQL> select nom, salaire 2 from employe 3 where salaire in (1700,1800) ; NOM SALAIRE ------------------------------ ---------Gaston 1700 Titeuf 1800
SQL> 2 3 4 5
select nom, salaire from employe where salaire < 2000 and emp_id_emp in (null, 2, 4) ;
1.6.2
La clause LIKE
La clause LIKE permet de rechercher des chanes de caractres : % _ Toute chane de 0 n caractres 1 caractre
ESCAPE \
Page 27/124
SQL> select nom, salaire, emploi 2 from employe 3 where nom like '%t_n'; NOM SALAIRE EMPLOI ------------------------------ ---------- -----------------Gaston 1700 Directeur
SQL> select nom_avion 2 from avion 3 where nom_avion like '_\_%' escape '\' ; NOM_AVION -----------------------------A_Caravelle_2 SQL> select nom_avion 2 from avion 3 where nom_avion like '_*_%' escape '*' ; NOM_AVION -----------------------------A_Caravelle_2
- Cette requte affiche tous les avions dont le nom commence par nimporte quel caractre suivi dun _ . - Sans lutilisation de % on se contenterait des noms sur 2 caractres qui respectent cette rgle.
1.6.3
La valeur NULL
Pour manipuler une valeur non renseigne (en lecture ou mise jour) on utilise le prdicat NULL
La valeur NULL pour un champ signifie non renseign. Il ne faut pas confondre avec zro ou blanc. Ce prdicat est utilisable dans toutes les commandes SQL (insert, select, ...).
SQL> select nom, emploi 2 from employe 3 where emp_id_emp is null ; NOM EMPLOI ------------------------------ -----------------Gaston Directeur
- Cette requte affiche le nom et le salaire des employs dont le salaire contient la valeur NULL
Page 28/124
1.6.4
La clause BETWEEN
SQL> select * from avion 2 where id_avion between 2 and 3 ; ID_AVION ---------2 3 NOM_AVION -----------------------------Boeing Planeur
Cette requte affiche lidentifiant et le nom des avions dont lidentifiant est compris entre 2 et 3 bornes incluses.
1.6.5
SQL> select id_avion, nom_avion 2 from avion 3 order by nom_avion ; ID_AVION ---------4 2 1 3 NOM_AVION -----------------------------A_Caravelle_2 Bong Caravelle Planeur
SQL> select id_avion, nom_avion 2 from avion 3 order by 2 ; ID_AVION ---------4 2 1 3 NOM_AVION -----------------------------A_Caravelle_2 Bong Caravelle Planeur
- Cette requte affiche lidentifiant et le nom des avions ordonns par nom davion, sur un ordre croissant.
Pour afficher un ordre dcroissant il suffit de prciser Desc derrire la colonne cite dans le tri. Le nom de colonne peut tre remplac par la position de la colonne derrire la clause SELECT.
Page 29/124
ID_AVION ---------3 1 2 4
1.6.6
Le mot cl DISTINCT permet dliminer les doublons lors de laffichage. Il porte sur toutes les colonnes affiches sur une ligne.
SQL> 2 3 4 5 6 7
select nom_avion Avion, nom from employe, avion, est_equipage, vol where est_equipage.id_emp = employe.id_emp and est_equipage.no_vol = vol.no_vol and vol.id_avion = avion.id_avion and nom_avion = 'Caravelle' order by nom ; NOM -----------------------------Gaston Marilyne Titeuf Marilyne
SQL> 2 3 4 5 6 7
select distinct nom_avion Avion, nom from employe, avion, est_equipage, vol where est_equipage.id_emp = employe.id_emp and est_equipage.no_vol = vol.no_vol and vol.id_avion = avion.id_avion and nom_avion = 'Caravelle' order by nom ; NOM -----------------------------Gaston Marilyne Titeuf
Page 30/124
1.7
Principe de base Les requtes concernent souvent des informations qui sont ventiles dans plusieurs tables. La recherche de ces informations sappuie sur le principe de jointure. Il sagit de rapprocher une ou plusieurs tables qui ont des colonnes en commun. Ces liens se traduisent la plupart du temps par des cls trangres.
Une jointure est donc un sous ensemble du produit cartsien de deux tables. Seules les lignes respectant les conditions de jointures sont conserves. La diffrence rside dans la condition de jointure (WHERE) et dans les arguments du SELECT.
1.7.1
Equijointure
Nous souhaitons afficher le nom de tous les AVIONs qui sont utiliss pour un VOL. Nous devons donc utiliser la table VOL pour lister tous les vols prvus, et la table AVION pour trouver le nom des avions. Mais il ne faut pas afficher le nom de tous les avions. Seuls ceux dont lidentifiant est mentionn dans la table VOL ont forcment t prvus pour voler.
SQL> 2 3 4
select nom_avion Avion, destination from vol, avion where vol.id_avion = avion.id_avion order by destination ;
La clause WHERE doit prfix la colonne Id_avion par le nom de la table concerne pour viter les conflits.
Page 31/124
En effet Oracle effectue dabord le produit cartsien entre les tables VOL et AVION avant dextraire les donnes afficher . La colonne Id_avion existe deux fois dans le produit cartsien et Oracle ne sait pas quelle colonne afficher. Nous allons dtailler cette requte afin de bien nous imprgner de lalgorithme de base mis en uvre pour rechercher les donnes.
Tout se passe comme si linterprteur construisait une table temporaire rsultant de toutes les associations possibles entre les lignes des deux tables.
Le systme nest pas capable de deviner les liens entre les deux tables. Il doit construire lassociation des donnes des deux tables en sappuyant sur les valeurs communes des champs Id_avion.
Il suffit ensuite de ne garder que les lignes qui correspondent la condition de jointure (ici galit des champs Id_avion) et dafficher les informations demandes.
SQL> 2 3 4
select nom_avion Avion, destination from vol, avion where vol.id_avion = avion.id_avion order by destination ; DESTINATION -------------------Marquises Tahiti Tokyo
Nous allons prsenter maintenant dautres types de jointures. Celui que nous venons de voir est une qui-jointure (la condition de jointure est une galit sur deux colonnes de deux tables diffrentes).
Page 32/124
1.7.2
Inequijointure
Une inqui-jointure est une jointure sans condition dgalit entre les deux colonnes. Elle utilise les oprateurs <, >, <=, >=, <>, != .
1.7.3
Jointure multiple
Une jointure multiple met en relation plusieurs colonnes de tables diffrentes, toujours en reliant ces tables par : Cl trangre vers cl primaire
SQL> select nom, destination 2 from vol, employe, est_equipage 3 where est_equipage.id_emp = employe.id_emp 4 and est_equipage.no_vol = vol.no_vol 5 and destination = 'Tahiti' ; NOM DESTINATION ------------------------------ -------------------Gaston Tahiti Marilyne Tahiti
Page 33/124
Condition :
La clause and destination = 'Tahiti' rduit la slection concernant la destination.
Affichage :
La clause SELECT ne mentionnant que les colonnes nom et destination , Oracle naffichera que ces deux colonnes.
1.7.4
Un alias permet de remplacer le nom dune table dans un ordre select par une lettre. Le nom de la table nest plus reconnu que par la lettre concerne dans la totalit de la requte. Afficher lquipage destination de Tahiti.
SQL> select nom, destination 2 from vol, employe, est_equipage 3 where est_equipage.id_emp = employe.id_emp 4 and est_equipage.no_vol = vol.no_vol 5 and destination = 'Tahiti' ; NOM DESTINATION ------------------------------ -------------------Gaston Tahiti Marilyne Tahiti SQL> select nom, destination 2 from vol v, employe e, est_equipage eq 3 where eq.id_emp = e.id_emp 4 and eq.no_vol = v.no_vol 5 and destination = 'Tahiti' ; NOM DESTINATION ------------------------------ -------------------Gaston Tahiti Marilyne Tahiti
Page 34/124
1.7.5
Auto-jointure
Une auto-jointure est une jointure rcursive sur une seule table. Si une table comporte n lignes, une auto-jointure sur cette table ncessitera au pire n x n comparaisons. Afficher les employs qui managent dautres employs.
SQL> select distinct e1.nom 2 from employe e1, employe e2 3 where e1.id_emp = e2.emp_id_emp; NOM -----------------------------Gaston Spirou
Vrification :
SQL> select nom, id_emp, emp_id_emp Manageur 2 from employe 3 order by nom; NOM ID_EMP MANAGEUR ------------------------------ ---------- ---------Gaston 1 Marilyne 4 1 Spirou 2 1 Titeuf 3 2
Lauto-jointure est utilise pour comparer la valeur dune colonne dans une ligne de la table par rapport aux autres valeurs contenues dans les lignes de la mme colonne et de la mme table. Pour russir une auto-jointure il suffit dimaginer que la base de donne contient deux tables identiques portant des noms diffrents : e1 et e2 . Comme on ne prcise pas la jointure, Oracle effectue un produit cartsien entre la table et elle mme.
Page 35/124
1.7.6
Jointure externe
Nous allons prsenter le principe de jointure externe par un exemple progressif. Dans un premier temps, nous souhaitons afficher tous les employs (nom et N du vol) qui sont affects un vol. Cette requte peut sexprimer :
SQL> 2 3 4
select nom, no_vol from employe e, est_equipage eq where eq.id_emp = e.id_emp order by nom ;
Les lignes provenant des tables EMPLOYE et EST_EQUIPAGE partagent toutes la colonne Id_emp sur laquelle porte la jointure. Seules les lignes qui vrifient la condition de jointure seront donc affiches. Si lon dsire afficher tous les employs qui sont affects ou non un vol et les informations sur ce vol on utilisera une jointure externe. Autrement dit on affichera galement SPIROU bien que ce dernier ne soit affect aucun vol. En fait, on cherche atteindre en plus des lignes qui satisfont la condition de jointure, les lignes de la table EMPLOYE dont la valeur de Id_emp napparat pas dans la table EST_EQUIPAGE. Une telle requte scrit en utilisant loprateur + (complmentaire) . Loprateur (+) doit tre situ sur la cl trangre qui pointe sur la table client .
Page 36/124
2 3 4
Affichage de tous les avions prvus pour un vol ou non. Pour ceux qui sont prvus pour un vol afficher le numro de vol et la destination :
SQL> 2 3 4 SQL> 2 3 4
select nom_avion, no_vol, destination from vol v, avion a where v.id_avion(+) = a.id_avion order by no_vol ; select nom_avion, no_vol, destination from vol v, avion a where v.id_avion(+) = a.id_avion order by no_vol ;
NOM_AVION NO_VOL DESTINATION ------------------------------ ---------- -------------------Caravelle 1 Tahiti Caravelle 2 Marquises Boeing 3 Tokyo Planeur A_Caravelle_2
1.8
Page 37/124
1.8.1
Il est possible dafficher un libell de son choix en titre des colonnes slectionnes.
SQL> select id_avion "N d'avion", nom_avion 2 from avion 3 order by "N d'avion" desc ; N d'avion ---------4 3 2 1 NOM_AVION -----------------------------A_Caravelle_2 Planeur Bong Caravelle
SQL> select id_avion "N d'avion", nom_avion Avion 2 from avion 3 order by "N d'avion" desc ; N d'avion ---------4 3 2 1 AVION -----------------------------A_Caravelle_2 Planeur Bong Caravelle
1.8.2
Les oprateurs
Oracle possde un ensemble doprateurs permettant la manipulation de colonnes et de variables. || + * / concatnation de chanes de caractres ajout dun nombre une date et heure retrait dun nombre une date et heure multiplier diviser
Page 38/124
1.8.3
Il est possible dafficher un libell intgr une requte dans une ligne :
SQL> 2 3 4
select nom_avion || ' : Destination ==> ' || destination Iles from avion a, vol v where v.id_avion = a.id_avion order by destination ;
ILES -------------------------------------------------------------------Caravelle : Destination ==> Marquises Caravelle : Destination ==> Tahiti Boeing : Destination ==> Tokyo
1.9
Les fonctions
Les requtes avec conditions de groupement semploient gnralement avec une fonction prdfinie.
ORACLE offre un vaste ensemble de fonctions utilisables lintrieur de la clause SELECT (minimum, maximum, moyenne, ...). Beaucoup de ces fonctions ne sont pas compatibles avec dautres SGBDR. Le problme de la migration se pose totalement et il faut se reporter au manuel ORACLE pour vrifier le respect de la norme ANSI.
1.9.1
Page 39/124
Ces fonctions sont utilises pour effectuer des calculs sur un ensemble de valeurs (de lignes) dune mme colonne, dans une table.
SQL> select max(salaire) 2 from employe ; MAX(SALAIRE) -----------2000
- Afficher le plus haut salaire des employs, cela ne nous dit pas combien demploys ont ce salaire.
SQL> select avg(salaire) "Moyenne des salaires" 2 from employe ; Moyenne des salaires -------------------1875
- Moyenne des salaires de la socit, cest la moyenne des valeurs de toutes les lignes de la table EMPLOYE pour la colonne SALAIRE.
1.9.2
ABS (n)
CEIL (n) POWER (m,n FLOOR (n) MOD (m,n) ROUND (n[,m]) SQRT (n)
1.9.3
SUBSTR (chane, a, b) = retourne une sous chane de a octets depuis la position b LTRIM(chane, car) = supprime les caractres lextrmit gauche de la chane chane tant quils appartiennent lensemble de caractres car. RTRIM(chane, car) = idem que LTRIM mais les caractres sont supprims droite de la chane. TRANSLATE(chane, car1, car2) = car1 et car2 sont des chanes de caractres considres comme des ensembles de caractres. La fonction TRANSLATE remplace chaque caractre de la chane chane prsent dans lensemble de caractres car1 par le caractre correspondant de la mme position de lensemble car2. REPLACE(chane, car [ ,chane]) = permet de remplacer un ensemble de caractres car par ceux de [chane]. Si [chane] est vide, les caractres car sont supprims de chane. UPPER (chane) = converti la chane en majuscules
Page 40/124
LOWER (chane) = converti la chane en minuscules LENGTH (chane) = renvoie la longueur de la chane TO_NUMBER = converti une chane de caractres en nombre TO_CHAR(nombre, format) = converti un nombre en chane de caractres en fonction du format.
Format :
9 0
Reprsente un chiffre (non reprsent si non significatif) Reprsente un chiffre (non reprsent si non significatif) Point dcimal apparent Dfinit la position du point dcimal non apparent Une virgule apparat lemplacement Un $ prcdera le premier chiffre significatif Les zros sont remplacs par des blancs Le nombre est reprsent avec un exposant Le signe ngatif est reprsent droite Le signe ngatif est plac entre <> Affiche le signe + si la valeur est positive et le signe - si elle est ngative Affiche la valeur en signe romain (majuscule) Affiche la valeur en signe romain (minuscule)
.
V , $ B E MI PR S
RN rn
Page 41/124
Format :
Sicle (avec signe) Sicle Anne (avec signe et virgule) Anne (avec virgule) Anne sur 4 chiffres Les 3 derniers chiffres de lanne Les 2 derniers chiffres de lanne Le dernier chiffre de lanne Numro du trimestre dans lanne Numro de semaine dans lanne Numro de semaine dans le mois Numro du mois Numro du jour dans lanne Numro du jour dans le mois Numro du jour dans la semaine
Page 42/124
Heure sur 12 heures Heure sur 24 heures Minutes Secondes Jour du calendrier julien Anne en toute lettres Nom du mois Nom du mois abrg sur les 3 premires lettres Nom du jour Nom du jour abrg sur les 3 premires lettres Indication AM Indication PM Indication BC Indication AD Ajout du suffixe ordinal ST, ND, RD, TH au nombre considr Ecriture en toutes lettres du nombre considr Deux derniers chiffres de lanne en cours
SP RR
SQL> col Depart format A20 SQL> select to_char(vol_depart, 'DD/MM/YYYY destination, no_vol 2 from vol 3 order by no_vol ; DEPART -------------------04/09/2004 16:19:53 09/09/2004 16:19:53 30/09/2004 16:19:53
HH24:MI:SS') Depart,
Page 43/124
1.9.4
SYSDATE = retourne la date et lheure du systme dexploitation NEW_TIME(d,a,b) = transforme la date et lheure d au mridien a en une date et heure au mridien b. ROUND(date[ ,prcision]) = arrondit la date la prcision spcifie. La prcision est spcifie en utilisant un des masques de mise en forme de la date. Par dfaut la prcision est le jour. TRUNC(date [ , prcision]) = Tronque la date la prcision spcifie. TO_DATE (chane, format) = retourne la chane au format date du systme (format identique la fonction to_char ). ADD_MONTHS(date, nombre) = ajoute ou soustrait le nombre de mois la date prcise, le rsultat est une date. MONTHS_BETWEEN(date1, date2) = prend comme valeur la diffrence date1 date2 exprime en nombre de mois. La partie fractionnaire du rsultat est calcule en considrant chaque jour comme gal 1/31 me jour. LAST_DAY(date) = prend comme valeur la date du dernier jour du mois contenu dans (date) NEXT_DAY(date, nom_du_jour) = spcifi par nom_du_jour. prend comme valeur la date du prochain jour de la semaine
EXTRACT (sur une date ou un timestamp) = retourne la valeur dune composante (anne, mois, ) dune date ou dun timestampEXTRACT(
YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | TIMEZONE_HOUR | TIMEZONE_MINUTE | TIMEZONE_REGION | TIMEZONE_ABBR FROM expression)
SQL> select to_char(sysdate, 'DAY DD MONTH YYYY') "Date du Jour" 2 from dual ; Date du Jour -----------------------------------------------------------SAMEDI 11 SEPTEMBRE 2004
Utilisation des fonctions date pour linsertion de lignes dans la table VOL.
INSERT INTO VOL VALUES (1,sysdate,sysdate+1,'Tahiti',1 ); INSERT INTO VOL VALUES (2,NEXT_DAY(sysdate,'JEUDI'),NEXT_DAY(sysdate,'VENDREDI'),'Marquises',1 );
Page 44/124
SQL> select * from vol; NO_VOL ---------1 2 3 VOL_DEPA -------04/09/04 09/09/04 30/09/04 VOL_ARRI -------05/09/04 10/09/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2
- Modifie le format date de la session courrante en MONDAY JUNE 26, 2037: 10:30PM
1.9.5
Autres fonctions
USER = nom de lutilisateur courant NVL (expr1,expr2) = retourne la valeur expr2 si expr1 est null ; sinon retourne expr1 DECODE (expr,val1,result1,(val2,result2,] [default]) = si expr gale une des valeurs, alors le rsultat correspondant est retourn, sinon le rsultat prend la valeur par dfaut ASCII (chaine) = permet dobtenir le code ASCII ou EBCDIC du premier caractre de la chane. CHR(n)= permet dobtenir le caractre dont le code ASCII ou EBCDIC est gal n. COALESCE(expression [, ]) = est une gnralisation de la fonction NVLRetourne la premire expression non NULL de la liste et remplace les valeurs NULL par les valeurs ou le contenu des colonnes sites entre parenthses, dans lordre demand. NVL2(expression1,expression2,expression3) = variante de la fonction NVLRetourne expression2 si expression1 est non NULL et expression3 si expression1 est NULL. Rpad(colonne, n, expression1) = Affiche le contenu de la colonne sur n caratres, et fait suivre le contenu de la colonne par expression1 autant de fois que ncessaire pour remplir la colonne affiche. NULLIF(expression1,expression2) = NULLIF retourne NULL si deux expression sont galesRetourne NULL SI expression1 est gal expression2 OU retourne expression1 SINON
CURSOR = Une expression CURSOR retourne un curseur imbriqu, quivalent au REF CURSOR en PL/SQL Peut uniquement tre utilis dans une requte SELECT ou en paramtre REF CURSOR dune fonction En SQL mais aussi en PL/SQL CURSOR(sous_requte)
Page 45/124
SQL> select user, ascii('Charly') 2 from dual ; USER ASCII('CHARLY') ------------------------------ --------------CHARLY 67 SQL> select no_vol, EXTRACT(YEAR FROM vol_depart) "Anne de Dpart" 2 from vol; NO_VOL Anne de Dpart ---------- --------------1 2004 2 2004 3 2004
SQL> select destination, vol_arrive, coalesce(vol_arrive, last_day(sysdate)) "ARRIVEE BIS" 2 from vol; DESTINATION -------------------Tahiti Marquises Tokyo VOL_ARRI -------05/09/04 10/09/04 ARRIVEE -------05/09/04 10/09/04 30/09/04
SQL> select rpad(nom, 55, '-employe') "Nouveau nom" 2 from employe 3 order by nom ; Nouveau nom -------------------------------------------------------------------------------Gaston-employe-employe-employe-employe-employe-employeMariline-employe-employe-employe-employe-employe-employ Spirou-employe-employe-employe-employe-employe-employeTiteuf-employe-employe-employe-employe-employe-employe-
Page 46/124
Vrification :
- On remarque que pour le vol N 1 lemploye 1 et lem ploy 4 y sont affects, et pour le vol 2 lemploye 3 et lemploye 4 y sont affects. - Le regroupement se fait en utilisant des fonctions de regroupement comme COUNT.
Pour rendre le regroupement de donnes explicite, il faut utiliser la clause GROUP BY.
GROUP BY SELECT FROM WHERE Liste des colonnes dans lordre daffichage Liste des tables utilises Jointures
SQL> select no_vol, count(id_emp) TOTAL 2 from est_equipage 3 group by no_vol; NO_VOL TOTAL ---------- ------------1 2 2 2
- Le nombre total demploys par vol, revient compter le nombre dID_EMP pour chaque NO_VOL diffrents. - Le regroupement se fait sur la cl NO_VOL.
Page 47/124
Dans un regroupement, il doit y avoir cohrence entre les colonnes du GROUP BY et les colonnes cites derrire le SELECT.
Afficher le nombre demploys prvus par vol, ainsi que la destination du vol.
SQL> select e.no_vol vol, destination, count(id_emp) "Nb. Employes" 2 from vol v, est_equipage e 3 where v.no_vol = e.no_vol 4 group by e.no_vol 5 ; select e.no_vol vol, destination, count(id_emp) "Nb. Employes" * ERREUR la ligne 1 : ORA-00979: N'est pas une expression GROUP BY
- Il doit y avoir cohrence entre les colonnes derrire le SELECT et le GROUP BY. - Ors il manque la colonne DESTINATION derrire le GROUP BY.
SQL> 2 3 4
select e.no_vol vol, destination, count(id_emp) "Nb. Employes" from vol v, est_equipage e where v.no_vol = e.no_vol group by e.no_vol, destination ;
Page 48/124
VOL ---------1 2
- La clause WHERE permet deffectuer la jointure ncessaire entre la table VOL et la table EST_EQUIPAGE.
SQL> 2 3 4
select destination, count(id_emp) "Nb. Employes" from vol v, est_equipage e where v.no_vol = e.no_vol group by e.no_vol, destination ;
DESTINATION Nb. Employes -------------------- -----------Tahiti 2 Marquises 2 SQL> 2 3 4 select destination, count(id_emp) "Nb. Employes" from vol v, est_equipage e where v.no_vol = e.no_vol group by destination ;
SQL> 2 3 4 5
select destination, count(id_emp) "Nb. Employes" from vol v, est_equipage e where v.no_vol = e.no_vol group by e.no_vol, destination having destination = 'Tahiti' ;
Page 49/124
Il faut veiller lordre des requtes que lon choisit de rapprocher, chacune delles doit correspondre un ensemble de donnes, ensemble que lon soustrait lun de lautre, dans un ordre tabli par la requte. Ces oprateurs sont souvent utiliss sur plusieurs tables.
Les colonnes cites derrire chaque SELECT doivent tre de mme structure (mme nombre de colonne, mme type de donnes).
1.11.1
Minus
La diffrence entre deux tables sexprime par linstruction MINUS. Elle permet dafficher les lignes de la premire requte qui ne sont pas comprises dans la seconde.
Afficher les avions qui ne sont pas utiliss pour un vol. Il sagit de la totalit des avions de la base de donnes MOINS les avions utiliss pour un vol.
SQL> 2 3 4 5 6 7
select nom_avion Avion from avion MINUS select nom_avion Avion from vol v, avion a where v.id_avion = a.id_avion ;
Page 50/124
1.11.2
UNION
Pour obtenir le cumul des lignes rsultats de deux requtes on utilise l'instruction UNION. Loprateur UNION ALL permet dafficher les doublons.
Liste des avions de la compagnie arienne. Cest la liste des avions qui ne volent pas UNION les avions qui volent.
SQL> 2 3 4 5 6 7 8 9 10 11 (select nom_avion Avion from avion minus select nom_avion Avion from vol v, avion a where v.id_avion = a.id_avion ) UNION select nom_avion Avion from vol v, avion a where v.id_avion = a.id_avion ;
1.11.3
INTERSECT
Pour obtenir les lignes rsultats dune premire requte comprises galement dans le rsultat dune seconde requte on pourra utiliser linstruction INTERSECT. Liste des avions qui volent, cest lintersection entre la liste de tous les avions et la liste des avions qui volent.
SQL> 2 3 4 5 6 7 select nom_avion Avion from avion intersect select nom_avion Avion from vol v, avion a where v.id_avion = a.id_avion ;
Page 51/124
Afficher les employs travaillant dans lavion pour le vol destination des les Marquises.
SQL> col nom format A20 SQL> col avion format A15 SQL> select nom, nom_avion Avion, destination 2 from employe e, est_equipage eq, 3 (select no_vol, nom_avion, destination from avion a, vol v 4 where v.id_avion = a.id_avion and destination = 'Marquises') v 5 where eq.no_vol = v.no_vol 6 and eq.id_emp = e.id_emp 7 order by nom ; NOM AVION DESTINATION -------------------- --------------- -------------------Marilyne Caravelle Marquises Titeuf Caravelle Marquises
Oracle rsout dabord la sous requte de la clause FROM : liste des avions destination des Marquises, puis excute la requte principale.
Page 52/124
1.13.1
Oprateurs de comparaison
Le lien entre la requte principale et la sous requte peut se faire en comparant une colonne avec le rsultat de la sous requte. Ceci se fait en utilisant un oprateur arithmtique comme : <, >, =, <=, >=, <>, != .
Exemple Afficher les employs qui ont un salaire au dessus de la moyenne des salaires de lentreprise. Il sagit de comparer le salaire de chaque employ avec la moyenne des salaires de lentreprise.
Page 53/124
Donc les employs qui ont un salaire suprieur la moyenne des salaires sont :
SQL> 2 3 4 5 6
select nom, salaire from employe where salaire > (select avg(salaire) from employe ) order by nom ;
SQL> 2 3 4 5 6
select nom, salaire from employe where salaire = (select min(salaire) from employe ) order by nom;
Si le rsultat dune sous-requte est NULL, alors la requte principale ne peut pas sexcuter.
Page 54/124
1.13.2
Oprateurs ensemblistes
Cette comparaison peut se faire galement en utilisant un oprateur ensembliste. Les oprateurs ensemblistes sont : ALL la condition est vraie si la comparaison est vraie pour chacune des valeurs retournes ANY la condition est vraie si la comparaison est vraie pour au moins une des valeurs retournes IN la condition est vraie si la comparaison est vraie pour une des valeurs retournes EXISTS Retourne le boolen vrai ou faux selon le rsultat de la sous requte.
Lutilisation de IN demande des temps de rponses importants, il est fortement conseill dutiliser loprateur EXISTS.
Raisonnement : En fait il sagit de la liste des avions de la base de donnes qui ne sont pas dans la liste des avions affects un vol. La liste des avions affects un vol correspond aux avions existants dans la table VOL . Soit :
SQL> select v.id_avion, nom_avion 2 from avion a, vol v 3 where v.id_avion = a.id_avion ; ID_AVION ---------1 1 2 NOM_AVION -----------------------------Caravelle Caravelle Boeing
Page 55/124
La liste des avions de la base de donnes sont les avions de la table AVION . Soit :
SQL> select id_avion, nom_avion 2 from avion 3 order by nom_avion ; ID_AVION ---------4 2 1 3 NOM_AVION -----------------------------A_Caravelle_2 Boeing Caravelle Planeur
SQL> 2 3 4 5 6 7
select id_avion, nom_avion from avion where id_avion NOT IN (select v.id_avion from avion a, vol v where v.id_avion = a.id_avion ) order by nom_avion ; NOM_AVION -----------------------------Planeur A_Caravelle_2
ID_AVION ---------3 4
Raisonnement : Il sagit de la liste des avions de la base de donnes qui nexistent pas dans la liste des avions affects un vol.
SQL> select id_avion, nom_avion 2 from avion 3 where NOT EXISTS (select v.id_avion 4 from avion a, vol v 5 where v.id_avion = a.id_avion 6 and v.id_avion = avion.id_avion 7 ) 8 order by nom_avion ; ID_AVION ---------3 4 NOM_AVION -----------------------------Planeur A_Caravelle_2
Cette requte peut galement scrire avec loprateur MINUS. Cest la liste des avions moins la liste des avions affects un vol.
Page 56/124
SQL> 2 3 4 5 6 7
select nom_avion Avion from avion MINUS select nom_avion Avion from vol v, avion a where v.id_avion = a.id_avion ;
Cette relation se traduit par lapparition de la cl trangre EMP_ID_EMP dans la table EMPLOYE aprs gnration du modle logique de donnes.
Page 57/124
SQL> select level, id_emp, nom, emp_id_emp 2 from employe 3 connect by emp_id_emp = prior id_emp 4 start with id_emp = 1 5 order by level ; LEVEL ID_EMP NOM EMP_ID_EMP ---------- ---------- ------------------------------ ---------1 1 Gaston 2 2 Spirou 1 2 4 Marilyne 1 3 3 Titeuf 2
SQL> select level, id_emp, nom, emp_id_emp 2 from employe 3 where id_emp <> 2 4 connect by emp_id_emp = prior id_emp 5 start with id_emp = 1 6 order by level ; LEVEL ID_EMP NOM EMP_ID_EMP ---------- ---------- ------------------------------ ---------1 1 Gaston 2 4 Marilyne 1 3 3 Titeuf 2
SQL> select level, id_emp, nom, emp_id_emp 2 from employe 3 connect by emp_id_emp = prior id_emp 4 and emp_id_emp != 2 5 start with id_emp = 1 6 order by level ; LEVEL ID_EMP NOM EMP_ID_EMP ---------- ---------- ------------------------------ ---------1 1 Gaston 2 2 Spirou 1 2 4 Marilyne 1
Page 58/124
SQL> 2 3 4 5
select nom from employe where emp_id_emp = 1 order by id_emp FOR UPDATE WAIT 2 ;
Si la ligne est toujours verrouille la fin du dlai dattente, lerreur ORA-30006 est dclenche. ORA-30006: ressource occupe ; acquisition avec temporisation WAIT expire.
Page 59/124
La syntaxe habituelle dcriture des jointures dans Oracle, comme nous lavons vu prcdemment nest pas ANSI. Oracle 9i propose un ensemble doprateurs explicites pour raliser la jointure de deux tables. La syntaxe SQL 1999 napporte aucune amlioration en termes de performances. Elle a t introduite par un souci de conformit avec les standards ANSI/ISO.
A partir de Oracle9i, la base de donnes supporte la syntaxe ANSI, dornavant recommand par Oracle Syntaxe : tout se passe dans la clause FROMLa syntaxe SQL 1999 a t introduite par un souci de conformit avec les standards ANSI/ISO.
SELECT [ALL | DISTINCT]{*,[EXPRESSION1 [AS] ALIAS1 [ , ...]} FROM NOM_TABLE1 { [CROSS JOIN NOM_TABLE2] | [NATURAL JOIN NOM_TABLE2 USING NOM_COLONNE1 [ ,...])] | [JOIN NOM_TABLE2 USING NOM_COLONNE1 [ ,...])] | [JOIN NOM_TABLE2 ON (NOM_TABLE1.NOM_COLONNE = NOM_TABLE2.NOM_COLONNE)] | [{LEFT | RIGHT | FULL} OUTER JOIN NOM_TABLE2 ON (NOM_TABLE1.NOM_COLONNE = NOM_TABLE2.NOM_COLONNE)] } ;
CROSS JOIN
le rsultat est le mme que celui dune requte sans condition qui affiche pour chaque ligne de la premire table lensemble des lignes de la deuxime table. la jointure entre les tables est effectue laide des colonnes qui portent le mme nom. la jointure entre les tables est effectue laide de la ou des colonnes spcifies. la jointure entre les tables est effectue laide de la condition spcifie. la jointure externe entre les tables est effectue laide de la condition spcifie.
NATURAL JOIN
Page 60/124
1.15.1
La base exemple
1.15.2
Page 61/124
1.15.3
Jointure
SQL> select idEmploye, NomEmp, idDepartement, DepNom from employe, department where Employe_idEmploye = idEmploye ; idEmploye --------000010 000120 000030 000140 000130 NomEmp idDepartement DepNom --------------------- -------------- -----------------HAAS A00 Computer Service OCONNEL A00 Computer Service KWAN C01 Information Center NICHOLLS C01 Information Center QUINTANA C01 Information Center
DB2 essaie de rsoudre dabord les prdicats et ensuite la jointure proprement dite (pour des raisons de performances), mme si dans la pratique on crit dabord la jointure et aprs les prdicats pour une raison de lisibilit de la requte.
Page 62/124
1.15.4
INNER JOIN
SQL> SELECT idEmploye, NomEmp, idDepartement, DepNom FROM employe INNER JOIN department ON Employe_idEmploye = idEmploye ; idEmploye --------000010 000120 000030 000140 000130 NomEmp idDepartement DepNom --------------------- -------------- -----------------HAAS A00 Computer Service OCONNEL A00 Computer Service KWAN C01 Information Center NICHOLLS C01 Information Center QUINTANA C01 Information Center
1.15.5
Jointure externe droite, elle permet dobtenir les lignes de la jointure interne + les lignes orphelines. Ainsi en plus des lignes communes on affiche les dpartements auquel aucun employ nest affect (la table nomme droite des mots cls RIGHT OUTER JOIN).
Page 63/124
SQL> SELECT idEmploye, NomEmp, idDepartement, DepNom FROM employe RIGHT OUTER JOIN department ON Employe_idEmploye = idEmploye ; idEmploye --------000010 000120 000030 000140 000130 -NomEmp idDepartement DepNom --------------------- -------------- -----------------HAAS A00 Computer Service OCONNEL A00 Computer Service KWAN C01 Information Center NICHOLLS C01 Information Center QUINTANA C01 Information Center -D01 Development Center
1.15.6
Jointure externe gauche, elle permet dobtenir les lignes de la jointure interne + les lignes orphelines. Ainsi en plus des lignes communes on affiche les employs qui ne sont pas affects un dpartement (la table nomme gauche des mots cls RIGHT OUTER JOIN).
SQL> SELECT idEmploye, NomEmp, idDepartement, DepNom FROM employe LEFT OUTER JOIN department ON Employe_idEmploye = idEmploye ; idEmploye --------000010 000120 000030 000140 000130 000400 NomEmp idDepartement DepNom --------------------- -------------- -----------------HAAS A00 Computer Service OCONNEL A00 Computer Service KWAN C01 Information Center NICHOLLS C01 Information Center QUINTANA C01 Information Center WILSON ---
Page 64/124
1.15.7
Jointure externe droite et gauche, elle permet dobtenir les lignes de la jointure interne + les lignes orphelines des 2 tables jointes. Ainsi en plus des lignes communes on affiche les employs qui ne sont pas affects un dpartement (la table nomme gauche des mots cls RIGHT OUTER JOIN) et les dpartements pour lesquels aucun employ nest affect (la table nomme droite des mots cls RIGHT OUTER JOIN).
SQL> SELECT idEmploye, NomEmp, idDepartement, DepNom FROM employe FULL OUTER JOIN department ON Employe_idEmploye = idEmploye ; idEmploye --------000010 000120 000030 000140 000130 -000400 NomEmp idDepartement DepNom --------------------- -------------- -----------------HAAS A00 Computer Service OCONNEL A00 Computer Service KWAN C01 Information Center NICHOLLS C01 Information Center QUINTANA C01 Information Center -D01 Development Center WILSON ---
1.15.8
Dterminer pour chaque projet affect un dpartement le responsable du dpartement concern ainsi que les projets affects un dpartement sans responsable. Pour rsoudre la requte il existe plusieurs mthodes.
Page 65/124
Page 66/124
SQL> SELECT idProjet, NomProjet , idDepartement, p.Employe_idEmploye, NomEmp FROM PROJET p INNER JOIN department ON Departement_idDepartement = idDepartement LEFT OUTHER JOIN employe ON p.Employe_idEmploye = idEmploye ; idProjet -------IF2000 IF1000 AD3100 NomProjet --------------------User Education Query Service Admin Service idDepartement -------------C01 C01 D01 Employe_idEmploye ----------------000030 000030 -NomEmp -Kwan Kwan --
SQL> SELECT idProjet, NomProjet , idDepartement, p.Employe_idEmploye, NomEmp FROM PROJET p INNER JOIN (department d LEFT OUTHER JOIN employe ON p.Employe_idEmploye = idEmploye ) ON p.departement_idDepartement = idDepartement ; idProjet -------IF2000 IF1000 AD3100 NomProjet --------------------User Education Query Service Admin Service idDepartement -------------C01 C01 D01 p.Employe_idEmploye ------------------000030 000030 -NomEmp -Kwan Kwan --
1.15.9
Lutilisation de prdicats dans les clauses JOIN, se font avec lutilisation de la clause WHERE suivi du prdicat choisi. Pour prvoir les lignes affiches, il faut imager que lopration de jointure se fait avant les autres clauses de lordre. Ainsi tous les employs et dpartement de la socit (les lignes communes et les employs qui ne sont pas affects un dpartement et les dpartements pour lesquels aucun employ nest affect.
Page 67/124
SQL> SELECT idEmploye, NomEmp, idDepartement, DepNom FROM employe FULL OUTER JOIN department ON Employe_idEmploye = idEmploye ; idEmploye --------000010 000120 000030 000140 000130 -000400 NomEmp idDepartement DepNom --------------------- -------------- -----------------HAAS A00 Computer Service OCONNEL A00 Computer Service KWAN C01 Information Center NICHOLLS C01 Information Center QUINTANA C01 Information Center -D01 Development Center WILSON ---
Si je ne garde que les employs qui ont un salaire suprieur 30000 et qui sont affects un dpartement dont le nom contient le mot Center : Jobtiens :
SQL> SELECT idEmploye, NomEmp, Salaire, idDepartement, DepNom FROM employe FULL OUTER JOIN department ON Employe_idEmploye = idEmploye WHERE salaire > 30000 AND DeptNom like %Center% ; idEmploye NomEmp Salaire idDepartement DepNom --------- --------------------- ------- -------------- -----------------000030 KWAN 38250 C01 Information Center
Page 68/124
Les vues
Les vues offrent : Scurit Ladministrateur permet daccder seulement des vues dont il peut galement administrer l'accs (insert, update, delete, select). Masquer la complexit Lutilisateur risque moins de se tromper sur des requtes complexes. La complexit de la requte se trouve dans le texte de cration de la vue. Simplifier la formulation Un simple select * from nom_vue peut tre en fait une requte mettant en oeuvre de nombreuses jointures. Sauvegarde indirecte de requtes complexes On est sr que le code dune requte stocke dans une vue est le mme pour tous (principe dencapsulation) Gestion des profils utilisateurs La perception logique des donnes nest pas la mme pour tous les utilisateurs. Les vues facilitent la gestion de ces diffrences. Chaque profil dutilisateur utilisera la vue qui le concerne.
SQL> CREATE VIEW Mes_Avions 2 AS select v.id_avion, nom_avion, destination 3 from avion a, vol v 4 where v.id_avion = a.id_avion 5 ; Vue cre.
Laccs aux lments dune vue est le mme que pour ceux dune table ...
SQL> select * from mes_avions; ID_AVION ---------1 1 2 NOM_AVION -----------------------------Caravelle Caravelle Boeing DESTINATION -------------------Tahiti Marquises Tokyo
Page 69/124
La syntaxe utilise ici semble exprimer quune vue et une table sont de mme nature. Il nen est rien. Une vue ne ncessite pas dautre stockage dinformation que le texte de sa requte de cration et une entre dans le dictionnaire des vues.
Chaque fois que lon manipule une vue, le texte effectif de la requte est reconstruit dynamiquement en consultant le dictionnaire des vues.
SQL> select view_name, text 2 from user_views 3 ; VIEW_NAME -----------------------------TEXT -------------------------------------------------------------------------------MES_AVIONS select v.id_avion, nom_avion, destination from avion a, vol v
Du point de vue fonctionnel, les vues supportent toutes les oprations SQL comme INSERT, UPDATE, DELETE, SELECT. A travers la vue, cest en fait la table partir de laquelle la vue a t construite qui sera mise jour (et la vue gnralement aussi par consquence). Si il est possible de modifier une table travers une vue, mais il existe des contraintes importantes :
SQL> insert into mes_avions 2 values (11,'Coucou','Perou') 3 ; insert into mes_avions * ERREUR la ligne 1 : ORA-01776: Impossible de modifier plus d'une table de base via une vue jointe
Page 70/124
SQL> insert into mes_avions 2 (destination) 3 values ('Perou') 4 ; insert into mes_avions * ERREUR la ligne 1 : ORA-01400: impossible d'insrer NULL dans ("CHARLY"."VOL"."NO_VOL")
La vue nutilise pas des oprateurs tels que : GROUP BY, DISTINCT, ORDER BY, des fonctions dagrgat, ou des fonctions analytiques, des collections ou des requtes imbriques La table ne contient pas de colonne de type LOB ou de type objet Les contraintes dintgrit sont respectes travers la vue La table ne fait pas lobjet de rplication Les index de la table sont de type B-Tree (pas de Cluster ou dIOT : Index Organised Table)
Pour la modification, la vue doit contenir une clause : WITH CHECK OPTION
Les options que lon peut associer une vue lors de sa cration sont : WITH CHECK OPTION WITH READ ONLY Respecte les conditions de la vue en mise jour Nautorise que la lecture
La clause WHITH CHECK OPTION garantie que toutes les insertions ou les mises jour travers la vue seront maintenant contrles avant dtre effectives. Le contrle effectu correspond aux conditions prcises dans la vue.
SQL> 2 3 4 5
create view Mes_Vols as select no_vol, vol_depart, destination from vol where vol_depart > to_date('10/09/2004', 'DD/MM/YYYY') with check option ;
Vue cre. SQL> select * from mes_vols; NO_VOL VOL_DEPA DESTINATION ---------- -------- -------------------3 30/09/04 Tokyo
Page 71/124
Attention aux contraintes dintgrits, par exemple linsertion dun nouveau vol travers la vue est contrle ...
SQL> insert into mes_vols 2 values (11,to_date('12/09/2004 20:30:00', 'DD/MM/YYYY HH24:MI:SS'), 'Perou'); insert into mes_vols * ERREUR la ligne 1 : ORA-01400: impossible d'insrer NULL dans ("CHARLY"."VOL"."ID_AVION")
Exemple Nous allons recrer la vue Mes_Vols en y ajoutant la colonne ID_AVION de la table VOL. Nous visualiserons dans lexemple linsertion de lignes dans la vue MES_VOLS et le contrle fait par Oracle avec loption WITH CHECK OPTION.
SQL> Drop view mes_vols; Vue supprime. SQL> create view Mes_Vols 2 as select no_vol, vol_depart, destination, id_avion 3 from vol 4 where vol_depart > to_date('10/09/2004', 'DD/MM/YYYY') 5 with check option ; Vue cre. SQL> insert into mes_vols 2 values (11,to_date('12/09/2004 20:30:00', 'DD/MM/YYYY HH24:MI:SS'), 3 'Perou', 3); 1 ligne cre. SQL> select * from mes_vols; NO_VOL ---------3 11 VOL_DEPA -------30/09/04 12/09/04 DESTINATION ID_AVION -------------------- ---------Tokyo 2 Perou 3
SQL> insert into mes_vols 2 values (11,to_date('08/09/2004 20:30:00', 'DD/MM/YYYY HH24:MI:SS'), 3 'Marquises', 1); insert into mes_vols * ERREUR la ligne 1 : ORA-01402: vue WITH CHECK OPTION - violation de clause WHERE
Page 72/124
Les tables sont visibles condition de prfixer le nom des tables par le user de cration des tables, par exemple la table AVION cre par le user CHARLY est accessible si on lappelle par : CHARLY.AVION
Il est possible de crer des synonymes afin dassocier un nom une table et de simplifier laccs des tables aux utilisateurs. Il sagit de donner un autre nom un objet afin de le rfrencer diffremment.
Page 73/124
drop public synonym AVION ; drop public synonym VOL ; -- CREATION de SYNONYM pour base Tahiti create public synonym AVION for charly.AVION ; create public synonym VOL for charly.VOL ;
Pour pouvoir renommer un synonyme, il ne doit pas avoir t cr avec la clause PUBLIC. Si cest le cas il faut le supprimer puis le re-crer.
to [schema.]nouv_nom ;
DROP [public]
SYNONYM
(schema.]nom_synonym ;
Page 74/124
ROWID
UROWID
Page 75/124
-- ============================================================ -Nom de la base : TAHITI -Nom de SGBD : ORACLE Version 8 -Date de cration : 22/08/2004 17:09 -- ============================================================ drop index EST_AFFECTE_PK / drop index EST_EQUIPAGE_FK / drop index EQUIPAGE_FK / drop table EST_EQUIPAGE cascade constraints / drop index VOL_PK / drop index UTILISE_FK / drop table VOL cascade constraints / drop index AVION_PK / drop table AVION cascade constraints / drop index EMPLOYE_PK / drop index A_POUR_PATRON_FK / drop table EMPLOYE cascade constraints /
Page 76/124
-- ============================================================ -Table : EMPLOYE -- ============================================================ create table EMPLOYE ( ID_EMP INTEGER not null, NOM VARCHAR2(30) not null, SALAIRE NUMBER(4) not null, EMPLOI VARCHAR2(20) null , EMP_ID_EMP INTEGER null , constraint PK_EMPLOYE primary key (ID_EMP) using index tablespace INDX ) tablespace DATA / -- ============================================================ -Index : A_POUR_PATRON_FK -- ============================================================ create index A_POUR_PATRON_FK on EMPLOYE (EMP_ID_EMP asc) tablespace INDX / -- ============================================================ -Table : AVION -- ============================================================ create table AVION ( ID_AVION INTEGER not null, NOM_AVION VARCHAR2(30) null , constraint PK_AVION primary key (ID_AVION) using index tablespace INDX ) tablespace DATA / -- ============================================================ -Table : VOL -- ============================================================ create table VOL ( NO_VOL INTEGER not null, VOL_DEPART DATE not null, VOL_ARRIVE DATE null, DESTINATION CHAR(20) not null, ID_AVION INTEGER not null, constraint PK_VOL primary key (NO_VOL) using index tablespace INDX ) tablespace DATA / -- ============================================================ -Index : UTILISE_FK -- ============================================================ create index UTILISE_FK on VOL (ID_AVION asc) tablespace INDX / -- ============================================================ -Table : EST_EQUIPAGE -- ============================================================ create table EST_EQUIPAGE ( ID_EMP INTEGER not null, NO_VOL INTEGER not null,
Page 77/124
constraint PK_EST_EQUIPAGE primary key (ID_EMP, NO_VOL) using index tablespace INDX ) tablespace DATA / -- ============================================================ -Index : EST_EQUIPAGE_FK -- ============================================================ create index EST_EQUIPAGE_FK on EST_EQUIPAGE (ID_EMP asc) tablespace INDX / -- ============================================================ -Index : EQUIPAGE_FK -- ============================================================ create index EQUIPAGE_FK on EST_EQUIPAGE (NO_VOL asc) tablespace INDX / -- ============================================================ -Index : CLES ETRANGERES -- ============================================================ alter table EMPLOYE add constraint FK_EMPLOYE_A_POUR_PA_EMPLOYE foreign key (EMP_ID_EMP) references EMPLOYE (ID_EMP) / alter table VOL add constraint FK_VOL_UTILISE_AVION foreign key references AVION (ID_AVION) / (ID_AVION)
alter table EST_EQUIPAGE add constraint FK_EST_EQUI_EST_EQUIP_EMPLOYE foreign key references EMPLOYE (ID_EMP) / alter table EST_EQUIPAGE add constraint FK_EST_EQUI_EQUIPAGE_VOL foreign key references VOL (NO_VOL) / alter table EMPLOYE add CONSTRAINT SALAIRE_CC CHECK (salaire >500); /
(ID_EMP)
(NO_VOL)
Page 78/124
Mthode dutilisation : Cration de la table contenant le type LOB, et insertion des lignes Dclaration et initialisation du handle dans le programme Excution dune requte SELECT FOR UPDATE sur la ligne contenant lindicateur du LOB Manipulation du LOB avec le package DBMS_LOB en utilisant le handle comme une rfrence aux donnes. Commit
Create table EMP ( Empno number(4), Ename varchar2(30), Carriere CLOB, Photo_identite BLOB ) LOB (photo_identite) Store as (tablespace tbs_image Initial 10 M Next 2M ) ;
Lorsque plusieurs colonnes LOB sont cres, chaque colonne possde des caractristiques de stockage particulires. Pour de bonnes performances placez le contenu des colonnes LOB dans des tablespaces diffrents.
Page 79/124
Dans lexemple prcdent plusieurs segments sont crs : Le segment de la table Le segment pour les donnes de la colonne CARRIERE Le segment pour les donnes de la colonne PHOTO_IDENTITE 2 segments dindex pour rfrencer les CHUNKS des colonnes LOB.
Un CHUNK est un nombre de blocks Oracle contigus permettant de stocker les octets dinformations. Chaque instance de LOB est un ensemble de CHUNKS qui ont la mme taille.
Il est recommand de crer les types LOB dans des tablespaces ddis..
Oprations SQL : Dfinition des objets de type BFILE Association des types BFILE avec les fichiers externes Gestion de la scurit des BFILES
Les autres oprations sont possibles avec le package DBMS_LOB et les OCI. Une donne de type BFILE est en lecture seule. Le fichier doit exister et se trouver dans la directory spcifie et le processeur Oracle doit possder le droit de lire celui-ci. Lorsque la donne BFILE est supprime, le fichier existe toujours. Chaque attribut de type BFILE dune ligne peut contenir la rfrence un fichier diffrent.
La DIRECTORY permet de spcifier un alias rfrenant un chemin daccs sur le serveur o sont stockes les fichiers rfrencs par les donnes de type BFILE.
Page 80/124
Le privilge READ permet daccder aux fichiers qui sont dans la directory, sans ce privilge les fichiers externes rfrencs par le type BFILE qui sont dans la directory ne sont pas accessibles.
nom_derectory
as
path_name ;
Le chemin spcifi peut ne pas exister la cration de la directory, mais il doit exister lors de son utilisation avec les fichiers BFILE.
Create or replace directory emp_dir As app/Oracle/LOB/emp ; Grant read on directory emp_dir to role_personnel ;
Page 81/124
Les tables
Il existe plusieurs types dobjets tels que les tables pour stocker des donnes. Ces donnes peuvent tre stockes dans les objets suivants : Table standard, cest la table par dfaut et la forme la plus couramment utilise pour stocker les donnes. Table partitionnes, qui permet le dveloppement dapplications volutives car elle comprend plusieurs partitions pouvant tre situes dans des tablespaces diffrents. Les partitions sont utiles pour de grandes tables qui peuvent tre interroges laide de plusieurs processus simultans. Index-organized tables (IOT), toute la table est stocke dans lindex de la cl primaire. Oracle na plus besoin daccder une deuxime structure. Table clusterises, utilises pour optimiser les jointures.
Les tables sont stockes dans des tablespaces. Lordre de cration dune table.
Create table nom_table Spcification des colonnes Spcification des contraintes dintgrit Spcification du stockage
Contraintes dintgrit
constraint nom_contrainte ] { primary key ( nom_colonne [ , nom_colonne ] [ using index clause_index ] | unique ( nom_colonne [ , nom_colonne ] [ using index clause_index ] ... ) ... )
| foreign key ( nom_colonne [ , nom_colonne ] ... ) references[ schema. ] table [ ( nom_colonne ) ] [ on delete cascade ] | check } ( regle_conditions )
Page 82/124
[ not
Stockage
[ [ [ [ ; TABLESPACE nom_tablespace ] PARALLEL ] PCTFREE valeur ] PCTUSED valeur ]
Exemple
-- ============================================================ Table : EMPLOYE -- ============================================================ create table EMPLOYE ( ID_EMP INTEGER not null, NOM VARCHAR2(30) not null, SALAIRE NUMBER(4) not null, EMPLOI VARCHAR2(20) null , EMP_ID_EMP INTEGER null , constraint PK_EMPLOYE primary key (ID_EMP) using index tablespace INDX ) TABLESPACE DATA / -- ============================================================ Index : A_POUR_PATRON_FK -- ============================================================ create index A_POUR_PATRON_FK on EMPLOYE (EMP_ID_EMP asc) tablespace INDX / -- ============================================================ Index : CLES ETRANGERES -- ============================================================ alter table EMPLOYE add constraint FK_EMPLOYE_A_POUR_PA_EMPLOYE foreign key (EMP_ID_EMP) references EMPLOYE (ID_EMP) /
Page 83/124
2.1
Les diffrents types de contraintes que lon trouve sous Oracle sont : NOT NULL (NN) : spcifie quune colonne ne peut pas contenir de valeurs nulles UNIQUE (UK) : dsigne une colonne ou une combinaison de colonnes comme unique PRIMARY KEY (PK) : dsigne une colonne ou une combinaison de colonnes comme cl primaire de la table FOREIGN KEY (FK) : dsigne une colonne ou une combinaison de colonnes comme la cl trangre dans une contrainte dintgrit rfrentielle CHECK (CK) : spcifie une condition que chaque ligne de la table doit remplir
Bien que les contraintes NN et CK ne requirent pas directement lattention de ladministrateur, les contraintes PK, FK et UK doivent tre gres pour assurer une disponibilit leve et des niveaux de performances acceptables. Une contrainte dintgrit peut tre dans lun des tats suivants : DISABLE : dsactive NOVALIDATE ENABLE : non valide active (contrainte force, donnes incohrentes) VALIDATE ENABLE : valide active
2.1.1
Les contraintes non diffres ou IMMEDIATE sont appliques la fin de chaque ordre LMD. Une violation de contrainte entrane lannulation de la transaction. Une contrainte dfinie comme IMMEDIATE ne peut pas tre modifie pour tre applique la fin de la transaction. Les contraintes diffres sont vrifies seulement lors de la validation dune transaction.
Pour quune contrainte soit de type diffr, il faut la dclarer sa cration : INITIALLY IMMEDIATE : elle doit fonctionner par dfaut comme une contrainte IMMEDIATE sauf si elle est dfinie autrement de faon explicite INITIALLY DIFERRED : elle est force par dfaut la fin de la transaction
Page 84/124
Les applications peuvent forcer la contrainte pour quelle fonctionne en diffr ou en mode immdiate. Ceci se fait en utilisant les commandes ALTER SESSION ou SET CONSTRAINT :
2.1.2
Lors de la cration de la table, une contrainte peut tre cre en fin de dclaration :
constraint nom_contrainte ] { primary key ( nom_colonne [ , nom_colonne ] ... ) [ using index clause_index ] | unique ( nom_colonne [ , nom_colonne ] ... ) [ using index clause_index ] | foreign key ( nom_colonne [ , nom_colonne ] ... ) | references [ schema. ] table [ ( nom_colonne ) ] [ on delete cascade ] | check ( regle_conditions ) } [ not deferrable | deferrable ( initially { immediate | deferred } ] [ disable | enable [ validate | novalidate ] ]
Il est conseill dadopter une convention standard de nommage des contraintes dintgrit.
Il est possible de crer les tables sans les contraintes dintgrit puis de rajouter celles-ci par une mise jour de table ultrieure en utilisant la commande :
ALTER TABLE ; Nom_table ADD CONSTRAINT Nom_contrainte
-- ============================================================ Index : CLES ETRANGERES -- ============================================================ alter table EMPLOYE add constraint FK_EMPLOYE_A_POUR_PA_EMPLOYE foreign key (EMP_ID_EMP) references EMPLOYE (ID_EMP) /
Page 85/124
alter table EMPLOYE add constraint EMPLOYE_NOM_UK unique(nom) / alter table EMPLOYE add constraint SALAIRE_EMPLOYE_CC check (salaire >0); /
2.1.3
La commande doit tre utilise pour une contrainte, si une cl primaire ou une contrainte unique est dsigne comme cl trangre, utilisez le paramtre CASCADE pour dsactiver la cl trangre avant de dsactiver la cl primaire ou la contrainte unique. De la mme faon, il est possible dactiver des contraintes dsactives.
2.2
Dans la version 11g apparait la notion de colonnes virtuelles. Ce sont des colonnes affiches lors des requtes SQL et utilises pour des ordres DML (Data Manipulation Langage) et DDL (Data Dfinition Langage). La colonnes virtuelles sont utilises pour faciliter les requtes des DATA Warehouse. Il est possible de les utiliser sur des partitions de tables.
Lors de la cration de la table -- ============================================================ Table : EMPLOYE -- ============================================================ create table EMPLOYE ( ID_EMP INTEGER not null, NOM VARCHAR2(30) not null, SALAIRE NUMBER(4) not null, EMPLOI VARCHAR2(20) null ,
Page 86/124
NB_ANNEE INTEGER not null, EMP_ID_EMP INTEGER null , ANCIENNETE AS (SALAIRE * 0.0005 * NB_ANNEE) constraint PK_EMPLOYE primary key (ID_EMP) using index tablespace INDX ) TABLESPACE DATA /
Dans notre exemple la colonne virtuelle ANCIENNETE reprsente la prime danciennet calcule pour le salari. Cette colonne est affiche au moment de la requte SQL. Pour les insertions ou modifications de donnes il faut utiliser loption DEFAULT.
INSERT INTO EMPLOYE VALUES (2, 5000, 5, DEFAULT);
Les colonnes virtuelles doivent obligatoirement rfrencer des colonnes existant dans la table dorigine.
2.3
Le ROWID
Le ROWID est une colonne virtuelle prsente dans chaque table qui donne un identifiant unique de chaque ligne. Il peut tre interrog comme les autres colonnes de la table :
SQL> SELECT ROWID, ROWID -----------------AAABcFAADAAAAAKAAA AAABcFAADAAAAAKAAB AAABcFAADAAAAAKAAC AAABcFAADAAAAAKAAD nom, salaire FROM employe; NOM SALAIRE ------------------------------ ---------Gaston 1700 Spirou 2000 Titeuf 1800 Mariline 2000
Il permet de localiser physiquement la ligne, cest le moyen le plus rapide pour accder une ligne. Il est utilis en interne par Oracle dans les index. Il ne change jamais, tant que la ligne nest pas supprime.
Le ROWID nest pas directement comprhensible. Dans la structure interne du ROWID, Oracle possde toutes les informations ncessaires la localisation physique de la ligne (fichier de donnes, numro de bloc, position de bloc). Le package DBMS_ROWID comporte plusieurs fonctions permettant dextraire les diffrents composants du ROWID. Fonctions couramment utilises :
Page 87/124
ROWID_INFO : informations sur le rowid ROWID_OBJECT : renvoie lidentifiant objet pour un rowid ROWID_RELATIVE_FNO : renvoie le numro de fichier relatif pour un rowid ROWID_BLOCK_NUMBER : renvoie le numro de bloc pour un rowid ROWID_ROW_NUMBER : renvoie le numro de ligne pour un rowid ROWID_TO_ABSOLUTE_FNO : renvoie le numro de fichier absolu pour un rowid ROWID_TO_EXTENDED : change un rowid de : limit tendu ROWID_TO_RESTRICTED : change un rowid de : tendu limit
La requte suivante permet dobtenir lemplacement physique des lignes dune table.
Select nom, rowid, Dbms_rowid.rowid_object(rowid) as objet, Dbms_rowid.rowid_relative_fno(rowid) as fichier relatif, Dbms_rowid.rowid_block_number(rowid) as block From opdef.employe ; NOM ------------Gaston Spirou Titeuf Mariline ROWID objet fichier relatif block ------------------ ---------- ------------------- ----AAABcFAADAAAAAKAAA 5893 3 10 AAABcFAADAAAAAKAAB 5893 3 10 AAABcFAADAAAAAKAAC 5893 3 10 AAABcFAADAAAAAKAAD 5893 3 10
2.4
Le reste du bloc contient les donnes (une plusieurs lignes de la table) et de lespace libre. Len-tte est stock dans la partie haute du bloc et les donnes sont insres partir du bas. Len-tte est susceptible de grossir (vers le bas) en fonction de lactivit dans le bloc, il ne rtrcit jamais.
Page 88/124
La taille de la ligne varie donc selon son contenu, cest la somme de la taille des colonnes qui la constituent, sa structure est la suivante : Len-tte contient quelques informations sur la ligne (nombre de colonnes, chanage ventuel, verrou), sa taille est variable (3 octets minimum). Chaque colonne est stocke avec un en-tte (sur 1 3 octets = longueur de la colonne) et sa valeur
Page 89/124
2.5
La cration dune table peut se faire partir dune table existante en prcisant la requte dextraction des colonnes dsires.
SQL> 2 3 4 5
create table AVION_BIS (id_avion, nom_avion) as select id_avion, nom_avion from avion;
Table cre. SQL> select * from avion_bis; ID_AVION ---------1 2 3 NOM_AVION -----------------------------Caravelle Boeing Planeur
2.6
SQL> select * from avion_bis; select * from avion_bis * ERREUR la ligne 1 : ORA-00942: Table ou vue inexistante SQL> select * from avion_2; ID_AVION ---------1 2 3 NOM_AVION -----------------------------Caravelle Boeing Planeur
Page 90/124
2.7
Il est possible de crer des tables temporaires afin doptimiser les temps dexcution des requtes, ou pour des raisons pratiques lors de traitements.
2.8
Il sagit de tables crs par un ordre SQL, CREATE TABLE, dont la dfinition est stocke dans la base ( mta-donnes ), mais dont les donnes sont stockes lextrieur de la base (dans des fichiers) et accessibles via un driver Oracle. Le fonctionnement est compltement transparent du point de vue applicatif. Par exemple elles permettent le stockage dun fichier. Seule la dfinition de la table est stocke dans la base, un peu comme une vue.
La dfinition dune table externe comporte deux parties : Une partie qui dcrit les colonnes (nom et type) Une partie qui dcrit la correspondance entre les colonnes et les donnes externes
Les donnes externes peuvent avoir plus de champs, moins de champs, des types diffrents par rapport aux colonnes de la table. Le driver est capable de les prsenter telles quelles sont dfinies dans la table.
Oracle fournit un driver permettant daccder des donnes stockes dans un fichier.
Page 91/124
Le driver Oracle Loader, utilise la technologie de SQL*Loader. Il permet daccder des donnes stockes dans un fichier, avec une syntaxe proche de celle de SQL*Loader pour spcifier la clause ACCESS PARAMETERS. La vue USER_EXTERNAL_TABLES donne des informations spcifiques aux tables externes.
2.9
Vous pouvez utiliser les vue matrialises pour fournir des copies locales de donnes distantes vos utilisateurs ou pour stocker des donnes dupliques dans la mme base de donnes. Une vue matrialise se fonde sur une requte qui utilise un lien de base de donnes appel DATABASE LINK, pour slectionner des donnes dans une base distante. Ces vues peuvent tre implmentes en lecture (READ-ONLY) ou en criture (UPDATABLE). Il est galement possible de les indexer. Selon la complexit de la requte qui dfinie une vue matrialise, il est possible dutiliser un journal de vue matrialise (Matrialized View Log) afin doptimiser les performances des oprations de rplication. Les vues matrialises peuvent tre utilises dans les Datawarehouses afin damliorer les performances en tant utilises comme objet dagrgat. Ces vues sont alors utilises par loptimiseur Oracle (CBO) pour tablir le plan dexcution des requtes. Il est galement possible de crer des vues matrialises partitionnes et baser ces vues sur des tables partitionnes.
Page 92/124
Les index
Les tables et les contraintes cres, il faut crer des index sur les colonnes utilises frquemment en fonction du volume des tables et des requtes, afin de rduire les temps de rponse. Par dfaut, Oracle cre un index unique sur les cls primaires. Par contre, il faut crer des index sur les autres colonnes en fonction des besoins.
Si trop dindex sont crs sur une table, les temps de rponse salourdissent, surtout si les tables ont des volumes importants.
Les index rduisent les temps de rponse en lecture seule, mais pnalisent les performances en modification (INSERT, UPDATE, DELETE). Un index peut comprendre une seule colonne (index unique), ou plusieurs colonnes (index concatn). Un index est donc un objet supplmentaire cr sur une ou plusieurs colonnes de table pour faciliter un accs rapide ses donnes.
-- ============================================================ Index: UTILISE_FK -- ============================================================ create index UTILISE_FK on VOL (ID_AVION asc) tablespace INDX /
3.1
Organisation logique
La classification logique dun index dpend de la perspective de lapplication. Un index colonne unique comprend une seule colonne dans la cl dindex. Un index concatn, galement appel index compos, est cr sur plusieurs colonnes dune table. Les colonnes ne doivent ni suivre forcment le mme ordre que celui des colonnes de la table, ni tre adjacentes. Un index comprend un maximum de 32 colonnes. Toutefois, la taille totale des colonnes reste infrieure un tiers de la taille du bloc de donnes. Un index unique garantit que deux lignes dune table nont pas la mme valeur dans la colonne qui le dfinit.
Page 93/124
Dans un index non unique, plusieurs lignes de table peuvent tre associes une cl unique.
3.2
Organisation physique
La structure de donnes utilise par Oracle pour stocker un index est un B*-Tree (arbre B). Oracle gre physiquement, diffremment les index suivants : Les index B*-Tree Les index cl inverse Les index Bitmap
Structure dun index B*_Tree Le nud principal dun index est appel nud racine (root node). Le deuxime niveau des nuds est constitu par les branches (branch). Le niveau le plus faible est constitu des feuilles (leaf). Les feuilles sont lies entre elles par une liste doublement chane, permettant un parcours des feuilles dans les 2 directions.
Page 94/124
En termes algorithmiques, la recherche dans un B*-Tree est semblable celle ralise dans un arbre binaire, la diffrence quun arbre B*-Tree peut contenir jusqu n nuds enfants, alors quun nud dun arbre binaire ne peut en contenir que 2. Oracle nutilise pas dindex organiss en nuds binaires mais plutt une arborescence quilibre.
Les entres dindex prsentes ci-dessus ne concernent que les index globaux ou les tables non partitionnes. Une entre de feuille dindex se compose de : Un en-tte dentre qui stocke le nombre de colonnes et les informations sur le verrouillage. Des lments de contrle pour stocker la longueur de la colonne dindex. Les valeurs de la colonne dindex. Le ROWID de la ligne qui contient les valeurs de la cl dindex.
Dans un index organis en B*-Tree, les valeurs de la cl sont rptes si plusieurs lignes de la table ont la mme valeur de cl. Les valeurs NULL ne figurent pas dans les entres dindex. Le ROWID est rduit car toutes les lignes appartiennent au mme segment. Lorsquune instruction SQL utilise un index, le nud racine dtermine le cot de larbre contenant la valeur recherche. Les deux intermdiaires fournissent des informations de localisation des valeurs stockes dans chaque nud de lindex.
Les index B*-Tree sont performants dans des environnements transactionnels (OLTP) pour lindexation de tables dynamiques.
Page 95/124
Lobjectif dun index est de rduire les entres-sorties. Cependant il arrive quun index provoque un nombre dentres-sorties suprieur au balayage complet dune table.
Supposons une table contenant 1 million de lignes stockes dans 5 milles blocs, et que les lignes contenant une valeur donne soient rparties sur plus de 4 milles blocs. Dans ce cas il est prfrable deffectuer un balayage complet de table.
Mme si le pourcentage brut de lignes renvoyes par la table est infrieur 1%, ds lors quil faut parcourir 80% du nombre total de blocs de la table pour renvoyer les donnes, il est loin dtre optimal de crer et dutiliser un index. Si on additionne en plus, le nombre de blocs quil faut lire pour consulter lindex et extraire le ROWID, le cot dutilisation de lindex augmente de manire vertigineuse.
Lutilisation dun index ne doit pas tre dtermine par un pourcentage arbitraire du nombre de lignes traites ou slectionnes dans une table, mais par le nombre de blocs qui doivent tre lus pour renvoyer les donnes.
Si le nombre de blocs qui doivent tre consults pour un index est plus faible que celui dun balayage complet de la table, lindex sera utile. Chaque application et chaque base de donnes possdent ses propres particularits, il faut donc viter toute gnralisation de slectivit des lignes et de pertinence des index.
3.3
Rappels sur les rgles dutilisation dun index B*-Tree : Indexer les colonnes frquemment utilises dans les clauses WHERE Sassurer que les requtes utilisant la cl dindex sont slectives : moins de 5 15% des lignes de la table extraites (dpend de la rpartition des donnes dans la table) Privilgier les index concatns ( attention lordre des colonnes) Ne pas hsiter ajouter dans la cl dindex une colonne ramene dans le SELECT (plus daccs la table !) Indexer les cls trangres ( vite des problmes de verrouillage sur la table enfant lors dun UPDATE ou un DELETE sur la table pre) Ne pas indexer les petites tables Grer les index uniques laide des contraintes PRIMARY KEY ou UNIQUE Sassurer que lcriture des requtes nempche pas lindex dtre utilis Sassurer que les index crs ne dgradent pas les performances des mises jour
Page 96/124
Les colonnes frquemment utilises dans les clauses WHERE peuvent ltre comme critre de slection ou critre de jointure. En gnral, une slectivit infrieure 5% est bonne et une slectivit suprieure 15% est mauvaise ; entre les deux, il faut tester Pour la slectivit, il faut que les valeurs de la colonne soient relativement uniques (beaucoup de valeurs distinctes) et que les conditions qui les utilisent soient elles-mmes slectives. Parmi les colonnes candidates, il faut dabord identifier les colonnes qui sont systmatiquement prsentes ensemble dans la clause WHERE : ce sont de bonnes candidates pour la cration dun index compos qui est gnralement plus slectif quun index simple.
Lordre des colonnes est important dans un index compos : un index compos est utilis si les colonnes de tte de la cl dindex sont prsentes dans la condition (mais lordre des colonnes dans la condition na pas dimportance). Indexer les petites tables ne sert rien car le nombre minimum de blocs lire lors dun accs par index est de 2 (1 bloc au minimum pour lindex et 1 bloc au minimum pour la table). Grce au paramtre DB_FILE_MULTIBLOCK_READ_COUNT, Oracle peut lire : DB_FILE_MULTIBLOCK_READ_COUNT blocs en une entre/sortie.
Donc, si la taille de la table est infrieure DB_FILE_MULTIBLOCK_READ_COUNT blocs, un index est moins performant que le parcours complet. Ainsi, en gnral, indexer des tables dune vingtaine de blocs napporte rien. Hormis les index uniques, il nest jamais certain quun index soit rellement performant ; il faut donc tester ! Durant ces tests, il faut sassurer que les index crs ne dgradent pas les performances des mises jour.
Page 97/124
Les commandes de mise jour de la base dclenchent ventuellement des triggers (cf. chapitre TRIGGERS) ou des contraintes dintgrit. Elles naccdent donc pas directement aux donnes comme en tmoigne le schma suivant : Nous allons prsenter les points fondamentaux de la syntaxe de ces commandes (nous appuyons nos exemples sur le schma de la base exemple prcdente).
3.4
3.4.1
INSERT INTO nom_table VALUES (liste de valeurs spares par des virgules dans lordre des colonnes cres);
INSERT INTO nom_table (liste de colonnes spares par des virgules dans lordre cres) VALUES (liste de valeurs spares par des virgules dans lordre des colonnes cites);
- Les CHAR et VARCHAR doivent tre saisis entre apostrophes '....' - La valeur NULL permet de ne pas saisir un champ - La fonction to_date permet de traduire une date dans le format interne.
Page 98/124
------------- INSERT Avion --------------------------INSERT INTO Avion VALUES (1,'Caravelle' ); INSERT INTO Avion VALUES (2,'Bong' ); INSERT INTO Avion VALUES (3,'Planeur' ); insert into avion values (4,'A_Caravelle_2'); ------------- INSERT Vol --------------------------INSERT INTO VOL VALUES (1,sysdate,sysdate+1,'Tahiti',1 ); INSERT INTO VOL VALUES (2,NEXT_DAY(sysdate,'JEUDI'),NEXT_DAY(sysdate,'VENDREDI'),'Marquises',1 ); INSERT INTO VOL VALUES (3,LAST_DAY(sysdate),NULL ,'Tokyo',2 );
Vrification :
SQL> select * from avion; ID_AVION ---------1 2 3 4 NOM_AVION -----------------------------Caravelle Bong Planeur A_Caravelle_2
SQL> select * from vol; NO_VOL ---------1 2 3 VOL_DEPA -------04/09/04 09/09/04 30/09/04 VOL_ARRI -------05/09/04 10/09/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2
3.4.2
Nous allons crer une table AVION_2, car pour notre exemple il faut travailler obligatoirement sur une autre table.
SQL> create table avion_2 2 ( 3 ID_AVION INTEGER not null, 4 NOM_AVION VARCHAR2(30) null , 5 constraint PK_AVION_2 primary key (ID_AVION), 6 DESTINATION VARCHAR2(30) null 7 ); Table cre.
Page 99/124
SQL> desc avion_2 Nom NULL ? Type ----------------------------------------- -------- -----------------------ID_AVION NOT NULL NUMBER(38) NOM_AVION VARCHAR2(30) DESTINATION VARCHAR2(30) SQL> select * from avion_2; aucune ligne slectionne
SQL> 2 3 4 5
insert into avion_2 select a.id_avion, nom_avion, destination from avion a, vol v where v.id_avion = a.id_avion and destination = 'Marquises' ;
1 ligne cre. SQL> select * from avion_2; ID_AVION NOM_AVION DESTINATION ---------- ------------------------------ -----------------------------1 Caravelle Marquises SQL> 2 3 4 insert into avion_2 (id_avion, nom_avion) select id_avion, nom_avion from avion where id_avion > 1 ;
3 ligne(s) cre(s). SQL> select * from avion_2; ID_AVION ---------1 2 3 4 NOM_AVION DESTINATION ------------------------------ -----------------------------Caravelle Marquises Bong Planeur A_Caravelle_2
Page 100/124
3.5
3.5.1
UPDATE nom_table SET liste daffectations WHERE conditions sur les lignes concernes;
SQL> select * from vol 2 ; NO_VOL ---------1 2 3 VOL_DEPA -------04/09/04 09/09/04 30/09/04 VOL_ARRI -------05/09/04 10/09/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2
SQL> update vol set 2 vol_arrive = to_date('01/10/2004 03:30:00', 'DD/MM/YYYY HH24:MI:SS') 3 where no_vol = 3 ; 1 ligne mise jour.
Vrification :
SQL> SQL> SQL> 2 3 4 5 col depart for A20 col arrive for A20 select to_char(vol_depart, 'DD/MM/YYYY HH24:MI:SS') Depart, to_char(vol_arrive, 'DD/MM/YYYY HH24:MI:SS') Arrive, destination from vol where no_vol = 3 ;
DEPART ARRIVE DESTINATION -------------------- -------------------- -------------------30/09/2004 16:19:53 01/10/2004 03:30:00 Tokyo
Page 101/124
3.5.2
Dans cet exemple nous allons modifier la table AVION_2 cre prcdemment.
update Article_1 set (Id_article, designation) SELECT Id_article, designation FROM Article WHERE .... SQL> select * from avion_2 ; ID_AVION ---------1 2 3 4 NOM_AVION DESTINATION ------------------------------ -----------------------------Caravelle Marquises Boeing Planeur A_Caravelle_2
SQL> select * from vol ; NO_VOL ---------1 2 3 VOL_DEPA -------04/09/04 09/09/04 30/09/04 VOL_ARRI -------05/09/04 10/09/04 01/10/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2
Modification de la table :
SQL> update avion_2 2 set (destination) = (select destination 3 from vol 4 where no_vol = 1) 5 where destination is null ; 3 ligne(s) mise(s) jour. SQL> select * from avion_2; ID_AVION ---------1 2 3 4 NOM_AVION -----------------------------Caravelle Boeing Planeur A_Caravelle_2 DESTINATION -----------------------------Marquises Tahiti Tahiti Tahiti
Page 102/124
3.5.3
Lordre SQL MERGE permet de slectionner des lignes dans une table en vue de les insrer ou de les modifier dans une autre table Le tout en une seule opration Lordre SQL MERGE peut tre utilis en PL/SQL
MERGE INTO table_cible [alias] USING source [alias] ON (condition) WHEN MATCHED THEN clause_update WHEN NOT MATCHED THEN clause_insert ;
sourcetable | vue | sous-requte clause_updateUPDATE SET colonne = expression | DEFAULT [,...] clause_insertINSERT (colonne[,...]) VALUES (expression | DEFAULT [,...])
- INTO table_cible [alias] : spcifie la table cible des insertions ou mises jour
table_cible : nom de la table alias : alias sur la table (optionnel)
- ON condition : dfinit la condition sur la table cible qui va dterminer la nature de lopration effectue sur chaque ligne de la table cible
Chaque ligne de la table cible telle que la condition est vraie est mise jour avec les donnes correspondantes de la source Si la condition nest vrifie pour aucune ligne de la table cible, Oracle insre une ligne dans la table cible avec les donnes correspondantes de la source
- WHEN MATCHED THEN clause_update : spcifie lordre UPDATE qui est excut sur les lignes de la table cible lorsque la condition est vrifie
UPDATE normal sans le nom de la table (dj dfinie par la clause INTO de lordre MERGE)
- WHEN NOT MATCHED THEN clause_insert : spcifie lordre INSERT qui est excut dans la table cible lorsque la condition nest pas vrifie
INSERT avec VALUES normal sans la clause INTO donnant le nom de la table (dj dfinie par la clause INTO de lordre MERGE)
Page 103/124
SQL> select v.id_avion, nom_avion, destination 2 from avion a, vol v 3 where v.id_avion = a.id_avion 4 and destination = 'Marquises' 5 ; ID_AVION NOM_AVION DESTINATION ---------- ------------------------------ -------------------1 Caravelle Marquises SQL> select * from avion_2; ID_AVION ---------1 2 3 4 5 6 NOM_AVION DESTINATION ------------------------------ -----------------------------Caravelle Marquises Tahiti Tahiti Tahiti Canaries Petit coucou
MERGE INTO avion_2 a -- cible USING (select v.id_avion, nom_avion, destination from avion a, vol v where v.id_avion = a.id_avion and destination = 'Marquises' ) d -- source = requte => alias vm ON (a.id_avion = d.id_avion) -- en cas d'galit WHEN matched then -- correspondance update set a.nom_avion = Essai Merge -- mise jour WHEN not matched then -- pas correspondance insert (a.nom_avion, a.destination) -- insrer values (d.nom_avion, d.destination) ; 1 ligne fusionne. SQL> select * from avion_2; ID_AVION ---------1 2 3 4 5 6 NOM_AVION DESTINATION ------------------------------ -----------------------------Essai Merge Marquises Tahiti Tahiti Tahiti Canaries Petit coucou
Page 104/124
SQL> select * from avion_2; ID_AVION ---------1 2 3 4 5 6 NOM_AVION DESTINATION ------------------------------ -----------------------------Essai Merge Marquises Tahiti Tahiti Tahiti Canaries Petit coucou
SQL> select v.id_avion, nom_avion, destination 2 from avion a, vol v 3 where v.id_avion = a.id_avion 4 and destination = 'Marquises' 5 ; ID_AVION NOM_AVION DESTINATION ---------- ------------------------------ -------------------1 Caravelle Marquises
MERGE INTO avion_2 a -- cible USING (select v.id_avion, nom_avion, destination from avion a, vol v where v.id_avion = a.id_avion and destination = 'Marquises' ) d -- source = requte => alias vm ON (a.id_avion != d.id_avion) -- en cas d'galit WHEN matched then -- correspondance update set a.nom_avion = Petit Coucou -- mise jour WHEN not matched then -- pas correspondance insert (a.nom_avion, a.destination) -- insrer values (d.nom_avion, d.destination) 5 lignes fusionnes.
Vrification :
SQL> select * from avion_2; ID_AVION ---------1 2 3 4 5 6 NOM_AVION -----------------------------Essai Merge Petit Coucou Petit Coucou Petit Coucou Petit Coucou Petit Coucou DESTINATION ---------------------------Marquises Tahiti Tahiti Tahiti Canaries
6 ligne(s) slectionne(s).
Page 105/124
En version 9i, la condition doit se faire sur lidentifiant sinon Oracle affiche une erreur :
ON (a.nom_avion != d.nom_avion) -- en cas d'galit * ERREUR la ligne 7 : ORA-00904: "A"."NOM_AVION" : identificateur non valide
3.5.4
Amliorations de la commande
MERGE
en version 10g
En version 10g, il y a deux nouveauts majeures pour la commande MERGE : De nouvelles clauses et extensions pour lutilisation standard de la commande MERGE, facilitant et acclrant son utilisation. Une clause optionnelle DELETE pour la commande MERGE UPDATE.
-- Cet exemple montre lutilisation dune clause WHERE qui permet -- aux paramtres UPDATE ou INSERT de pointer vers des produits non-obsoltes. MERGE Into product_change PC -- destination table1 USING products P -- source/delta table ON (P.prod_id = PC.prod_id) -- join condition WHEN MATCHED THEN UPDATE -- UPDATE IF JOIN SET PC.prod_naw_price = P.prod_list_price WHERE P.prod_status <> obsolete WHENE NOT MATCHED THEN INSERT (PC.prod_new_price) Values (P.prod_list_price) WHERE P.prod_status <> obsolete ;
Seules les lignes affectes par la clause DELETE seront mises jour par lopration MERGE dans la table de destination. La condition WHERE du DELETE value la valeur mise jour, et non la valeur originale qui a t valu par la condition UPDATE SET. Ainsi, si une ligne de la table de destination correspond la
Page 106/124
condition du DELETE mais nest pas incluse dans la jointure dfinie par la clause ON, elle nest pas efface.
-- supprimer les lignes des produits dont le statut est devenu obsolte -- en effectuant lUPDATE. -- elle supprime les produits obsoltes de la table de destination. MERGE Into product_change PC -- destination table 1 USING products P -- source/delta table ON (P.prod_id = PC.prod_id) -- join condition WHEN MATCHED THEN UPDATE -- UPDATE IF JOIN SET PC.prod_naw_price = P.prod_list_price , PC.prod_new_status = P.prod_status DELETE WHERE (PC.prod_new_status = obsolete) -- Purge WHENE NOT MATCHED THEN -- INSERT IF NOT JOIN INSERT (PC.prod_id, PC.prod_new_price, PC.prod_new_status) Values (P.prod_id, P.prod_list_price, P.prod_status) ;
3.6
Dans un ordre INSERT ou UPDATE, il est possible daffecter explicitement une colonne la valeur par dfaut dfinie sur cette colonne En mettant le mot cl DEFAULT comme valeur de la colonne NULL est affect si la colonne na pas de valeur par dfaut
SQL> insert into avion_2 2 values (5, 'Petit coucou', 'Canaries'); 1 ligne cre. SQL> insert into avion_2 2 values (6, 'Petit coucou', default); 1 ligne cre. SQL> select * from avion_2; ID_AVION ---------1 2 3 4 5 6 NOM_AVION -----------------------------Caravelle Bong Planeur A_Caravelle_2 Petit coucou Petit coucou DESTINATION -----------------------------Marquises Tahiti Tahiti Tahiti Canaries
6 ligne(s) slectionne(s).
Page 107/124
SQL> update avion_2 2 set nom_avion = default 3 where id_avion = 5 ; 1 ligne mise jour. SQL> select * from avion_2; ID_AVION ---------1 2 3 4 5 6 NOM_AVION -----------------------------Caravelle Bong Planeur A_Caravelle_2 Petit coucou DESTINATION -----------------------------Marquises Tahiti Tahiti Tahiti Canaries
6 ligne(s) slectionne(s). SQL> update avion_2 2 set nom_avion = default 3 where destination like '%h%'; 3 ligne(s) mise(s) jour. SQL> select * from avion_2 ; ID_AVION ---------1 2 3 4 5 6 NOM_AVION DESTINATION ------------------------------ -----------------------------Caravelle Marquises Tahiti Tahiti Tahiti Canaries Petit coucou
Page 108/124
3.7
3.7.1
SQL> select * from vol ; NO_VOL ---------1 2 3 10 VOL_DEPA -------04/09/04 09/09/04 30/09/04 11/09/04 VOL_ARRI -------05/09/04 10/09/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2 Paris
SQL> delete from vol where no_vol = 10; 1 ligne supprime. SQL> select * from vol ; NO_VOL ---------1 2 3 VOL_DEPA -------04/09/04 09/09/04 30/09/04 VOL_ARRI -------05/09/04 10/09/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2
Page 109/124
SQL> select * from avion_2 ; ID_AVION ---------1 2 3 4 NOM_AVION DESTINATION ------------------------------ -----------------------------Caravelle Marquises Bong Planeur A_Caravelle_2
SQL> delete from avion_2 2 where destination is null ; 3 ligne(s) supprime(s). SQL> select * from avion_2; ID_AVION NOM_AVION DESTINATION ---------- ------------------------------ -----------------------------1 Caravelle Marquises
3.7.2
Le vidage d'une table supprime toutes les lignes de la table et libre l'espace utilis. La table et ses index sont supprims. Une table rfrence par une cl trangre ne peut pas tre supprime.
- Si le paramtre DROP est utilis, tous les extents sont supprims. - Si le paramtre REUSE est spcifi, l'espace utilis par la table est conserve.
SQL> truncate table est_equipage ; Table tronque. SQL> truncate table avion; truncate table avion * ERREUR la ligne 1 : ORA-02266: Les cls primaires/uniques de la table rfrences par des cls trangres
Page 110/124
Lors du vidage dune table, il faut inactiver les contraintes cl trangres si ncessaire. Ne pas oublier de les ractiver aprs !
Page 111/124
12 Les squences
Les squences sont des objets permettant de grer les accs concurrents sur une colonne de table et dviter les inter-blocages.
Lappel de la squence lors de linsertion des donnes permet de rcuprer un numro calcul par Oracle chaque accs base. Ce numro est utilis comme identifiant et est unique.
Une seule squence doit tre cre pour chaque table de la base de donnes.
Il est possible dassocier un synonyme la squence avant de donner les droits dutilisation de celle-ci aux USERS .
3.8
create
sequence Nom_Sequence increment by entier start with entier maxvalue entier | nomaxvalue minvalue entier | nominvalue cycle | nocycle cache entier | nocache order | noorder
Page 112/124
- INCREMENT BY : indique le pas dincrmentation de la squence - START WITH : permet de spcifier la valeur de la premire valeur de squence gnrer. Par dfaut cette valeur correspond MINVALUE pour une squence ascendante et MAXVALUE pour une squence descendante. - MAXVALUE : indique la valeur maximum de la squence. Par dfaut 10 puissance 27 pour lordre croissant et -1 pour lordre dcroissant. - MINVALUE : indique la valeur minimum de la squence. Par dfaut 1 (NOMINVALUE) pour lordre croissant et -10 puissance 26 pour lordre dcroissant. - CYCLE : permet de revenir la valeur initiale en fin de limite. Loption NOCYCLE est prise par dfaut. - CACHE : spcifie au systme d allouer plusieurs squences en mme temps. La valeur spcifie doit tre infrieure au nombre de valeur du cycle. Oracle alloue par dfaut 20 valeurs. - ORDER : indique que les nombres doivent tre gnrs dans lordre de la demande. NOORDER est loption par dfaut.
3.9
Lutilisation de MA_SEQUENCE.NEXVAL permet de rcuprer la valeur suivante attribue par Oracle et de linsrer dans la premire colonne de la table client.
Ma_Sequence 100 ;
insert
into
values
Page 113/124
Alter sequence [schema.]sequence [increment by n] [start with n] [{maxvalue n | nomaxvalue}] [{minvalue n | nominvalue}] [{cycle | nocycle}] [{cache n | nocache}] [{order | noorder}] ;
- Les paramtres sont les mmes que pour la cration dune squence. - INCREMENT BY : indique le pas dincrmentation de la squence - START WITH : permet de spcifier la valeur de la premire valeur de squence gnrer. Par dfaut cette valeur correspond MINVALUE pour une squence ascendante et MAXVALUE pour une squence descendante. - MAXVALUE : indique la valeur maximum de la squence. Par dfaut 10 puissance 27 pour lordre croissant et -1 pour lordre dcroissant. - MINVALUE : indique la valeur minimum de la squence. Par dfaut 1 (NOMINVALUE) pour lordre croissant et -10 puissance 26 pour lordre dcroissant. - CYCLE : permet de revenir la valeur initiale en fin de limite. Loption NOCYCLE est prise par dfaut. - CACHE : spcifie au systme d allouer plusieurs squences en mme temps. La valeur spcifie doit tre infrieure au nombre de valeur du cycle. Oracle alloue par dfaut 20 valeurs. - ORDER : indique que les nombres doivent tre gnrs dans lordre de la demande. NOORDER est loption par dfaut.
Page 114/124
Principe gnral : ORACLE excute une commande qui appartient une transaction. ORACLE valide une transaction dans sa globalit ou pas du tout.
La lecture cohrente garantie par Oracle est la possibilit de lire des donnes pendant la mise jour de celles-ci tout en tant assur que la version des donnes lues est la mme.
Page 115/124
La premire commande insre une ligne de commande dans la table ligne_com (la commande numro 10 concerne 40 articles numro 5).
La seconde commande met jour la quantit en stock de larticle 5 daprs la quantit commande.
Ces deux commandes doivent tre excutes et valides toutes les deux. Si, pour une raison quelconque (panne, condition fausse, ...) lune des commandes na pu tre traite, ORACLE doit annuler lautre. Lorsque les deux commandes sont excutes et deviennent effectives, la transaction est valide. Dans le cas contraire, elle est annule. La base revient dans ltat quelle avait avant la transaction.
Lexcution dune commande (opration lmentaire) dpend de : syntaxe correcte, respect des contraintes, accessibilit physique ou logique des donnes (rseau, droits, ...)
Pour rendre dfinitive lexcution des commandes il faut valider la transaction correspondante.
La validation dune transaction est implicite ou explicite : La commande commit permet de valider lensemble des oprations lmentaires de la transaction en cours. La prochaine opration fera dbuter une nouvelle transaction. La commande rollback annule lexcution des oprations lmentaires de la transaction en cours. La prochaine opration fera dbuter une nouvelle transaction. La fin normale dune session (programme client ou session SQL*PLUS) entrane la validation implicite de la transaction courante. La fin anormale dune session entrane lannulation de la transaction courante. Les commandes de dfinition de donnes (CREATE, ALTER, RENAME, DROP) sont automatiquement valides.
Page 116/124
Il est cependant possible de dfinir plus finement une transaction en insrant des points de repres (savepoints). Linstruction SAVEPOINT permet de prciser les points de repres jusquo lannulation de la transaction pourra porter. On crer donc ainsi des sous transactions.
INSERT INTO ligne_com VALUES (10,1,5,40);
SAVEPOINT point1;
A ce niveau,
- linstruction commit valide les deux commandes INSERT et UPDATE, - linstruction rollback annule les deux commandes INSERT et UPDATE - linstruction ROLLBACK to point1 annule la commande UPDATE. La prochaine instruction commit ou rollback ne portera que sur la commande INSERT.
Intgrit des donnes Lintgrit des donnes est assure par les diffrentes contraintes dintgrit dfinies lors de la cration de la base. Elle doit tre maintenue lors de laccs simultan aux mmes donnes par plusieurs utilisateurs. La base de donnes doit passer dun tat cohrent un autre tat cohrent aprs chaque transaction.
Page 117/124
Concurrence des donnes La concurrence des donnes consiste coordonner les accs concurrents de plusieurs utilisateurs aux mmes donnes (deux SELECT doivent pouvoir sexcuter en parallle).
Consistance des donnes La consistance des donnes repose sur la stabilit des donnes. Lorsquun utilisateur utilise des donnes en lecture ou en mise jour, le systme doit garantir que lutilisateur manipule toujours les mmes donnes. Autrement dit, on ne doit pas dbuter un traitement sur des donnes dont la liste ou les valeurs sont modifies par dautres transactions (un SELECT dbutant avant un insert (mme valid) ne doit pas afficher le nouveau tuple insr)
Verrouillage implicite Toute commande insert ou update donne lieu un verrouillage des lignes concernes tant que la transaction nest pas termine. Toute transaction portant sur ces mmes lignes sera mise en attente.
Verrouillage explicite Dans certains cas lutilisateur peut souhaiter contrler lui-mme les mcanismes de verrouillage. En gnral, il utilise la commande :
select * from vol for update
Tous les VOLs sont verrouills mais une clause WHERE est possible. Le verrouillage ne porte alors que sur les lignes concernes. Il existe diffrents modes de verrouillages dune table (mode lignes partages, quivalent au select for update, mode lignes exclusives, mode table partage, mode partage exclusif, mode table exclusive). En plus de la simple visibilit des donnes, on peut ainsi prciser les verrous autoriss par dessus les verrous que lon pose. Par exemple, plusieurs select for update peuvent senchaner (verrouillage en cascade).
Page 118/124
Lorsque la premire transaction sera termine, le second select for update pose ses verrous et ainsi de suite. Par contre, un verrouillage en mode table exclusive empche tout autre mode de verrouillage. A titre dexemple, nous ne prsenterons ici que les verrouillages standards (implicites suite une commande insert, update, ou delete).
Verrouillage bloquant ORACLE dtecte les verrouillages bloquant (deadlock). Ces verrouillages correspondent une attente mutuelle de libration de ressources. Exemple Transaction T1 Transaction T2
update article set qtestock=10 where Id_article=1; update article set qtestock=30 where Id_article=2; update article set qtestock=20 where Id_article=2; update article set qtestock=40 where Id_article=1; commit; commit;
Si les deux transactions ne sont pas lances vraiment en mme temps, on ne parle pas de verrouillage bloquant. Les deux transactions sexcutent normalement lune la suite de lautre.
Dans tous les cas, aprs une instruction commit ou rollback : Les verrous sont levs Une nouvelle transaction commence la prochaine instruction.
Si les deux utilisateurs accdent aux mmes lignes dune table alors la transaction dbute le plus tard sera mise en attente. La validation de la premire transaction librera la seconde.
Les mcanismes internes de gestions des transactions et des accs concurrents sont grs par ORACLE. Il reste la charge du programmeur la gestion des verrous explicites et la matrise des verrous implicites. Les rgles gnrales sont les suivantes :
Page 119/124
Une transaction est constitue dun ensemble doprations lmentaires (insert, update, ...), ORACLE garantit quune transaction est entirement valide ou dfaite, Toute session SQL (sous SQL*PLUS ou depuis un programme) dmarre une transaction, Toute fin normale de session dclenche un commit, Toute fin anormale de session dclenche un rollback, Lunit de verrouillage sous ORACLE est la ligne, Une commande INSERT, DELETE, ou UPDATE entrane un verrouillage implicite des lignes concernes, La commande SELECT FOR UPDATE permet de verrouiller explicitement les lignes concernes. Elle peut utiliser la clause WHERE pour ne pas verrouiller toute la table, Les verrous sont levs par les commandes commit ou rollback.
Ne jamais perdre de vue les scnarii dactivit des oprateurs afin dviter de mettre en place une gestion aussi fine quinutile de lunit de verrouillage (ligne ?, table?). Concrtement, il faut se poser des questions de base comme Combien daccs concurrents sur telles donnes observe-t-on en moyenne ? . Le code sen trouvera considrablement simplifi.
Page 120/124
Lorsque la transaction se termine, elle libre le rollback segment mais les informations de rollback ne sont pas supprimes immdiatement Ces informations peuvent encore tre utiles pour une lecture cohrente
Par dfaut cest Oracle qui alloue les rollback segment aux transactions en cherchant rpartir les transactions concurrentes sur les diffrents rollback segment. Dans certain cas il est possible dallouer un rollback segment une transaction en utilisant lordre SQL : SET TRANSACTION USE ROLLBACK SEGMENT. Lorsquun rollback segment est plein et que la transaction a besoin despace, une erreur se produit et la transaction est arrte. Le rollback segment grossit dans la limite de la taille du tablespace qui le contient. En cas derreur, il faut alors retailler le rollback segment puis relancer la transaction en lui affectant le roollback segment agrandi. Lerreur snapshot to hold correspond problme de lecture cohrente. Une requte (SELECT) dans un segment peut tre crase par une transaction, lors de la lecture cohrente si il y a besoin de cette requte (SELECT) cela provoque lerreur snapshot to hold .
Page 121/124
Les packages, procdures, ou fonctions peuvent tre appels depuis toutes les applications qui possdent une interface avec ORACLE (SQL*PLUS, Pro*C, SQL*Forms, ou un outil client particulier comme NSDK par exemple). Les procdures (fonctions) permettent de : Rduire le trafic sur le rseau (les procdures sont locales sur le serveur) Mettre en uvre une architecture client/serveur de procdures et rendre indpendant le code client de celui des procdures ( lAPI prs) Masquer la complexit du code SQL (simple appel de procdure avec passage darguments) Mieux garantir lintgrit des donnes (encapsulation des donnes par les procdures) Scuriser laccs aux donnes (accs certaines tables seulement travers les procdures) Optimiser le code (les procdures sont compiles avant lexcution du programme et elles sont excutes immdiatement si elles se trouvent dans la SGA (zone mmoire gre par ORACLE). De plus une procdure peut tre excute par plusieurs utilisateurs.
Les packages permettent de regrouper des procdures ou des fonctions (ou les deux). On vite ainsi davoir autant de sources que de procdures. Le travail en quipes et larchitecture applicative peuvent donc plus facilement sorganiser du ct serveur, o les packages regrouperont des procdures choisies un niveau fonctionnel. Les packages sont ensuite utiliss comme de simples librairies par les programmes clients. Mais attention, il sagit de librairies distantes qui seront processes sur le serveur et non en locale (client/serveur de procdures). Dans ce contexte, les quipes de dveloppement doivent prendre garde ne pas travailler chacune dans leur coin . Les dveloppeurs ne doivent pas perdre de vue la logique globale de lapplication et les scnarios dactivit des oprateurs de saisie.
Page 122/124
15 Les Triggers
Un trigger permet de spcifier les ractions du systme dinformation lorsque lon touche ses donnes. Concrtement il sagit de dfinir un traitement (un bloc PL/SQL) raliser lorsquun vnement survient.
Les vnements sont de six types (dont trois de base) et ils peuvent porter sur des tables ou des colonnes : BEFORE AFTER BEFORE AFTER BEFORE AFTER INSERT INSERT UPDATE UPDATE DELETE DELETE
Pour bien situer le rle et lintrt des TRIGGERS, nous prsentons ici une vue gnrale des contraintes sur le Serveur :
Procdures Select Insert Update Delete Etc... Trigger Contraintes d'intgrites Not Null Primary Key Unique Key Foreign Key Contrainte Check
kmlkmlkm
Tables
Type Longueur
Les TRIGGERS permettent de : renforcer la cohrence des donnes dune faon transparente pour le dveloppeur, mettre jour automatiquement et dune faon cohrente les tables (ventuellement en dclenchant dautres TRIGGERS).
Page 123/124
Rappelons que les contraintes dintgrit sont garantes de la cohrence des donnes (pas de ligne de commande qui pointe sur une commande inexistante, pas de code postal avec une valeur suprieur 10000, pas de client sans nom, etc. ...).
Les TRIGGERS et les contraintes dintgrit ne sont pas de mme nature mme si les deux concepts sont lis des dclenchements implicites. Un trigger sattache dfinir un traitement sur un vnement de base comme Si INSERTION dans telle table alors faire TRAITEMENT . Lintrt du TRIGGER est double. Il sagit dune part de permettre lencapsulation de lordre effectif (ici INSERTION) de mise jour de la base, en vrifiant la cohrence de lordre. Dautre part, cest la possibilit dautomatiser certains traitements de mise jour en cascade.
Les traitements dun TRIGGER (insert, update, delete) peuvent dclencher dautres TRIGGERS ou solliciter les contraintes dintgrit de la base qui sont les derniers gardiens de laccs effectif aux donnes.
En version 9i il existe des TRIGGERS rattachs aux VUES ou des TRIGGERS sur vnements systmes.
Page 124/124