Sie sind auf Seite 1von 124

Oracle SQL 2 & SQL*Plus

Auteur : Clotilde Attouche Version 1.1 Du 6 Mars 2010

www.tellora.fr

Oracle SQL - SQL*Plus 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

Loutil iSQL*Plus .............................................................................................. 11 Loutil SQL*Plus ............................................................................................... 12


Environnement de travail ........................................................................................ 13 Le prompt SQL*Plus ............................................................................................... 15 Quelques commandes SQL*Plus ............................................................................ 16 Gnrer un fichier rsultat appel spool .......................................................... 16 Dclarer un diteur ................................................................................................. 17

1.3 4 5

Utilisation de paramtres ................................................................................... 17

Le dictionnaire de donnes ........................................................................................ 18 La base Exemple ........................................................................................................ 20


1.3.1 1.3.2 1.3.3 1.3.4 Modle Conceptuel de Donnes Tahiti ..................................................................... 20 Les contraintes dintgrit ...................................................................................... 21 Rgles de passage du MCD au MPD ......................................................................... 21 Modle Physique de donnes Tahiti : ...................................................................... 22

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

La commande SELECT ................................................................................................ 24 1.6


1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6

1.7
1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6

Requtes avec jointures ..................................................................................... 31


Equijointure ............................................................................................................ 31 Inequijointure ........................................................................................................ 33 Jointure multiple .................................................................................................... 33 Utiliser des ALIAS ................................................................................................... 34 Auto-jointure .......................................................................................................... 35 Jointure externe ..................................................................................................... 36

1.8
1.8.1

Ecriture et mise en forme ................................................................................... 37


Afficher un titre de colonne .................................................................................... 38

Page 2/124

Oracle SQL - SQL*Plus www.tellora.fr

1.8.2 1.8.3

Les oprateurs ........................................................................................................ 38 Afficher un libell dans une requte ....................................................................... 39

1.9
1.9.1 1.9.2 1.9.3 1.9.4 1.9.5

Les fonctions .................................................................................................... 39


Les fonctions dagrgat........................................................................................... 39 Les fonctions numriques ....................................................................................... 40 Les fonctions de chanes de caractres ................................................................... 40 Les fonctions de gestion du temps .......................................................................... 44 Autres fonctions ..................................................................................................... 45

1.10 1.11
1.11.1 1.11.2 1.11.3

Requtes avec regroupement.............................................................................. 46 Requtes ensemblistes ...................................................................................... 50


Minus ..................................................................................................................... 50 UNION ................................................................................................................... 51 INTERSECT............................................................................................................. 51

1.12 1.13
1.13.1 1.13.2

Sous requtes dans la clause FROM ..................................................................... 52 Requtes imbriques ......................................................................................... 53


Oprateurs de comparaison ................................................................................... 53 Oprateurs ensemblistes ....................................................................................... 55

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

Balayer une arborescence .................................................................................. 57 La clause FOR UPDATE WAIT .............................................................................. 59


La base exemple .................................................................................................... 61 Contenu de la base exemple .................................................................................. 61 Jointure ................................................................................................................. 62 INNER JOIN ........................................................................................................... 63 RIGHT OUTER JOIN ................................................................................................ 63 LEFT OUTER JOIN .................................................................................................. 64 FULL OUTER JOIN .................................................................................................. 65 Jointure de plus de 2 tables ................................................................................... 65 Jointure et utilisation de prdicats ........................................................................ 67

Les jointures ANSI ..................................................................................................... 60

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

Les types de donnes utiliss dans les tables .......................................................... 75

1.19 1.20 1.21 2 2.1


2.1.1 2.1.2 2.1.3

Les tables .................................................................................................................. 82

Page 3/124

Oracle SQL - SQL*Plus www.tellora.fr

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

Les index ................................................................................................................... 93

3.5
3.5.1 3.5.2 3.5.3 3.5.4

Modifier les lignes dune table ............................................................................101


La commande UPDATE .......................................................................................... 101 Modifications de lignes partir dune table existante ........................................... 102 Modifier une table par fusion : MERGE .................................................................. 103 Amliorations de la commande MERGE en version 10g ........................................... 106

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

3.10 3.11 13 3.12 3.13 3.14 3.15 3.16 14 15

Transactions et accs concurents .......................................................................... 115

Procdures, Fonctions et Packages ....................................................................... 122 Les Triggers .......................................................................................................... 123

Page 4/124

Oracle SQL - SQL*Plus www.tellora.fr

La base de donnes Oracle 11g

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

La documentation

La documentation Oracle est galement consultable partir du serveur : http://www.oracle.com

La documentation Oracle est galement consultable partir du serveur : http://tahiti.oracle.com

Page 10/124

Oracle SQL - SQL*Plus www.tellora.fr

Les Outils daccs la base

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

Oracle SQL - SQL*Plus www.tellora.fr

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)

Lors dune connexion SYSDBA ou SYSOPER, lURL est modifie en : http://serveur[:port]/isqlplusdba

1.2

Loutil SQL*Plus

Outil ligne de commande nomm SQLPLUS.

SQLPLUS [ connexion ] [ @fichier_script [argument [,]] ]

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle mmorise le chemin du rpertoire affich.

Page 14/124

Oracle SQL - SQL*Plus www.tellora.fr

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

Un script se lance par la commande start nom_script ou @ nom_script...

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

Oracle SQL - SQL*Plus www.tellora.fr

1.2.3

Quelques commandes SQL*Plus

COL COL

ADRESSE

FORMAT

A20, formater laffichage dune colonne ADRESSE sur 20 caractres 99.99, formater laffichage dune colonne PRIXUNIT

PRIXUNIT FORMAT

CLEAR

COL, r-initialiser la taille des colonnes par dfaut

SET LINESIZE 100, reformater la taille de la ligne 100 caractres SET SHOW PAUSE ON, afficher un rsultat page par page

USER, visualiser le user sous lequel on est connect

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

Gnrer un fichier rsultat appel spool

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

Oracle SQL - SQL*Plus www.tellora.fr

SPOOL OFF, permet de dsactiver le spool ouvert prcdemment.

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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 :

Synonyme cols dict ind obj seq syn tabs

Vue correspondante User_tab_columns Dictionnary User_indexes User_objects User_sequences User_synonyms User_tables

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

Exemple de vues dynamiques V$INSTANCE V$DATABASE V$SGA V$DATABASE V$PARAMETER

Page 19/124

Oracle SQL - SQL*Plus www.tellora.fr

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 Tahiti

Modle Conceptuel de Donnes Projet Auteur : Tahiti : Clotilde Attouche Version 22/08/2004 Modle : Tahiti

Vol No_Vol Vol_Depart Vol_Arrive Destination 1,1 I DT DT A20 0,n

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

0,1 A pour Patron

Page 20/124

Oracle SQL - SQL*Plus www.tellora.fr

1.3.2

Les contraintes dintgrit

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.

Une cl primaire induit la cration de deux contraintes NOT NULL et UNIQUE

1.3.3

Rgles de passage du MCD au MPD

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

Oracle SQL - SQL*Plus www.tellora.fr

1.3.4

Modle Physique de donnes Tahiti :

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

INTEGER not null INTEGER not null

ID_EMP = ID_EMP

ID_EMP = EMP_ID_EMP

ID_AVION NOM_AVION

AVION INTEGER VARCHAR2(30)

not null null

ID_EMP NOM SALAIRE EMPLOI EMP_ID_EMP

EMPLOYE INTEGER VARCHAR2(30) NUMBER(4) VARCHAR2(20) INTEGER

not null not null not null null null

Page 22/124

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

ORDER BY Condition de Tri

SQL> connect charly/charly@tahiti Connect. SQL> desc employe Nom ----------------------------------------ID_EMP NOM SALAIRE EMPLOI EMP_ID_EMP

NULL ? -------NOT NULL NOT NULL NOT NULL

Type -----------------------NUMBER(38) VARCHAR2(30) NUMBER(4) VARCHAR2(18) NUMBER(38)

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

Oracle SQL - SQL*Plus www.tellora.fr

SELECT

nom, salaire, emploi

WHERE

salaire >= 2000

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;

NOM_AVION -----------------------------Caravelle Boeing Planeur A_Caravelle_2

Page 25/124

Oracle SQL - SQL*Plus www.tellora.fr

SQL> select * from NO_VOL ---------1 2 3 VOL_DEPA -------04/09/04 09/09/04 30/09/04

VOL;
VOL_ARRI -------05/09/04 10/09/04 DESTINATION ID_AVION -------------------- ---------Tahiti 1 Marquises 1 Tokyo 2

SQL> select * from

EST_EQUIPAGE;

ID_EMP NO_VOL ---------- ---------1 1 4 1 3 2 4 2

SQL> select * from ID_EMP ---------1 2 3 4

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

Requtes avec comparaisons

La clause WHERE peut utiliser les oprateurs :

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

Oracle SQL - SQL*Plus www.tellora.fr

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

La clause IN permet dviter lemploi de OR et simplifie la syntaxe ...

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) ;

NOM SALAIRE ------------------------------ ---------Gaston 1700 Titeuf 1800

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 \

dsigne \ pour inhiber les fonctions de % et _

Page 27/124

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

1.6.4

La clause BETWEEN

La clause Between permet de slectionner des lignes lintrieure de bornes dfinies.

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

Trier laffichage dune requte

La clause Order by permet de trier le rsultat affich.

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.

SQL> select id_avion, nom_avion 2 from avion 3 order by nom_avion desc ;

Page 29/124

Oracle SQL - SQL*Plus www.tellora.fr

ID_AVION ---------3 1 2 4

NOM_AVION -----------------------------Planeur Caravelle Bong A_Caravelle_2

1.6.6

Eliminer les doublons

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

AVION -----------------------------Caravelle Caravelle Caravelle Caravelle

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

AVION -----------------------------Caravelle Caravelle Caravelle

- Affichage des employs affects un quipage transports par une caravelle.

DISTINCT provoque un tri, a utiliser avec prcautions.

Page 30/124

Oracle SQL - SQL*Plus www.tellora.fr

1.7

Requtes avec jointures

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.

Cette requte scrira :

SQL> 2 3 4

select nom_avion Avion, destination from vol, avion where vol.id_avion = avion.id_avion order by destination ;

La clause FROM doit prciser les tables concernes par la jointure.

La clause WHERE doit prfix la colonne Id_avion par le nom de la table concerne pour viter les conflits.

Page 31/124

Oracle SQL - SQL*Plus www.tellora.fr

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

AVION -----------------------------Caravelle Caravelle Boeing

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Afficher les employs affects un vol pour 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

Page 33/124

Oracle SQL - SQL*Plus www.tellora.fr

Dtail de la requte ...


Premire jointure : Sur la colonne Id_emp entre les tables EMPLOYE et EST_EQUIPAGE. Seconde jointure : Sur la colonne No_vol entre les tables EST_EQUIPAGE et VOL.

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

Utiliser des ALIAS

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

Dans le cas dune auto-jointure, lutilisation des alias est incontournable.

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

Oracle SQL - SQL*Plus www.tellora.fr

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 ;

NOM NO_VOL ------------------------------ ---------Gaston 1 Marilyne 1 Marilyne 2 Titeuf 2

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 .

SQL> select nom, no_vol

Page 36/124

Oracle SQL - SQL*Plus www.tellora.fr

2 3 4

from employe e, est_equipage eq where eq.id_emp(+) = e.id_emp order by no_vol;

NOM NO_VOL ------------------------------ ---------Gaston 1 Marilyne 1 Titeuf 2 Marilyne 2 Spirou

La slection senrichit de Spirou qui nest pas affect un vol.

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

Les avions griss napparatraient pas dans une jointure classique.

1.8

Ecriture et mise en forme

Le langage SQL permet la mise en forme de certaines requtes.

Page 37/124

Oracle SQL - SQL*Plus www.tellora.fr

1.8.1

Afficher un titre de colonne

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

SQL> select AVG(salaire) 2 from employe ; AVG(SALAIRE) --------------------------1875

Page 38/124

Oracle SQL - SQL*Plus www.tellora.fr

Vrification de la Moyenne des salaires de la socit calcule prcdemment.

SQL> select sum(salaire)/count(salaire) 2 from employe ; SUM(SALAIRE)/COUNT(SALAIRE) --------------------------1875

1.8.3

Afficher un libell dans une requte

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

Les fonctions dagrgat


somme des colonnes : col1 + col2 nombre de lignes satisfaisant la requte nombre de lignes contenant une valeur dans la colonne maximum des valeurs de la colonne minimum des valeurs de la colonne moyenne des valeurs de la colonne ; ignore les valeurs null

SUM(col1,col2) COUNT(*) COUNT(colonne) MAX (colonne) MIN (colonne) AVG(colonne)

Page 39/124

Oracle SQL - SQL*Plus www.tellora.fr

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)

Les fonctions numriques


valeur absolue plus petit entier gale ou suprieur n ) m lev la puissance n plus grand entier gal ou infrieur n reste de la division de m par n (m modulo n) n arrondi 10 (-m) ; par dfaut m = 0 racine carr de n ; retourne la valeur null si n est strictement ngatif

CEIL (n) POWER (m,n FLOOR (n) MOD (m,n) ROUND (n[,m]) SQRT (n)

TRUNC (n[,m]) n tronqu 10 (-m) ; par dfaut m = 0

1.9.3

Les fonctions de chanes de caractres

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

TO_CHAR(date, format) = converti une date en chane de caractres en fonction du format.

Format :

SCC CC SY, YYY Y,YYY YYYY YYY YY Y Q WW W MM DDD DD D

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

Oracle SQL - SQL*Plus www.tellora.fr

HH HH24 MI SS J YEAR MONTH MON DAY DY AM PM BC AD TH

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,

DESTINATION NO_VOL -------------------- ---------Tahiti 1 Marquises 2 Tokyo 3

Page 43/124

Oracle SQL - SQL*Plus www.tellora.fr

1.9.4

Les fonctions de gestion du temps

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)

expression doit tre de type DATE ou dun des types TIMESTAMP

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

Oracle SQL - SQL*Plus www.tellora.fr

INSERT INTO VOL VALUES (3,LAST_DAY(sysdate),NULL ,'Tokyo',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

ALTER SESSION SET NLS_DATE_FORMAT = DAY MONTH DD, YYYY: HH:MIAM;

- 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

Oracle SQL - SQL*Plus www.tellora.fr

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-

1.10 Requtes avec regroupement


Afficher le nombre total demploys, affects un vol.
SQL> select no_vol, count(id_emp) TOTAL 2 from est_equipage 3 group by no_vol; NO_VOL TOTAL ---------- ------------1 2 2 2

Page 46/124

Oracle SQL - SQL*Plus www.tellora.fr

Vrification :

SQL> select * from est_equipage 2 ; ID_EMP NO_VOL ---------- ---------1 1 4 1 3 2 4 2

- 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

GROUP BY Regroupement HAVING Condition

Afficher le nombre total demploys, affects un vol.

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

Affichage aprs correction :

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

Oracle SQL - SQL*Plus www.tellora.fr

VOL ---------1 2

DESTINATION Nb. Employes -------------------- -----------Tahiti 2 Marquises 2

- La clause WHERE permet deffectuer la jointure ncessaire entre la table VOL et la table EST_EQUIPAGE.

On aurait encore pu crire :

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 ;

DESTINATION Nb. Employes -------------------- -----------Marquises 2 Tahiti 2

La condition lors dun regroupement se fait en utilisant la clause HAVING

Exemple 2 Afficher le nombre demploys prvus pour le vol destination de Tahiti.

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' ;

DESTINATION Nb. Employes -------------------- -----------Tahiti 2

Page 49/124

Oracle SQL - SQL*Plus www.tellora.fr

1.11 Requtes ensemblistes


Il est possible dutiliser les oprateurs ensemblistes de lalgbre relationnelle. Les mots cls sont UNION, MINUS, INTERSECT.

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 ;

AVION -----------------------------A_Caravelle_2 Planeur

Page 50/124

Oracle SQL - SQL*Plus www.tellora.fr

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 ;

AVION -----------------------------A_Caravelle_2 Bong Caravelle Planeur

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 ;

AVION -----------------------------Boeing Caravelle

Page 51/124

Oracle SQL - SQL*Plus www.tellora.fr

1.12 Sous requtes dans la clause FROM


Depuis la version 7 dOracle il est possible deffectuer une sous requte dans la clause FROM. La sous requte est rsolue avant la requte principale.

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

Oracle SQL - SQL*Plus www.tellora.fr

1.13 Requtes imbriques


SQL offre la possibilit dimbriquer des requtes. On parle de requte principale et de sous-requte.

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

Oracle SQL - SQL*Plus www.tellora.fr

La moyenne des salaires de lentreprise est :

SQL> select avg(salaire) 2 from employe ; AVG(SALAIRE) -----------1875

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 ;

NOM SALAIRE -------------------- ---------Marilyne 2000 Spirou 2000

Afficher les employs qui ont le plus petit salaire

SQL> 2 3 4 5 6

select nom, salaire from employe where salaire = (select min(salaire) from employe ) order by nom;

NOM SALAIRE -------------------- ---------Gaston 1700

Si le rsultat dune sous-requte est NULL, alors la requte principale ne peut pas sexcuter.

Page 54/124

Oracle SQL - SQL*Plus www.tellora.fr

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.

Exemple Afficher les avions qui ne sont pas affects un vol.

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Il en dcoule la requte ci-dessous :

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

Cette requte peut galement scrire avec loprateur EXISTS.

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

Oracle SQL - SQL*Plus www.tellora.fr

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 ;

AVION -----------------------------A_Caravelle_2 Planeur

1.14 Balayer une arborescence


Le balayage dune arborescence se fait en utilisant une relation rflexive. Dans notre base il sagit de la relation DIRIGE.

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

Oracle SQL - SQL*Plus www.tellora.fr

Exemple Rcuprer larborescence dont le patron a pour numro demploy = 1

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

Exclure seulement lemploy N 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

Exclure seulement le sous-arbre commenant par lemploy N 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

Oracle SQL - SQL*Plus www.tellora.fr

1.15 La clause FOR UPDATE WAIT


Dans la clause FOR UPDATE WAIT, il est possible de spcifier un temps dattente maximum (spcifier en seconde) lors de lexcution dune requte. Oracle attends que la ligne soit dverrouille avant deffectuer le SELECT.

SQL> 2 3 4 5

select nom from employe where emp_id_emp = 1 order by id_emp FOR UPDATE WAIT 2 ;

NOM -----------------------------Spirou Marilyne

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

Oracle SQL - SQL*Plus www.tellora.fr

Les jointures ANSI

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

JOIN USING JOIN ON OUTER JOIN

Page 60/124

Oracle SQL - SQL*Plus www.tellora.fr

1.15.1

La base exemple

1.15.2

Contenu de la base exemple

Select * from EMPLOYE


idEmploye --------000010 000030 000120 000130 000140 000400 NomEmp Salaire Commission idDepartement ----------------------- --------- ----------- -------------HAAS 52750 4220 A00 KWAN 38250 3060 C01 OCONNEL 29250 2340 A00 QUINTANA 23800 1904 C01 NICHOLLS 23800 2274 C01 WILSON 28420 --

Select * from Departement


idDepartement ------------A00 C01 D01 DepNom Employe_idEmploye -------------------------- ----------------Computer Service 000010 Information Center 000030 Development Center --

Page 61/124

Oracle SQL - SQL*Plus www.tellora.fr

Select * from Projet


idProjet --------AD3100 IF1000 IF2000 NomProjet Employe_idEmploye idDepartement ----------------------- ----------------- ------------Admin Service 000010 D01 Query Service 000030 C01 User Education 000030 C01

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.

Cette syntaxe est disponible dans toutes les versions de DB2.

Page 62/124

Oracle SQL - SQL*Plus www.tellora.fr

1.15.4

INNER JOIN

Cette syntaxe est quivalente la jointure classique.

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

RIGHT OUTER JOIN

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

Oracle SQL - SQL*Plus www.tellora.fr

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

LEFT OUTER JOIN

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

Oracle SQL - SQL*Plus www.tellora.fr

1.15.7

FULL OUTER JOIN

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

Jointure de plus de 2 tables

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

Oracle SQL - SQL*Plus www.tellora.fr

Rappel du modle de donnes utilis

Page 66/124

Oracle SQL - SQL*Plus www.tellora.fr

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 --

On aurait pu crire galement :

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

Jointure et utilisation de prdicats

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

Oracle SQL - SQL*Plus www.tellora.fr

Jobtiens le rsultat ci dessous :

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

1.16 Crer une vue


Nous allons prsenter le concept de vue travers une suite progressive dexemples. Une synthse sur lintrt des vues est propose la fin de ce chapitre. Une vue est une perception logique dune ou plusieurs tables (ou vues) dfinie partir dune requte. Cration dune vue sur les avions et les vols prvus.

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

La vue du USER_VIEWS du dictionnaire de donnes permet dafficher le contenu de la vue.

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

1.17 Supprimer une vue


La suppression dune vue se fait en utilisant la commande DROP :

SQL> Drop view mes_vols; Vue supprime.

1.18 Les synonymes


Un synonyme est un nom logique donn un objet existant, il peut tre associ un objet de schma de type : Table Vue Sequence Cluster Procdure, fonction, package

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.

Le paramtre public permet de rendre le synonyme accessible par tous.

Page 73/124

Oracle SQL - SQL*Plus www.tellora.fr

Il est galement possible dassocier des droits daccs aux synonymes.

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.

RENAME [public] SYNONYM [schema.]anc_nom

to [schema.]nouv_nom ;

Pour supprimer un synonyme on utilise la commande DROP :

DROP [public]

SYNONYM

(schema.]nom_synonym ;

Page 74/124

Oracle SQL - SQL*Plus www.tellora.fr

10 Les types de donnes utiliss dans les tables


TYPE BINARY-INTEGER POSITIVE / NATURAL NUMBER INTEGER CHAR (n) VARCHAR2 (n) LONG DATE CLOB VALEURS entiers allant de 2**31 2**31) entiers positifs allant jusqu 2**31 -1 Numrique (entre 2**418 2**418) Entier stock en binaire (entre 2**126 2**126) Chane fixe de 1 32767 caractres (diffrent pour une colonne de table) Chane variable (1 32767 caractres) idem VARCHAR2 (maximum 2 gigaoctets) Date (ex. 01/01/1996 ou 01-01-1996 ou 01-JAN96 ...) Grand objet caractre. Objets de type long stocks en binaire (maximum 4 giga octets) Dclare une variable grant un pointeur sur un grand bloc de caractres, mono-octet et de longueur fixe, stock en base de donnes. BLOB Grand objet binare. Objets de type long (maximum 4 giga octets) Dclare une variable grant un pointeur sur un grand objet binaire stock dans la base de donnes (Son ou image). NCLOB Support en langage nationale (NLS) des grands objets caractres. Dclare une variable grant un pointeur sur un grand bloc de caractres utilisant un jeu de caractres mono-octets, multi-octets de longueur fixe ou encore multi-octets de longueur variable et stock en base de donnes. Compos de 6 octets binaires permettre didentifier une ligne par son adresse physique dans la base de donnes. Le U de UROWID signifie Universel, une variable de ce type peut contenir nimporte quel type de ROWID de nimporte quel type de table.

ROWID

UROWID

Oracle vrifie la longueur maximum spcifie lors de la dclaration des colonnes.

Page 75/124

Oracle SQL - SQL*Plus www.tellora.fr

1.19 Script de cration des tables


Nous prsentons le script de cration des tables de la base de donnes Commande gnr avec Power AMC.

-- ============================================================ -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

Oracle SQL - SQL*Plus www.tellora.fr

-- ============================================================ -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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

1.20 Manipulation des LOB


Le SQL permet certaines actions de gestion des LOB. Le package DBMS_LOB permet dinteragir compltement avec les LOB.

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

Oracle SQL - SQL*Plus www.tellora.fr

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..

1.21 Manipulation des BFILEs


Ce type permet dutiliser des fichiers stocks lextrieur de la base de donnes en ne conservant dans celle-ci quun pointeur sur ce fichier.

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

Create [or replace] directory

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Spcification des colonnes


( [nom_colonne1 ) ; Type [ DEFAULT valeur ] [NULL | NON_NULL] [ , ...]

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

Oracle SQL - SQL*Plus www.tellora.fr

[ not

deferrable | deferrable ( initially { immediate | deferred } ] [ disable | enable [ validate | novalidate ] ;

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

Oracle SQL - SQL*Plus www.tellora.fr

2.1

Les contraintes dintgrit

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

Contraintes immdiates ou diffres

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.

Si une violation de contrainte est dtecte, la transaction est annule.

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

Oracle SQL - SQL*Plus www.tellora.fr

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 :

alter session set constraint[s] = { immediate | deferred | default } ;

2.1.2

Crer des contraintes dintgrit

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

Oracle SQL - SQL*Plus www.tellora.fr

alter table EMPLOYE add constraint EMPLOYE_NOM_UK unique(nom) / alter table EMPLOYE add constraint SALAIRE_EMPLOYE_CC check (salaire >0); /

2.1.3

Dsactiver les contraintes dintgrit

Il est possible de dsactiver les contraintes par la commande :


alter table [ schema. ] nom_table ] disable { constraint nom_contrainte | primary , nom_colonne ] ... ) } [ cascade ] ; key | unique (nom_colonne [

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

Les colonnes virtuelles en 11g

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

Oracle SQL - SQL*Plus www.tellora.fr

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);

Il est possible de modifier une colonne virtuelle par un ALTER TABLE;


ALTER TABLE EMPLOYE ANCIENNETE AS (SALAIRE * 0.0007 * NB_ANNEE) ;

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Bloc Oracle et lignes de tables

Structure dun bloc


Sa taille est dfinie la cration de la base (paramtre DB_BLOCK_SIZE). Len-tte du bloc contient ladresse du bloc, le type de segment, un rpertoire des tables, un rpertoire des lignes et des entres pour les transactions : taille variable : en moyenne de lordre de 100 octets.

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

Oracle SQL - SQL*Plus www.tellora.fr

Structure dune ligne


Len-tte de la ligne contient quelques informations (nombre de colonnes, chanage ventuel, verrou) Taille variable (3 octets minimum)

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

Structure dune colonne


Chaque colonne est stocke avec un en-tte (qui donne la longueur de la colonne) et la valeur. Taille variable de 1 3 octets La longueur totale dune colonne dpend du type de la colonne et de la valeur stocke dans la colonne. Les diffrents types de donnes : char (n) = Longueur fixe (n octets), quelle que soit la valeur stocke dans la colonne varchar2(n) = Longueur variable (0 n octets), dpendant de la valeur stocke dans la colonne number (x,y) = Longueur variable (entre 1 21 octets), dpendant de la valeur stocke dans la colonne null = 1 octet en milieu de ligne et aucun en fin de ligne date = Longueur fixe (8 octets)

Page 89/124

Oracle SQL - SQL*Plus www.tellora.fr

2.5

Crer une table partir dune table existante

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

Renommer une table

SQL> rename avion_bis to avion_2 Table renomme.

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

- La table AVION_BIS est renomme en AVION_2.

Page 90/124

Oracle SQL - SQL*Plus www.tellora.fr

2.7

Les tables temporaires

Il est possible de crer des tables temporaires afin doptimiser les temps dexcution des requtes, ou pour des raisons pratiques lors de traitements.

create global temporary table temp_chats ( nom varchar2(15), owner varchar2(10) ) ;

2.8

Les tables externes

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.

Il ny a pas de clause de stockage, ni de clause tablespace pour ce type de tables.

Page 91/124

Oracle SQL - SQL*Plus www.tellora.fr

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

Les vues Matrialises

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Accs par index B*-Tree

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

11 Modifier les lignes dans une tables


La mise jour des donnes dune base se fait par lune des commandes suivantes : INSERT Insertion dune ligne UPDATE Modification dune ou plusieurs lignes DELETE Suppression dune ou plusieurs lignes

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

Insrer des lignes dans une table


La commande INSERT

La commande INSERT permet dinsrer une ligne dans une table.

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

Oracle SQL - SQL*Plus www.tellora.fr

------------- 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

Insertion partir dune table existante

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

3.5
3.5.1

Modifier les lignes dune table


La commande UPDATE

La commande UPDATE permet de modifier une ou plusieurs lignes dune table.

UPDATE nom_table SET liste daffectations WHERE conditions sur les lignes concernes;

Sans clause WHERE, toute la table est modifie

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

Oracle SQL - SQL*Plus www.tellora.fr

3.5.2

Modifications de lignes partir dune table existante

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

Oracle SQL - SQL*Plus www.tellora.fr

3.5.3

Modifier une table par fusion : MERGE

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)

- USING source [alias] : spcifie la source des donnes


source peut tre une table, une vue ou une sous-requte alias : alias de la source (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

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

Exemple sur lgalit des identifiant davion.

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

Commande UPDATE et INSERT conditionnels


Vous pouvez ajouter une clause conditionnelle WHERE a une clause UPDATE ou INSERT dune commande MERGE pour conditionner les oprations INSERT ou 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 ;

Clause optionnelle DELETE


Vous pouvez utiliser la clause DELETE dans une commande MERGE en les mettant jour. UPDATE pour nettoyer les tables

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Spcifier la valeur par dfaut dune colonne

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

Lors dun INSERT :

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

Oracle SQL - SQL*Plus www.tellora.fr

Lors dun UPDATE :

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

Oracle SQL - SQL*Plus www.tellora.fr

3.7
3.7.1

Supprimer les lignes dune table


La commande DELETE

La commande DELETE permet de supprimer une ou plusieurs lignes dune table.

DELETE FROM nom_table WHERE conditions sur les lignes concernes;

Sans la clause WHERE toute la table est vide.

Suppression du vol numro 10, et vrification.

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

Oracle SQL - SQL*Plus www.tellora.fr

Supprimer toutes les lignes de la table AVION_2 sans destination :.

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

Vider une table

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.

Il se fait en utilisant la commande suivante :


truncate table [ shema. ] nom_table [ { drop | reuse } storage ] ;

- 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

Oracle SQL - SQL*Plus www.tellora.fr

Lors du vidage dune table, il faut inactiver les contraintes cl trangres si ncessaire. Ne pas oublier de les ractiver aprs !

Page 111/124

Oracle SQL - SQL*Plus www.tellora.fr

12 Les squences
Les squences sont des objets permettant de grer les accs concurrents sur une colonne de table et dviter les inter-blocages.

Par exemple le calcul automatique dune cl primaire contenant un numro squentiel.

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 .

Une squence concerne obligatoirement une colonne numrique.

3.8

Crer une squence

La cration dune squence se fait avec la commande CREATE SEQUENCE :

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

Oracle SQL - SQL*Plus www.tellora.fr

- 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

Utiliser une squence

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.

create sequence minvalue

Ma_Sequence 100 ;

insert

into

client ( Ma_Sequence.nextval, toto ) ;

values

Pour rechercher la valeur courante il faut utiliser CURRVAL la place de NEXTVAL.

select Ma_Sequence.currval from dual;

Page 113/124

Oracle SQL - SQL*Plus www.tellora.fr

3.10 Modifier une squence


La modification dune squence se fait en utilisant la commande ALTER SEQUENCE.

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.

3.11 Supprimer une squence


La suppression dune squence se fait en utilisant la commande DROP SEQUENCE.

Drop sequence [schema.]sequence ;

Page 114/124

Oracle SQL - SQL*Plus www.tellora.fr

13 Transactions et accs concurents


La cohrence des donnes repose sur le principe des transactions et des accs concurrents. Une transaction correspond un ensemble de commandes SQL que lon appellera actions lmentaires. Cet ensemble forme un tout qui sera entirement valid (mise jour dfinitive de la base) ou pas du tout. ORACLE offre galement un mcanisme de gestion des accs concurrents. Ce mcanisme repose sur la technique du verrouillage des donnes. Ce verrouillage peut tre implicite (par ORACLE) ou explicite (par lutilisateur).

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

Oracle SQL - SQL*Plus www.tellora.fr

Soit la transaction constitue des deux commandes :

INSERT INTO ligne_com VALUES (10,1,5,40);

UPDATE article SET qtestock=qtestock - 40 WHERE Id_article=5;

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

Oracle SQL - SQL*Plus www.tellora.fr

3.12 Dcouper une transaction


Le dbut dune application ou dune session SQL constitue automatiquement le dbut dune transaction. Chaque instruction commit ou rollback marque la fin de la transaction courante et le dbut dune nouvelle transaction. Une transaction correspond donc un ensemble de commandes comprises entre deux instructions commit ou rollback.

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;

UPDATE article SET qtestock=qtestock - 40 WHERE Id_article=5;

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.

3.13 Gestion des accs concurrents


La gestion des accs concurrents consiste assurer la srialisation des transactions qui accdent simultanment aux mmes donnes. Cette fonctionnalit de base dORACLE est base sur les concepts dintgrit, de concurrence, et de consistance des donnes

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

Oracle SQL - SQL*Plus www.tellora.fr

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)

3.14 Les verrous


Pour que lexcution simultane de plusieurs transactions donne le mme rsultat quune excution squentielle, la politique mise en uvre consiste verrouiller momentanment les donnes utilises par une transaction. Dans ORACLE, le granule de verrouillage est la ligne. Tant quune transaction portant sur une ou plusieurs lignes nest pas termine (valide ou annule), toutes les lignes sont inaccessibles en mise jour pour les autres transactions. On parle de verrouillage. Il peut sagir dun verrouillage implicite ou explicite.

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

3.15 Accs concurrents en mise jours


Si deux utilisateurs accdent des lignes diffrentes dune table qui na pas fait lobjet dun verrouillage particulier, les transactions seffectuent normalement.

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

Oracle SQL - SQL*Plus www.tellora.fr

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.

3.16 Les rollbacks segments ou segments dannulation


Les rollbacks segments sont des segments permettant Oracle de stocker limage avant les modifications effectues durant une transaction. Cest Oracle qui alloue les transactions aux rollback segments.

Page 120/124

Oracle SQL - SQL*Plus www.tellora.fr

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

Oracle SQL - SQL*Plus www.tellora.fr

14 Procdures, Fonctions et Packages


Les fonctions, procdures et packages sont des programme crits en PL/SQL, langage de programmation driv de lADA interne au noyau Oracle. Ces programmes sont compils et catalogus dans le dictionnaire de donnes : Une procdure est une unit de traitement qui contient des commandes SQL relatives au langage de manipulation des donnes, des instructions PL/SQL, des variables, des constantes, et un gestionnaire derreurs. Une fonction est une procdure qui retourne une valeur. Un package est un agrgat de procdures et de fonctions.

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Vue gnrale des contraintes

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

Oracle SQL - SQL*Plus www.tellora.fr

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

Das könnte Ihnen auch gefallen