Guide complet du langage SQL Oracle
Guide complet du langage SQL Oracle
Pour Oracle
Société : Tellora
Version 2
Du 21 Novembre 2015
www.tellora.fr
Tellora pour M2I Formation
Le langage SQL
Sommaire
1 Les bases de données relationnelles (SGBDRO) ........................................................... 6
2 La base de donnée Oracle et ses outils......................................................................... 7
2.1 L’outil SQL*Plus .................................................................................................. 7
2.1.1 Environnement de travail .......................................................................................... 7
2.1.2 Lancement de SQL*Plus sous Dos ............................................................................. 9
2.2 L’outil iSQL*Plus ............................................................................................... 10
2.3 Outil Oracle Database Control ou Grid Control ....................................................... 10
3 Les commandes de l’outil SQL*Plus ........................................................................... 12
3.1 Quelques commandes SQL*Plus .......................................................................... 12
3.1.1 Mise en forme à l’affichage ..................................................................................... 12
3.1.2 Ajouter des commentaires ...................................................................................... 13
3.1.3 Exécuter le contenu d’un script ............................................................................... 13
3.2 Utilisation de paramètres ................................................................................... 14
3.2.1 Déclarer un éditeur ................................................................................................. 14
3.2.2 Générer un fichier résultat ...................................................................................... 14
3.2.3 Modifier l’affichage par défaut ................................................................................ 15
3.2.4 Mesurer les performances d’une requête ............................... Erreur ! Signet non défini.
4 La base exemple ........................................................................................................ 16
4.1 Le MCD (Modèle Conceptuel de Données) ............................................................. 16
4.2 Régles de passage du MCD au MLD ...................................................................... 17
1.1 Diagramme de classe .................................................... Erreur ! Signet non défini.
2.1 Du diagramme de classe au MLD ..................................... Erreur ! Signet non défini.
4.3 Le MLD (Modèle Logique de Données) .................................................................. 18
4.4 Les contraintes d’intégrité .................................................................................. 18
4.5 Scritp de création des tables ............................................................................... 19
4.6 Les types de données ........................................................................................ 22
4.7 Règles de nommage .......................................................................................... 23
5 La commande SQL « CREATE TABLE » ....................................................................... 24
5.1 Modifier la structure d’une table .......................................................................... 25
5.2 Contraintes d’intégrité activées ou désactivées ...................................................... 27
5.3 Contraintes immédiates ou différées .................................................................... 28
5.4 Manipulation des LOB ........................................................................................ 29
5.5 Manipulation des BFILEs..................................................................................... 30
5.6 Créer une table à partir d’une table existante ........................................................ 31
6 Notion de tablespace ................................................................................................. 33
7 Le dictionnaire de données ........................................................................................ 34
8 Le langage SQL .......................................................................................................... 36
Les SBDRO (Système de Gestion de Bases de Données Relationnelles Objet) sont constituées de
tables en relations les unes avec les autres.
Ces relations sont représentées et gérées par les contraintes d’intégrités au niveau du noyau de la
base de données.
Ces contraintes d’intégrité sont vérifiées et exécutées tout au long de la vie de la base de données.
Elles garantissent :
• la lecture cohérente (même version des données au sein d’une même lecture)
• la cohérence des données (le respect de la conception de la base de données)
Il permet de saisir et d’exécuter des ordres SQL ou du code PL/SQL et dispose en plus d’un certain
nombre de commandes.
-- lancer SQLPlus avec connexion et lancement d’un script sur la ligne de commande
C:\> SQLPLUS system/tahiti@tahiti @info.sql
Connexion à une base de données Oracle en utilisant un client Oracle installé sur un poste distant.
Depuis le groupe ORACLE, double sur l’icône SQL*Plus ...
La boîte de dialogue suivante permet de saisir un compte et un mot de passe ORACLE ...
Le nom de la « Chaîne hôte» correspond au nom du service Oracle Net de la base de données à
laquelle l’utilisateur veut se connecter à distance.
La session SQL*PLUS est ouverte ...
Pour lancer SQL Plus sans se connecter à une base de données utilisez la commande :
Pour démarrer une session SQL Plus sous dos il suffit de se mettre en commande DOS puis
d’exécuter la commande SQL PLUS .
Vous pouvez également lancer SQL*Plus sans vous connecter puis effectuer la connexion.
SQLPLUS /nolog
Connect USER/MotdePasse@ServiceDistant
-- avec connexion
C:\> SQLPLUS charly/secret@tahiti
L’outil Oracle Database Control est une interface graphique permettant d’administrer une base de
données unique.
Il contient un référentiel et est créé après la création de la base de données.
Les commandes SQL*Plus sont des commandes de mise en forme pour la plupart liées à l’outil
SQL*Plus.
• A ne pas confondre avec des commandes SQL.
SQL> select *
2 from
3 avion
;
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
2 Boeing
3 Planeur
4 A_Caravelle_2
Pour exécuter un ensemble de commandes dans un script SQL il suffit d’utiliser la commande start
nom_script ou @ nom_script.
@ NomFichier.txt, permet d’exécuter le contenu d’un fichier sql
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
2 Boeing
3 Planeur
4 A_Caravelle_2
L’instruction ACCEPT permet de saisir des valeurs de paramètres (ce ne sont pas des variables et à
ce titre ne nécessitent aucune déclaration).
SQL> @essai
Entrez la référence d’un avion: 1
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
SPOOL MonFichier.txt
Spool OFF
L’affichage des commandes SQL lors de l’exécution d’un script peut être modifié par un ensemble de
commandes :
SET PAUSE ON, afficher un résultat page par page
SET LINESIZE 100, reformater la taille de la ligne à 100 caractères
SET ECHO ON/OFF, affiche ou pas le texte de la requête ou de la commande à exécuter
SET TIMING ON|OFF, provoque l’affichage d’informations sur le temps écoulé, le nombre d’E/S
après chaque requête
TERM [ON|OFF], supprime tout l’affichage sur le terminal lors de l’exécution d’un fichier
VER [ON|OFF], provoque l’affichage des lignes de commandes avant et après chaque substitution
de paramètre.
4 La base exemple
Nous vous présentons la base de données TAHITI qui servira de support aux exemples présentés
dans le cours
Vol
No_Vol I
Vol_Depart DT
Vol_Arrive DT
Destination A20
1,1 0,n
Est Patron de
0,n
0,n 1,n
Employe Dirige
Avion ID_Emp I
Id_Avion I Nom VA30
Salaire N4 0,1
Nom_Avion VA30
Emploi VA20
A pour Patron
Les relations ternaires (toutes les cardinalités sont 0,N ou 1,N de chaque côté de la relation) deviennent des
tables
• La concaténation des identifiants des entités qui concourent à la relation devient la clé primaire
de la table issue de la relation ; chacun, pris séparément, devient clé étrangère.
Les relations possédant des cardinalités 0,1 ou 1,1 d’un coté et 0,N de l’autre coté, on ajoute la colonne de
l’identifiant dans la table coté 0,N de la relation.
• Cette colonne devient clé étrangère et référence la clé primaire.
Pour les relations possédant des cardinalités 0,1 et 1,1 de chaque côté de la relation, il est préférable de
créer une table, mais l’on peut également faire migrer l’identifiant dans l’une des deux entités ; celui ci
devient alors clé étrangère (c’est ce que font des outils comme Power AMC)
• Power AMC est un outil permettant de concevoir des MCD, appelé AGL (Atelier de Génie
Logiciel). Ces outils permettent de générer le script des tables automatiquement après la
conception des MCD. Ces outils sont utilisés dans les projets de conception de nouveaux
logiciels.
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
NO_VOL = NO_VOL
EST_EQUIPAGE
ID_EMP INTEGER not null
ID_AVION = ID_AVION
NO_VOL INTEGER not null
ID_EMP = ID_EMP
ID_EMP = EMP_ID_EMP
AVION EMPLOYE
ID_AVION INTEGER not null ID_EMP INTEGER not null
NOM_AVION VARCHAR2(30) null NOM VARCHAR2(30) not null
SALAIRE NUMBER(4) not null
EMPLOI VARCHAR2(20) null
EMP_ID_EMP INTEGER null
Nous présentons le script de création des tables de la base de données « Tahiti » généré avec
Power AMC.
• Ce script doit suivre exactement le modèle physique de données.
Le modèle physique de données est une version dégradée du modèle logique des données. Par
exemple, redondance d’informations en vue d’optimisation applicative.
-- ============================================================
-- Nom de la base : TAHITI
-- Nom de SGBD : ORACLE Version 8
-- Date de cr‚ation : 22/08/2004 17:09
-- ============================================================
-- ============================================================
-- 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,
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)
/
TYPE VALEURS
Lors de la création de la table une contrainte peut être créée en fin de déclaration de table comme
ci-dessous :
Contraintes d’intégrité
CONSTRAINT NOM_CONTRAINTE ]
{ PRIMARY KEY ( NOM_COLONNE [ , NOM_COLONNE ] ... )
[ USING INDEX CLAUSE_INDEX ]
| CHECK ( REGLE_CONDITIONS ) }
Stockage
[ TABLESPACE NOM_TABLESPACE ]
[ PARALLEL ]
[ PCTFREE VALEUR ]
[ PCTUSED VALEUR ]
Exemple
La modification de la colonne EMPLOI en NOT NULL est valide si elle ne contient aucune valeur NULL.
Diminuer la largeur d’une colonne non vide est possible, dans la limite de la plus grande valeur
stockée dans la colonne.
EMPLOI VARCHAR2(18)
EMP_ID_EMP NUMBER(38)
TABLE_NAME TABLESPACE_NAME T
------------------------------ ------------------------------ -
AVION DATA N
AVION_2 TOOL N
EMPLOYE DATA N
EST_EQUIPAGE DATA N
VOL DATA N
Une contrainte d'intégrité peut être dans l'un des états suivant :
DISABLE : désactivée,
NOVALIDATE ENABLED : non validée activée (contrainte forcée, données incohérentes)
VALIDATE ENABLE : validée activée
20 ligne(s) sÚlectionnÚe(s).
Les contraintes non différées ou IMMEDIATE sont appliquées à la fin de chaque ordre LMD.
Une violation de contrainte entraîne l'annulation de l'ordre .
Une contrainte définie comme IMMEDIATE ne peut pas être modifiée pour être appliquée à la fin de
la transaction.
Les contraintes différées sont vérifiées seulement lors de la validation d'une transaction.
Il est possible de créer les tables sans les contraintes d'intégrité puis de rajouter celle-ci par une
mise à jour de table ultérieure en utilisant la commande :
-- ============================================================
-- CLES ETRANGERES et CHECK
-- ============================================================
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 (ID_AVION)
references AVION (ID_AVION)
/
alter table EMPLOYE
add CONSTRAINT SALAIRE_CC
CHECK (salaire >500);
/
La commande doit être utilisée pour une contrainte d’intégrité, si une clé primaire ou une contrainte
unique est désignée comme clé étrangère, utilisez le paramètre CASCADE pour désactiver la clé
étrangère avant de désactiver la clé primaire ou la contrainte unique.
De la même façon il est possible d'activer des contraintes désactivées.
Méthode d’utilisation :
Création de la table contenant le type LOB, et insertion des lignes
Déclaration et initialisation du handle dans le programme
Exécution d’une requête SELECT FOR UPDATE sur la ligne contenant l’indicateur du LOB
Manipulation du LOB avec le package DBMS_LOB en utilisant le handle comme une référence aux
données.
Commit
Lorsque plusieurs colonnes LOB sont créées, chaque colonne possède des caractéristiques de
stockage particulières.
Pour de bonnes performances placez le contenu des colonnes LOB dans des tablespaces différents.
Dans l’exemple précédent plusieurs segments sont créés :
Le segment de la table
Le segment pour les données de la colonne CARRIERE
Le segment pour les données de la colonne PHOTO_IDENTITE
2 segments d’index pour référencer les CHUNKS des colonnes LOB.
Un CHUNK est un nombre de blocks Oracle contigus permettant de stocker les octets d’informations.
Chaque instance de LOB est un ensemble de CHUNKS qui ont la même taille.
Il est recommandé de créer les types LOB dans des tablespaces dédiés..
Ce type permet d’utiliser des fichiers stockés à l’extérieur de la base de données en ne conservant
dans celle-ci qu’un pointeur sur ce fichier.
Opérations SQL :
Définition des objets de type BFILE
Association des types BFILE avec les fichiers externes
Gestion de la sécurité des BFILES
Les autres opérations sont possibles avec le package DBMS_LOB et les OCI.
Une donnée de type BFILE est en lecture seule. Le fichier doit exister et se trouver dans la directory
spécifiée et le processeur Oracle doit posséder le droit de lire celui-ci.
Lorsque la donnée BFILE est supprimée, le fichier existe toujours.
Chaque attribut de type BFILE d’une ligne peut contenir la référence à un fichier différent.
La DIRECTORY permet de spécifier un alias référençant un chemin d’accès sur le serveur où sont
stockées les fichiers référencés par les données de type BFILE.
Le privilège READ permet d’accéder aux fichiers qui sont dans la directory, sans ce privilège les
fichiers externes référencés par le type BFILE qui sont dans la directory ne sont pas accessibles.
Le chemin spécifié peut ne pas exister à la création de la directory, mais il doit exister lors de son
utilisation avec les fichiers BFILE.
La création d’une table peut se faire à partir d’une table existante en précisant la requête
d’extraction des colonnes désirées.
Table crÚÚe.
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
2 Boeing
3 Planeur
Table supprimÚe.
Le contenu des autres tables reste inchangé et est donc incohérent par
rapport aux valeurs utilisées, notamment la colonne Id_emp de la table
EST_EQUIPAGE dans notre exemple.
6 Notion de tablespace
Un tablespace est une unité logique de stockage composée d’un ou plusieurs fichiers physiques.
Les tablespaces sont des « contenaires » dans lesquels sont stockés des tables ou des index qui
utilisent des l’espace disque.
Ces tablespaces permettent à oracle de faire le lien entre le logique et le physique et d’écrire sur le
disque les données stockées dans les tables ou les index, c'est-à-dire les lignes des tables et les
colonnes des index.
Ainsi les tablespaces sont représentés physiquement par des fichiers sur le disque.
Les tables ou les index sont appelés segments lorsqu’ils sont écrits dans les fichiers rattachés aux
tablespaces.
7 Le dictionnaire de données
C’est un ensemble de tables et de vues qui donnent des informations sur le contenu d’une base de
données. Le dictionnaire de données est utilisé par Oracle pour traiter les requêtes.
Il contient :
Les structures de stockage (tablespaces, fichiers, ..)
Les utilisateurs et leurs droits
Les objets (tables, vues, index, procédures, fonctions, …)
…
Il est créé lors de la création de la base de données, et mis à jour par Oracle lorsque des ordres DDL
(Data Définition Langage) sont exécutés, 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
Basées sur de vraies tables stockées dans le tablespace SYSTEM
Accessible uniquement quand la base est ouverte « OPEN »
Les tables et vues dynamiques de performance
Ne sont en fait basées sur des informations en mémoire ou extraites du fichier de contrôle
S’interrogent néanmoins comme de vraies tables/vues
Donnent des informations sur le fonctionnement de la base, notamment sur les performances (d’où
leur nom)
Pour la plupart accessibles même lorsque la base n’est pas complètement ouverte (MOUNT)
Les vues statiques sont constituées de 3 catégories caractérisées par leur préfixe :
USER_* : Informations sur les objets qui appartiennent à l’utilisateur
ALL_* : Information sur les objets auxquels l’utilisateur a accès (les siens et ceux sur lesquels il a
reçu des droits)
DBA_* : Information sur tous les objets de la base
cols User_tab_columns
dict Dictionnary
ind User_indexes
obj User_objects
seq User_sequences
syn User_synonyms
tabs User_tables
V$INSTANCE
V$DATABASE
V$SGA
V$DATABASE
V$PARAMETER
8 Le langage SQL
Le langage SQL (Structured Query Langage) s’appuie 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é développé dans le milieu des années 1970 par IBM (System R). En 1979 Oracle Corporation
est le premier à commercialiser un SGBD/R comprenant une incrémentation de SQL. Oracle comme
acteur significatif intègre ses propres extensions aux ordres SQL.
Depuis l’arrivée d’internet et de l’objet Oracle fait évoluer la base de données et lui donne une
orientation objet, on parle SGBDR/O : System de Base de Données relationnel Objet.
Les sous langages du SQL sont :
LID : Langage d’Interrogation des données, verbe SELECT
LMD : Langage de Manipulation des Données, utilisé pour la mise à jour des données, verbes INSERT,
UPDATE, DELETE, COMMIT, ROLLBACK
LDD : Langage de définition des données, utilisé pour la définition et la manipulation d’objets tels que les
tables, les vues, les index …, verbe CREATE, ALTER, DROP, RENAME, TRUNCATE
LCD : Langage de Contrôle des Données, utilisé pour la gestion des autorisations et des privilèges, verbe
GRANT, REVOKE
WHERE JOINTURE
AND CONDITION
- Affiche le nom, le salaire et l’emploi des employés dont le salaire est supérieur ou égal à 2000 Euros.
EMPLOYE
Comme on peut s’en rendre compte, une requête SELECT est très intuitive car elle se rapproche du
langage quotidien.
C’est une des raisons du succès du SQL. Cependant, le SQL est avant tout un langage de définition
et d’extraction de données. Ses possibilités algorithmiques, de saisie, ou d’affichage sont limitées.
Ce n’est d’ailleurs pas sa finalité.
Lorsqu’il ne suffit plus (impossibilité syntaxique ou requête trop lourde), on utilise un autre langage
qui offre une plus grande puissance algorithmique ou graphique.
Le SQL se contente alors d’extraire les données nécessaires pour le langage hôte (PL/SQL, Pro*C,
etc. ...). Beaucoup d’outils offrent en standard un interpréteur SQL pour consulter les données
d’une base relationnelle (ORACLE ou autre).
Tous nos exemples vont s’appuyer sur la base exemple qui se présente dans l’état suivant :
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
8.1.1 La clause IN
NOM SALAIRE
------------------------------ ----------
Gaston 1700
Titeuf 1800
NOM SALAIRE
------------------------------ ----------
Gaston 1700
Titeuf 1800
NOM_AVION
------------------------------
A_Caravelle_2
NOM_AVION
------------------------------
A_Caravelle_2
- Cette requête affiche tous les avions dont le nom commence par n’importe quel caractère suivi d’un _
.
- Sans l’utilisation de % on se contenterait des noms sur 2 caractères qui respectent cette règle.
Pour manipuler une valeur non renseignée (en lecture ou mise à jour) on utilise le prédicat NULL
NOM EMPLOI
------------------------------ ------------------
Gaston Directeur
- Cette requête affiche le nom et le salaire des employés dont le salaire contient la valeur NULL
ID_AVION NOM_AVION
---------- ------------------------------
2 Boeing
3 Planeur
Cette requête affiche l’identifiant et le nom des avions dont l’identifiant est compris entre 2 et 3 bornes
incluses.
ID_AVION NOM_AVION
---------- ------------------------------
4 A_Caravelle_2
2 Bo´ng
1 Caravelle
3 Planeur
ID_AVION NOM_AVION
---------- ------------------------------
4 A_Caravelle_2
2 Bo´ng
1 Caravelle
3 Planeur
- Cette requête affiche l’identifiant et le nom des avions ordonnés par nom d’avion, sur un ordre
croissant.
Pour afficher un ordre décroissant il suffit de préciser Desc derrière la colonne citée dans le tri. Le
nom de colonne peut être remplacé par la position de la colonne derrière la clause SELECT.
ID_AVION NOM_AVION
---------- ------------------------------
3 Planeur
1 Caravelle
2 Bo´ng
4 A_Caravelle_2
Le mot clé DISTINCT permet d’éliminer les doublons lors de l’affichage. Il porte sur toutes les
colonnes affichées sur une ligne.
NOM_AVION NOM
------------------------------ ------------------------------
Caravelle Gaston
Caravelle Marilyne
Caravelle Titeuf
Caravelle Marilyne
NOM_AVION NOM
------------------------------ ------------------------------
Caravelle Gaston
Caravelle Marilyne
Caravelle Titeuf
Principe de base
Les requêtes concernent souvent des informations qui sont ventilées dans plusieurs tables. La
recherche de ces informations s’appuie sur le principe de jointure. Il s’agit de rapprocher une ou
plusieurs tables qui ont des colonnes en commun. Ces liens se traduisent la plupart du temps par
des clés étrangères.
Une jointure est donc un sous ensemble du produit cartésien de deux tables. Seules les lignes
respectant les conditions de jointures sont conservées. La différence réside dans la condition de
jointure (WHERE) et dans les arguments du SELECT.
8.2.1 Equijointure
Nous souhaitons afficher le nom de tous les AVIONs qui sont utilisés pour un VOL.
Nous devons donc utiliser la table VOL pour lister tous les vols prévus, 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
l’identifiant est mentionné dans la table VOL ont forcément été prévus pour voler.
Cette requête s’écrira :
Tout se passe comme si l’interpréteur construisait une table temporaire résultant de toutes les associations
possibles entre les lignes des deux tables.
Le système n’est pas capable de « deviner » les liens entre les deux tables. Il doit construire
l’association des données des deux tables en s’appuyant 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 d’afficher les informations demandées.
AVION DESTINATION
------------------------------ --------------------
Caravelle Marquises
Caravelle Tahiti
Boeing Tokyo
Nous allons présenter maintenant d’autres 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
différentes).
8.2.2 Inequijointure
Une inéqui-jointure est une jointure sans condition d’égalité entre les deux colonnes.
Elle utilise les opérateurs « <, >, <=, >=, <>, != » .
NOM DESTINATION
------------------------------ --------------------
Gaston Tahiti
Marilyne Tahiti
Un alias permet de remplacer le nom d’une table dans un ordre select par une lettre. Le nom de la
table n’est plus reconnu que par la lettre concernée dans la totalité de la requête.
Afficher l’équipage à destination de Tahiti.
NOM DESTINATION
------------------------------ --------------------
Gaston Tahiti
Marilyne Tahiti
8.2.5 Auto-jointure
Une auto-jointure est une jointure récursive sur une seule table. Si une table comporte n lignes,
une auto-jointure sur cette table nécessitera au pire n x n comparaisons.
Afficher les employés qui managent d’autres employés.
NOM
------------------------------
Gaston
Spirou
Vérification :
L’auto-jointure est utilisée pour comparer la valeur d’une colonne dans une ligne de la table par
rapport aux autres valeurs contenues dans les lignes de la même colonne et de la même table.
Pour réussir une auto-jointure il suffit d’imaginer que la base de donnée contient deux tables
identiques portant des noms différents : « e1 » et « e2 » .
Comme on ne précise pas la jointure, Oracle effectue un produit cartésien entre la table et elle
même.
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 vérifient la condition de jointure seront donc affichées.
Si l’on désire afficher tous les employés qui sont affectés 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 n’apparaît pas dans la table EST_EQUIPAGE.
Une telle requête s’écrit en utilisant l’opérateur + (complémentaire) .
L’opérateur (+) doit être situé sur la clé étrangère qui pointe sur la table client .
NOM NO_VOL
------------------------------ ----------
Gaston 1
Marilyne 1
Titeuf 2
Marilyne 2
Spirou
Il est possible d’afficher un libellé de son choix en titre des colonnes sélectionnées.
Dans ce cas il faudra utiliser le titre de colonne affiché dans la clause ORDER BY.
N° d'avion NOM
---------- ------------------------------
4 A_Caravelle_2
3 Planeur
2 Bo´ng
1 Caravelle
N° d'avion AVION
---------- ------------------------------
4 A_Caravelle_2
3 Planeur
2 Bo´ng
1 Caravelle
AVG(SALAIRE)
---------------------------
1875
SUM(SALAIRE)/COUNT(SALAIRE)
---------------------------
1875
Il est possible d’afficher un libellé intégré à une requête dans une ligne :
4 order by destination ;
ILES
--------------------------------------------------------------------
Caravelle : Destination ==> Marquises
Caravelle : Destination ==> Tahiti
Boeing : Destination ==> Tokyo
Les requêtes avec conditions de groupement s’emploient généralement avec une fonction
prédéfinie.
ORACLE offre un vaste ensemble de fonctions utilisables à l’intérieur de la clause SELECT
(minimum, maximum, moyenne, ...).
Beaucoup de ces fonctions ne sont pas compatibles avec d’autres SGBDR. Le problème de la
migration se pose totalement et il faut se reporter au manuel ORACLE pour vérifier le respect de la
norme ANSI.
Ces fonctions sont utilisées pour effectuer des calculs sur un ensemble de valeurs (de lignes) d’une
même colonne, dans une table.
MAX(SALAIRE)
------------
2000
- Afficher le plus haut salaire des employés, cela ne nous dit pas combien d’employés ont ce salaire.
--------------------
1875
- Moyenne des salaires de la société, c’est la moyenne des valeurs de toutes les lignes de la table
EMPLOYE pour la colonne SALAIRE.
Format :
Format :
CC Siècle
MM Numéro du mois
MI Minutes
SS Secondes
AM Indication AM
PM Indication PM
BC Indication BC
AD Indication AD
EXTRACT(
YEAR | MONTH | DAY | HOUR | MINUTE | SECOND |
TIMEZONE_HOUR | TIMEZONE_MINUTE | TIMEZONE_REGION |
TIMEZONE_ABBR FROM expression)
Date du Jour
------------------------------------------------------------
SAMEDI 11 SEPTEMBRE 2004
Utilisation des fonctions date pour l’insertion de lignes dans la table VOL.
- Modifie le format date de la session courrante en « MONDAY JUNE 26, 2037: 10:30PM »
USER ASCII('CHARLY')
------------------------------ ---------------
CHARLY 67
2 from vol;
Nouveau nom
--------------------------------------------------------------------------------
Gaston-employe-employe-employe-employe-employe-employe-
Mariline-employe-employe-employe-employe-employe-employ
Spirou-employe-employe-employe-employe-employe-employe-
Titeuf-employe-employe-employe-employe-employe-employe-
NO_VOL count(id_emp)
---------- -------------
1 2
2 2
Vérification :
ID_EMP NO_VOL
---------- ----------
1 1
4 1
3 2
4 2
- On remarque que pour le vol N° 1 l’employé 1 et l’e mployé 4 y sont affectés, et pour le vol 2 l’employé
3 et l’employé 4 y sont affectés.
- Le regroupement se fait en utilisant des fonctions de regroupement comme COUNT.
Pour rendre le regroupement de données explicite, il faut utiliser la clause GROUP BY.
WHERE JOINTURE
GROUP BY REGROUPEMENT
HAVING CONDITION
;
NO_VOL TOTAL
---------- -------------
1 2
2 2
- Le nombre total d’employés par vol, revient à compter le nombre d’ID_EMP pour chaque NO_VOL
différents.
- Le regroupement se fait sur la clé NO_VOL.
Afficher le nombre d’employés prévus par vol, ainsi que la destination du vol.
- Il doit y avoir cohérence entre les colonnes derrière le SELECT et le GROUP BY.
- Ors il manque la colonne DESTINATION derrière le GROUP BY.
- La clause WHERE permet d’effectuer la jointure nécessaire entre la table VOL et la table
EST_EQUIPAGE.
Exemple 2
Il est possible d’utiliser les opérateurs ensemblistes de l’algèbre relationnelle. Les mots clés sont
UNION, MINUS, INTERSECT.
Il faut veiller à l’ordre des requêtes que l’on choisit de rapprocher, chacune d’elles doit correspondre
à un ensemble de données, ensemble que l’on soustrait l’un de l’autre, dans un ordre établi par la
requête.
Ces opérateurs sont souvent utilisés sur plusieurs tables.
8.6.1 Minus
La différence entre deux tables s’exprime par l’instruction MINUS. Elle permet d’afficher les lignes de
la première requête qui ne sont pas comprises dans la seconde.
Afficher les avions qui ne sont pas utilisés pour un vol.
Il s’agit de la totalité des avions de la base de données MOINS les avions utilisés pour un vol.
NOM_AVION
------------------------------
A_Caravelle_2
Planeur
8.6.2 UNION
Pour obtenir le cumul des lignes résultats de deux requêtes on utilise l'instruction UNION.
L’opérateur UNION ALL permet d’afficher les doublons.
Liste des avions de la compagnie aérienne.
C’est la liste des avions qui ne volent pas UNION les avions qui volent.
NOM_AVION
------------------------------
A_Caravelle_2
Bo´ng
Caravelle
Planeur
8.6.3 INTERSECT
Pour obtenir les lignes résultats d’une première requête comprises également dans le résultat d’une
seconde requête on pourra utiliser l’instruction INTERSECT.
Liste des avions qui volent, c’est l’intersection entre la liste de tous les avions et la liste des avions
qui volent.
NOM_AVION
------------------------------
Boeing
Caravelle
Depuis la version 7 d’Oracle il est possible d’effectuer une sous requête dans la clause FROM.
La sous requête est résolue avant la requête principale.
Afficher les employés travaillant dans l’avion pour le vol à destination des îles Marquises.
Oracle résout d’abord la sous requête de la clause FROM : liste des avions à destination des
Marquises, puis exécute la requête principale.
Exemple
Afficher les employés qui ont un salaire au dessus de la moyenne des salaires de l’entreprise.
Il s’agit de comparer le salaire de chaque employé avec la moyenne des salaires de l’entreprise.
AVG(SALAIRE)
------------
1875
Donc les employés qui ont un salaire supérieur à la moyenne des salaires sont :
NOM SALAIRE
-------------------- ----------
Marilyne 2000
Spirou 2000
NOM SALAIRE
-------------------- ----------
Gaston 1700
Exemple
Raisonnement :
En fait il s’agit de la liste des avions de la base de données qui ne sont pas dans la liste des avions
affectés à un vol.
La liste des avions affectés à 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 NOM_AVION
---------- ------------------------------
1 Caravelle
1 Caravelle
2 Boeing
La liste des avions de la base de données sont les avions de la table AVION .
Soit :
SQL> select id_avion, nom_avion
2 from avion
3 order by nom_avion ;
ID_AVION NOM_AVION
---------- ------------------------------
4 A_Caravelle_2
2 Boeing
1 Caravelle
3 Planeur
ID_AVION NOM_AVION
---------- ------------------------------
3 Planeur
4 A_Caravelle_2
Raisonnement :
Il s’agit de la liste des avions de la base de données qui n’existent pas dans la liste des avions
affectés à un vol.
ID_AVION NOM_AVION
---------- ------------------------------
3 Planeur
4 A_Caravelle_2
Cette requête peut également s’écrire avec l’opérateur MINUS. C’est la liste des avions moins la liste
des avions affectés à un vol.
AVION
------------------------------
A_Caravelle_2
Planeur
Cette relation se traduit par l’apparition de la clé étrangère EMP_ID_EMP dans la table EMPLOYE après
génération du modèle logique de données.
Exemple
La syntaxe habituelle d’écriture des jointures dans Oracle, comme nous l’avons vu précédemment
n’est pas ANSI.
A partir de la version 9i, Oracle propose un ensemble d’opérateurs explicites pour réaliser la
jointure de deux tables.
La syntaxe SQL 1999 n’apporte aucune amélioration en termes de performances.
Elle a été introduite par un souci de conformité avec les standards ANSI/ISO.
L’opérateur JOIN ON effectue la jointure entre deux tables en se servant des conditions spécifiées
respectant la syntaxe suivante :
-- jointure simple
SQL> select destination, nom_avion
2 from avion a JOIN vol v
3 ON v.id_avion = a.id_avion
4 order by destination ;
DESTINATION NOM_AVION
-------------------- ------------------------------
Marquises Caravelle
Tahiti Caravelle
Tokyo Bo´ng
L’opérateur JOIN ON effectue une jointure entre deux tables respectant la syntaxe suivante :
DESTINATION NOM_AVION
-------------------- ------------------------------
Tahiti Caravelle
L’opérateur JOIN USING effectue une jointure entre deux tables en se servant des colonnes
spécifiées respectant la syntaxe suivante :
Avec cette syntaxe, il est interdit de qualifier les colonnes concernées par un nom ou un alias de
table.
DESTINATION NOM_AVION
-------------------- ------------------------------
Tahiti Caravelle
Marquises Caravelle
Tokyo Bo´ng
L’opérateur NATURAL JOIN effectue la jointure entre deux tables en se servant des colonnes des
deux tables qui portent le même nom.
- NATURAL : indique qu’une jointure « naturelle » est effectuée, il effectue une équi-jointure sur toutes les
colonnes des deux tables qui portent le même nom
DESTINATION NOM_AVION
-------------------- ------------------------------
Tahiti Caravelle
Marquises Caravelle
Tokyo Boeing
L’opérateur CROSS JOIN est un produit cartésien, il donne le même résultat qu’une requête sans
condition.
En cas d’erreur, une jointure simple est réalisée, ou la condition n’est pas prise en compte.
DESTINATION NOM_AVION
-------------------- ------------------------------
Tahiti Caravelle
Marquises Caravelle
Tokyo Boeing
L’opérateur OUTER JOIN effectue une jointure externe entre deux tables en se servant des
conditions spécifiées.
- LEFT | RIGHT = indique que la table de gauche | droite est dominante, celle dont on affiche toutes les
lignes.
- FULL = cette option est l’union des deux requêtes : LEFT OUTER JOIN et RIGHT OUTER JOIN.
DESTINATION NOM_AVION
-------------------- ------------------------------
Tahiti Caravelle
Marquises Caravelle
Tokyo Bo´ng
A_Caravelle_2
Planeur
Par exemple nous allons modifier de la table VOL, en désactivant des contraintes sur la colonne
ID_AVION, pour insérer une ligne dans la table VOL correspondant à un vol sans avion.
TABLE_NAME CONSTRAINT_NAME C
STATUS
------------------------------ ------------------------------ - ---
-----
AVION SYS_C001527 C
ENABLED
AVION PK_AVION P
ENABLED
AVION_2 SYS_C001542 C
ENABLED
EMPLOYE SYS_C001523 C
ENABLED
EMPLOYE SYS_C001524 C
ENABLED
EMPLOYE SYS_C001525 C
ENABLED
EMPLOYE PK_EMPLOYE P
ENABLED
EMPLOYE FK_EMPLOYE_A_POUR_PA_EMPLOYE R
ENABLED
EMPLOYE SALAIRE_CC C
ENABLED
EST_EQUIPAGE SYS_C001534 C
ENABLED
EST_EQUIPAGE SYS_C001535 C
ENABLED
EST_EQUIPAGE PK_EST_EQUIPAGE P
ENABLED
EST_EQUIPAGE FK_EST_EQUI_EST_EQUIP_EMPLOYE R
ENABLED
EST_EQUIPAGE FK_EST_EQUI_EQUIPAGE_VOL R
ENABLED
VOL SYS_C001529 C
ENABLED
VOL SYS_C001530 C
ENABLED
VOL SYS_C001531 C
ENABLED
VOL SYS_C001532 C
DISABLED
VOL PK_VOL P
ENABLED
VOL FK_VOL_UTILISE_AVION R
DISABLED
20 ligne(s) sÚlectionnÚe(s).
1 ligne crÚÚe.
DESTINATION NOM_AVION
-------------------- ------------------------------
Marquises Caravelle
Tahiti Caravelle
Tokyo Bo´ng
Paris
2 from avion a
3 FULL OUTER JOIN vol v
4 ON v.id_avion = a.id_avion ;
DESTINATION NOM_AVION
-------------------- ------------------------------
Tahiti Caravelle
Marquises Caravelle
Tokyo Bo´ng
A_Caravelle_2
Planeur
Paris
6 ligne(s) sÚlectionnÚe(s).
La cohérence des données repose sur le principe des transactions et des accès concurrents. Une
transaction correspond à un ensemble de commandes SQL que l’on appellera actions élémentaires.
Cet ensemble forme un tout qui sera entièrement validé (mise à jour définitive de la base) ou pas
du tout. ORACLE offre également un mécanisme de gestion des accès concurrents. Ce mécanisme
repose sur la technique du verrouillage des données. Ce verrouillage peut être implicite (par
ORACLE) ou explicite (par l’utilisateur).
Principe général :
ORACLE exécute une commande qui appartient à une transaction.
ORACLE valide une transaction dans sa globalité ou pas du tout.
La lecture cohérente garantie par Oracle est la possibilité de lire des données pendant la mise à jour
de celles-ci tout en étant assuré que la version des données lues est la même.
La première commande insère une ligne de commande dans la table ligne_com (la commande
numéro 10 concerne 40 articles numéro 5).
La seconde commande met à jour la quantité en stock de l’article 5 d’après la quantité commandée.
Ces deux commandes doivent être exécutées et validées toutes les deux. Si, pour une raison
quelconque (panne, condition fausse, ...) l’une des commandes n’a pu être traitée, ORACLE doit
annuler l’autre. Lorsque les deux commandes sont exécutées et deviennent effectives, la
transaction est valide. Dans le cas contraire, elle est annulée.
La base revient dans l’état qu’elle avait avant la transaction.
Pour rendre définitive l’exécution des commandes il faut valider la transaction correspondante.
La validation d’une transaction est implicite ou explicite :
La commande commit permet de valider l’ensemble des opérations élémentaires de la transaction en
cours. La prochaine opération fera débuter une nouvelle transaction.
La commande rollback annule l’exécution des opérations élémentaires de la transaction en cours. La
prochaine opération fera débuter une nouvelle transaction.
La fin normale d’une session (programme client ou session SQL*PLUS) entraîne la validation implicite
de la transaction courante.
La fin anormale d’une session entraîne l’annulation de la transaction courante.
Les commandes de définition de données (CREATE, ALTER, RENAME, DROP) sont
automatiquement validées.
Le début d’une application ou d’une session SQL constitue automatiquement le début d’une
transaction. Chaque instruction commit ou rollback marque la fin de la transaction courante et le
début d’une nouvelle transaction. Une transaction correspond donc à un ensemble de commandes
comprises entre deux instructions commit ou rollback.
Il est cependant possible de définir plus finement une transaction en insérant des points de repères
(savepoints).
L’instruction SAVEPOINT permet de préciser les points de repères jusqu’où l’annulation de la
transaction pourra porter.
On créer donc ainsi des sous transactions.
INSERT INTO ligne_com VALUES (10,1,5,40);
SAVEPOINT point1;
A ce niveau,
- l’instruction commit valide les deux commandes INSERT et UPDATE,
- l’instruction rollback annule les deux commandes INSERT et UPDATE
- l’instruction ROLLBACK to point1 annule la commande UPDATE. La prochaine instruction commit ou
rollback ne portera que sur la commande INSERT.
La gestion des accès concurrents consiste à assurer la sérialisation des transactions qui accèdent
simultanément aux mêmes données. Cette fonctionnalité de base d’ORACLE est basée sur les
concepts d’intégrité, de concurrence, et de consistance des données
Pour que l’exécution simultanée de plusieurs transactions donne le même résultat qu’une exécution
séquentielle, la politique mise en œuvre consiste à verrouiller momentanément les données utilisées
par une transaction. Dans ORACLE, le granule de verrouillage est la ligne. Tant qu’une transaction
portant sur une ou plusieurs lignes n’est pas terminée (validée ou annulée), toutes les lignes sont
inaccessibles en mise à jour pour les autres transactions. On parle de verrouillage. Il peut s’agir
d’un verrouillage implicite ou explicite.
Verrouillage implicite
Toute commande insert ou update donne lieu à un verrouillage des lignes concernées tant que la
transaction n’est pas terminée. Toute transaction portant sur ces mêmes lignes sera mise en
attente.
Verrouillage explicite
Dans certains cas l’utilisateur peut souhaiter contrôler lui-même les mécanismes de verrouillage.
En général, il utilise la commande :
Tous les VOLs sont verrouillés mais une clause WHERE est possible. Le verrouillage ne porte alors que
sur les lignes concernées.
Il existe différents modes de verrouillages d’une table (mode lignes partagées, équivalent au select
for update, mode lignes exclusives, mode table partagée, mode partage exclusif, mode table
exclusive).
En plus de la simple visibilité des données, on peut ainsi préciser les verrous autorisés par dessus
les verrous que l’on pose. Par exemple, plusieurs select for update peuvent s’enchaîner
(verrouillage en cascade).
Lorsque la première transaction sera terminée, le second select for update pose ses verrous et ainsi
de suite. Par contre, un verrouillage en mode table exclusive empêche tout autre mode de
verrouillage. A titre d’exemple, nous ne présenterons ici que les verrouillages standards (implicites
suite à une commande insert, update, ou delete).
Verrouillage bloquant
ORACLE détecte les verrouillages bloquant (deadlock). Ces verrouillages correspondent à une
attente mutuelle de libération 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 lancées « vraiment » en même temps, on ne parle pas de
verrouillage bloquant. Les deux transactions s’exécutent normalement l’une à la suite de l’autre.
Si deux utilisateurs accèdent à des lignes différentes d’une table qui n’a pas fait l’objet d’un
verrouillage particulier, les transactions s’effectuent normalement.
Si les deux utilisateurs accèdent aux mêmes lignes d’une table alors la transaction débutée le plus
tard sera mise en attente. La validation de la première transaction « libérera » la seconde.
Les mécanismes internes de gestions des transactions et des accès concurrents sont gérés par
ORACLE. Il reste à la charge du programmeur la gestion des verrous explicites et la maîtrise des
verrous implicites. Les règles générales sont les suivantes :
Une transaction est constituée d’un ensemble d’opérations élémentaires (insert, update, ...),
ORACLE garantit qu’une transaction est entièrement validée ou défaite,
Toute session SQL (sous SQL*PLUS ou depuis un programme) démarre une transaction,
Toute fin normale de session déclenche un commit,
Toute fin anormale de session déclenche un rollback,
L’unité de verrouillage sous ORACLE est la ligne,
Une commande INSERT, DELETE, ou UPDATE entraîne un verrouillage implicite des lignes concernées,
La commande SELECT FOR UPDATE permet de verrouiller explicitement les lignes concernées. Elle peut
utiliser la clause WHERE pour ne pas verrouiller toute la table,
Les verrous sont levés par les commandes commit ou rollback.
Ne jamais perdre de vue les scénarii d’activité des opérateurs afin d’éviter de mettre en place une
gestion aussi fine qu’inutile de l’unité de verrouillage (ligne ?, table?). Concrètement, il faut se
poser des questions de base comme « Combien d’accès concurrents sur telles données observe-t-on
en moyenne ? ». Le code s’en trouvera considérablement simplifié.
Les rollbacks segments sont des segments permettant à Oracle de stocker l’image avant les
modifications effectuées durant une transaction.
C’est Oracle qui alloue les transactions aux rollback segments.
Lorsque la transaction se termine, elle libère le rollback segment mais les informations de rollback
ne sont pas supprimées immédiatement
Ces informations peuvent encore être utiles pour une lecture cohérente
Par défaut c’est Oracle qui alloue les rollback segment aux transactions en cherchant à répartir les
transactions concurrentes sur les différents rollback segment. Dans certain cas il est possible
d’allouer un rollback segment à une transaction en utilisant l’ordre SQL : SET TRANSACTION USE
ROLLBACK SEGMENT.
Lorsqu’un rollback segment est plein et que la transaction a besoin d’espace, une erreur se produit
et la transaction est arrêtée. Le rollback segment grossit dans la limite de la taille du tablespace qui
le contient. En cas d’erreur, il faut alors retailler le rollback segment puis relancer la transaction en
lui affectant le roollback segment agrandi.
L’erreur « snapshot to hold » correspond à problème de lecture cohérente. Une requête (SELECT)
dans un segment peut être écrasée par une transaction, lors de la lecture cohérente si il y a besoin
de cette requête (SELECT) cela provoque l’erreur « snapshot to hold ».
La mise à jour des données d’une base se fait par l’une des commandes suivantes :
INSERT Insertion d’une ligne
UPDATE Modification d’une ou plusieurs lignes
DELETE Suppression d’une ou plusieurs lignes
Les commandes de mise à jour de la base déclenchent éventuellement des triggers (cf. chapitre
TRIGGERS) ou des contraintes d’intégrité. Elles n’accèdent donc pas directement aux données
comme en témoigne le schéma suivant :
Nous allons présenter les points fondamentaux de la syntaxe de ces commandes (nous appuyons
nos exemples sur le schéma de la base exemple précédente).
INSERT INTO nom_table (liste de colonnes séparées par des virgules dans
l’ordre crées)
VALUES (liste de valeurs séparées par des virgules dans l’ordre des
colonnes citées);
(3,'Planeur' );
insert into avion values
(4,'A_Caravelle_2');
Vérification :
SQL> select * from avion;
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
2 Bo´ng
3 Planeur
4 A_Caravelle_2
Nous allons créer une table AVION_2, car pour notre exemple il faut travailler obligatoirement sur
une autre table.
Table crÚÚe.
DESTINATION VARCHAR2(30)
1 ligne crÚÚe.
3 ligne(s) crÚÚe(s).
Vérification :
Modification de la table :
Dans un ordre INSERT ou UPDATE, il est possible d’affecter explicitement à une colonne la valeur par
défaut définie sur cette colonne
En mettant le mot clé DEFAULT comme valeur de la colonne
NULL est affecté si la colonne n’a pas de valeur par défaut
1 ligne crÚÚe.
1 ligne crÚÚe.
6 ligne(s) sÚlectionnÚe(s).
6 ligne(s) sÚlectionnÚe(s).
1 ligne supprimÚe.
3 ligne(s) supprimÚe(s).
Le vidage d'une table supprime toutes les lignes de la table et libère l'espace utilisé.
La table et ses index sont supprimés.
Une table référencée par une clé étrangère ne peut pas être supprimée car la contrainte est
vérifiée.
Table tronquÚe.
Lors du vidage d’une table, il faut inactiver les contraintes clé étrangères si
nécessaire.
Ne pas oublier de les réactiver après !
12 gestion de la confidentialité
Oracle permet à plusieurs utilisateurs de travailler en toute sécurité sur la base de données.
Chaque objet peut être définie, soit comme confidentielle et accessible à un nombre restreint
d’utilisateurs, soit accessible à l’ensemble des utilisateurs.
Les ordres GRANT et REVOKE du langage SQL permettent de définir les droits de chaque utilisateur
sur les objets de la base de données.
Les privilèges peuvent être attribués directement aux utilisateurs ou par l’intermédiaire de rôles.
Un rôle est un regroupement nommé de privilèges.
Pour accéder à un objet, le propriétaire doit vous donner un des privilèges objet suivants :
INSERT
UPDATE
DELETE
EXECUTE
ALTER
INDEX
REFERENCES
@ Creer_TS_Tahiti
connect charly/defi@tahiti
@ Creer_Tables_Tahiti
@ Rempli_Tables_Tahiti
Souvent, l’ordre SQL a un privilège système qui porte le même nom, par exemple, l’ordre CREATE
TABLE a un privilège système associé qui s’appelle CREATE TABLE (donne le droit de créer une table
dans son propre schéma).
Certains privilèges système reprennent le nom de l’ordre SQL avec le mot clé ANY, dans ce cas, le
privilège système permet d’exécuter l’ordre dans n’importe quel schéma de la base, par exemple, le
privilège système CREATE ANY TABLE donne le droit de créer une table dans n’importe quel schéma
de la base.
NAME
----------------------------------------
CREATE ANY CLUSTER
CREATE ANY CONTEXT
CREATE ANY DIMENSION
CREATE ANY DIRECTORY
CREATE ANY EVALUATION CONTEXT
CREATE ANY INDEX
CREATE ANY INDEXTYPE
CREATE ANY LIBRARY
CREATE ANY OPERATOR
CREATE ANY OUTLINE
CREATE ANY PROCEDURE
CREATE ANY RULE
CREATE ANY RULE SET
CREATE ANY SECURITY PROFILE
CREATE ANY SEQUENCE
CREATE ANY SNAPSHOT
...
Lorsque le rôle est enlevé, les utilisateurs connectés peuvent toujours exercer
les privilèges associés à ce rôle jusqu'à la fin de la session, ou la
désactivation du rôle.
Un rôle attribué à un utilisateur (directement ou via un autre rôle) est par défaut automatiquement
activé lors de la connexion de l’utilisateur.
Si l’utilisateur est connecté au moment de l’attribution, l’activation immédiate n’est pas
automatique :
Mais l’utilisateur peut l’activer par l’ordre SQL SET ROLE
SET ROLE
{ nom_rôle [ IDENTIFIED BY mot_de_passe ] [,…]
| ALL [ EXCEPT nom_rôle [,…] ] | NONE }
;
Utiliser plusieurs rôles sans qu’ils soient tous actifs présente deux intérêts :
Le paramètre MAX_ENABLED_ROLES (20 par défaut) limite le nombre de rôles actifs simultanément
pour un utilisateur. Si un utilisateur utilise un nombre de rôles supérieur à cette limite, il est possible
d’en désactiver certains pour en activer d’autres.
Des rôles protégés par un mot de passe peuvent être attribués à des utilisateurs, mais inactifs par
défaut et sans donner le mot de passe à l’utilisateur. C’est l’applicatif qui active le rôle en fournissant
le mot de passe de façon transparente. Par exemple l’application se connecte et lorsque l’utilisateur
se signe le rôle devient actif.
13 Notion de schéma
Un schéma est le regroupement des objets d’un utilisateur dans une même unité logique.
Il permet de construire l’ensemble des structures d’une application en une seule opération.
Le contrôle des dépendances entre les objets est réalisé à la fin de la création de tous les objets.
Le nom du schéma ne peut être que celui du propriétaire des objets créés.
Next 10K
Pctincrease 0)
Il facilite la gestion des objets utilisateur : si une seule opération échoue lors de la création du
schéma (création d’une table), il y a un « rollback » général et toutes les opérations sont annulées,
aucun objet n’est créé.
Il facilite l’administration des statistiques sur les objets, au lieu d’exécuter une commande SQL pour
chaque objet, on peut le faire pour tous les objets appartenant au schéma.
Tout est validé ou rien ne l’est. Technique difficile avec un nombre important
de tables, de vues et de packages.
Nous allons présenter le concept de vue à travers une suite progressive d’exemples. Une synthèse
sur l’intérêt des vues est proposée à la fin de ce chapitre.
Une vue est une perception logique d’une ou plusieurs tables (ou vues) définie à partir d’une
requête.
Création d’une vue sur les avions et les vols prévus.
Vue crÚÚe.
L’accès aux éléments d’une vue est le même que pour ceux d’une table ...
La syntaxe utilisée ici semble exprimer qu’une vue et une table sont de même nature. Il n’en est
rien. Une vue ne nécessite pas d’autre stockage d’information que le texte de sa requête de
création et une entrée dans le dictionnaire des vues.
Chaque fois que l’on manipule une vue, le texte effectif de la requête est
reconstruit dynamiquement en consultant le dictionnaire des vues.
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 opérations SQL comme INSERT,
UPDATE, DELETE, SELECT.
A travers la vue, c’est en fait la table à partir de laquelle la vue a été construite qui sera mise à jour
(et la vue généralement aussi par conséquence).
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
La vue n’utilise pas des opérateurs tels que : GROUP BY, DISTINCT, ORDER BY, des fonctions
d’agrégat, ou des fonctions analytiques, des collections ou des requêtes imbriquées…
La table ne contient pas de colonne de type LOB ou de type objet
Les contraintes d’intégrité sont respectées à travers la vue
La table ne fait pas l’objet de réplication
Les index de la table sont de type B-Tree (pas de Cluster ou d’IOT : Index Organised Table)
Les options que l’on peut associer à une vue lors de sa création sont :
WITH CHECK OPTION Respecte les conditions de la vue en mise à jour
WITH READ ONLY N’autorise que la lecture
La clause WHITH CHECK OPTION garantie que toutes les insertions ou les mises à jour à travers la
vue seront maintenant contrôlées avant d’être effectives. Le contrôle effectué correspond aux
conditions précisées dans la vue.
Vue crÚÚe.
Attention aux contraintes d’intégrités, par exemple l’insertion d’un nouveau vol à travers la vue est
contrôlée ...
Exemple
Nous allons recréer la vue Mes_Vols en y ajoutant la colonne ID_AVION de la table VOL.
Nous visualiserons dans l’exemple l’insertion de lignes dans la vue MES_VOLS et le contrôle fait par
Oracle avec l’option WITH CHECK OPTION.
Vue crÚÚe.
1 ligne crÚÚe.
Vue supprimÚe.
Un synonyme est un nom logique donné à un objet existant, il peut être associé à un objet de
schéma de type :
Table
Vue
Sequence
Cluster
Procédure, fonction, package
Les tables sont visibles à condition de préfixer le nom des tables par le user de création des tables,
par exemple la table AVION créée par le user CHARLY est accessible si on l’appelle par :
CHARLY.AVION
Il est possible de créer des synonymes afin d’associer un nom à une table et de simplifier l’accès
des tables aux utilisateurs.
Il s’agit de donner un autre nom à un objet afin de le référencer différemment.
Pour pouvoir renommer un synonyme, il ne doit pas avoir été créé avec la clause PUBLIC. Si c’est le
cas il faut le supprimer puis le re-créer.
Les séquences sont des objets permettant de gérer les accès concurrents sur une colonne de table
et d’éviter les inter-blocages.
Par exemple le calcul automatique d’une clé primaire contenant un numéro séquentiel.
L’appel de la séquence lors de l’insertion des données permet de récupérer un numéro calculé par
Oracle à chaque accès base. Ce numéro est utilisé comme identifiant et est unique.
Une seule séquence doit être créée pour chaque table de la base de données.
Il est possible d’associer un synonyme à la séquence avant de donner les droits d’utilisation de
celle-ci aux « USERS ».
CYCLE | NOCYCLE
ORDER | NOORDER
select Ma_Sequence.currval
from dual;
- Les paramètres sont les mêmes que pour la création d’une séquence.
- INCREMENT BY : indique le pas d’incrémentation de la séquence
- START WITH : permet de spécifier la valeur de la première valeur de séquence à générer. Par défaut
cette valeur correspond à MINVALUE pour une séquence ascendante et à MAXVALUE pour une
séquence descendante.
- MAXVALUE : indique la valeur maximum de la séquence. Par défaut 10 puissance 27 pour l’ordre
croissant et -1 pour l’ordre décroissant.
- MINVALUE : indique la valeur minimum de la séquence. Par défaut 1 (NOMINVALUE) pour l’ordre
croissant et -10 puissance 26 pour l’ordre décroissant.
- CYCLE : permet de revenir à la valeur initiale en fin de limite. L’option NOCYCLE est prise par défaut.
- CACHE : spécifie au système d ‘allouer plusieurs séquences en même temps. La valeur spécifiée doit
être inférieure au nombre de valeur du cycle. Oracle alloue par défaut 20 valeurs.
- ORDER : indique que les nombres doivent être générés dans l’ordre de la demande. NOORDER est
l’option par défaut.
Une procédure est une unité de traitement qui contient des commandes SQL relatives au langage de
manipulation des données, des instructions PL/SQL, des variables, des constantes, et un gestionnaire
d’erreurs.
Une fonction est une procédure qui retourne une valeur.
Un package est un agrégat de procédures et de fonctions.
Les packages, procédures, ou fonctions peuvent être appelés depuis toutes les applications qui
possèdent une interface avec ORACLE (SQL*PLUS, Pro*C, SQL*Forms, ou un outil client particulier
comme NSDK par exemple).
Les procédures (fonctions) permettent de :
Réduire le trafic sur le réseau (les procédures sont locales sur le serveur)
Mettre en œuvre une architecture client/serveur de procédures et rendre indépendant le code client de
celui des procédures (à l’API près)
Masquer la complexité du code SQL (simple appel de procédure avec passage d’arguments)
Mieux garantir l’intégrité des données (encapsulation des données par les procédures)
Sécuriser l’accès aux données (accès à certaines tables seulement à travers les procédures)
Optimiser le code (les procédures sont compilées avant l’exécution du programme et elles sont
exécutées immédiatement si elles se trouvent dans la SGA (zone mémoire gérée par ORACLE). De
plus une procédure peut être exécutée par plusieurs utilisateurs.
Les packages permettent de regrouper des procédures ou des fonctions (ou les deux). On évite
ainsi d’avoir autant de sources que de procédures.
Le travail en équipes et l’architecture applicative peuvent donc plus facilement s’organiser du côté
serveur, où les packages regrouperont des procédures choisies à un niveau fonctionnel. Les
packages sont ensuite utilisés comme de simples librairies par les programmes clients. Mais
attention, il s’agit de librairies distantes qui seront processées sur le serveur et non en locale
(client/serveur de procédures).
Dans ce contexte, les équipes de développement doivent prendre garde à ne pas travailler chacune
dans « leur coin ». Les développeurs ne doivent pas perdre de vue la logique globale de l’application
et les scénarios d’activité des opérateurs de saisie.
Un trigger permet de spécifier les réactions du système d’information lorsque l’on « touche » à ses
données. Concrètement il s’agit de définir un traitement (un bloc PL/SQL) à réaliser lorsqu’un
événement survient.
Les événements sont de six types (dont trois de base) et ils peuvent porter sur des tables ou des
colonnes :
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
Pour bien situer le rôle et l’intérêt des TRIGGERS, nous présentons ici une vue générale des
contraintes sur le
Serveur :
Procédures
Select
Insert Trigger
Update Not Null
Delete Primary Key
Contraintes Unique Key
Etc... d'intégritées Foreign Key
Contrainte Check
Tables
kmlkmlkm
Type
Longueur
Rappelons que les contraintes d’intégrité sont garantes de la cohérence des données (pas de ligne
de commande qui pointe sur une commande inexistante, pas de code postal avec une valeur
supérieur à 10000, pas de client sans nom, etc. ...).
Les TRIGGERS et les contraintes d’intégrité ne sont pas de même nature même si les deux concepts
sont liés à des déclenchements implicites.
Un trigger s’attache à définir un traitement sur un événement de base comme « Si INSERTION
dans telle table alors faire TRAITEMENT ». L’intérêt du TRIGGER est double. Il s’agit d’une part de
permettre l’encapsulation de l’ordre effectif (ici INSERTION) de mise à jour de la base, en vérifiant la
cohérence de l’ordre. D’autre part, c’est la possibilité d’automatiser certains traitements de mise à
jour en cascade.
Les traitements d’un TRIGGER (insert, update, delete) peuvent déclencher d’autres TRIGGERS ou
solliciter les contraintes d’intégrité de la base qui sont les « derniers gardiens » de l’accès effectif
aux données.
En version 9i il existe des TRIGGERS rattachés aux VUES ou des TRIGGERS sur événements systèmes.
En version 10g il est possible de gérer un commit ou un Rollback à l’interieur du corps du trigger.
Les index permettent de retrouver rapidement les données d’une base. Ils peuvent être créés sur
des tables ou des clusters. Ils interviennent donc directement dans les performances d’une base de
données. Dans ORACLE, leur création est implicite sur les clés primaires (PRIMARY KEY) et unique
(UNIQUE KEY).
L’utilisateur peut créer lui même ses propres index sur une ou plusieurs colonnes d’une table.
Un index concaténé, également appelé index composé, est créé sur plusieurs colonnes d’une table.
Les colonnes ne doivent ni suivre forcément le même ordre que celui des colonnes de la table, ni
être adjacents.
Un index comprend un maximum de 32 colonnes. Toutefois la taille totale des colonnes reste
inférieure à un tiers de la taille du bloc de données.
Un index unique garanti que deux lignes d’une table n’ont pas la même valeur
dans la colonne qui le définit.
Si trop d’index sont créés sur une table, ils pénalisent les performances.
Un index contient les valeurs des colonnes indexées et les adresses mémoires des lignes
correspondants à ces colonnes.
Les index utilisent une structure analogue à celle des tables.
En termes algorithmiques, la recherche dans un B*-Tree est semblable à celle réalisée dans un
arbre binaire, à la différence qu’un arbre B*-Tree peut contenir jusqu’à n nœuds enfant, alors qu’un
nœud d’un arbre binaire ne peut en contenir que 2.
Oracle n’utilise pas d’index organisés en nœuds binaires mais plutôt une arborescence équilibrée.
Les entrées d’index présentées ci-dessus ne concernent que les index globaux ou les tables non
partitionnées.
Les index réduisent les temps de réponse en lecture, mais pénalisent les performances en
modifications (INSERT, UPDATE, DELETE).
Les index sont considérés comme des objets de la base. A ce titre, on peut les créer, les modifier,
ou les supprimer. Comme pour une table, ou un utilisateur, la création d'un index nécessite des
informations sur les caractéristiques de stockage (tablespace et paramètres).
-- ============================================================
-- Index : A_POUR_PATRON_FK
-- ============================================================
create index A_POUR_PATRON_FK on EMPLOYE (EMP_ID_EMP asc)
tablespace INDX
/
Les colonnes fréquemment utilisées dans les clauses WHERE peuvent l’être comme critère de
sélection ou critère de jointure.
En général, une sélectivité inférieure à 5% est bonne et une sélectivité supérieure à 15% est
mauvaise ; entre les deux, il faut tester …
Pour la sélectivité, il faut que les valeurs de la colonne soient relativement uniques (beaucoup de
valeurs distinctes) et que les conditions qui les utilisent soient elles-mêmes sélectives.
Parmi les colonnes candidates, il faut d’abord identifier les colonnes qui sont systématiquement
présentes ensemble dans la clause WHERE : ce sont de bonnes candidates pour la création d’un
index composé qui est généralement plus sélectif qu’un index simple.
L’ordre des colonnes est important dans un index composé : un index composé est utilisé si les
colonnes de tête de la clé d’index sont présentes dans la condition (mais l’ordre des colonnes dans
la condition n’a pas d’importance).
Indexer les petites tables ne sert à rien car, le nombre minimum de blocs à lire lors d’un accès par
index est de 2 (1 bloc au minimum pour l’index et 1 bloc au minimum pour la table).
Lorsqu’une contrainte de clé primaire ou de clé unique est créée ou activée, Oracle regarde s’il
existe un index qui peut être utilisé pour vérifier la contrainte :
Index unique ou non unique, dont la clé est égale à, ou commence par, la clé de la contrainte
Si un tel index n’existe pas, Oracle créé un index unique pour vérifier la contrainte, dont la clé est
égale à la clé de la contrainte.
L‘option USING INDEX de la clause CONSTRAINT permet de spécifier les caractéristiques de stockage
de cet index :
Si la clause USING INDEX est spécifiée avec un tablespace différent du tablespace utilisé par l’index
existant, Oracle retourne une erreur car il ne peut pas créer deux index sur la même clé.
Si deux index peuvent être utilisés, Oracle en choisit un.
-- ============================================================
-- 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 : CLES ETRANGERES
-- ============================================================
alter table EMPLOYE
add constraint FK_EMPLOYE_A_POUR_PA_EMPLOYE foreign key (EMP_ID_EMP)
references EMPLOYE (ID_EMP)
USING INDEX
TABLESPACE indx
PCTFREE 20
STORAGE ( INITIAL 2000K NEXT 400K MAXEXTENTS 64 PCTINCREASE 0 )
/
Elle permet de mentionner explicitement le nom d'un index existant à utiliser pour vérifier la
contrainte :
Elle permet d’inclure un ordre SQL CREATE INDEX pour créer explicitement l'index associé à la
contrainte :
Table modifiÚe.
1 ligne crÚÚe.
Par défaut, avec Oracle9i, il n’y a pas de changement sur le sort de l’index associé à une contrainte
lorsque cette dernière est supprimée :
Si l’index associé est unique, il est supprimé
Si l’index associé est non unique, il est conservé
Avec Oracle9i, il est possible d’indiquer explicitement si l’index associé à une contrainte supprimée
doit être conservé ou supprimé.
A priori, conserver un index unique lors de la suppression d’une contrainte de clé primaire ou
unique n’a pas de sens : l’unicité est toujours vérifiée …
Les tables sont des objets de stockage car elles utilisent de l’espace disque.
L’espace disque utilisé par les tables est ppelé segment de table.
Ce sont des objets permanents.
La technologie de la mémoire d’Oracle 10g, offre la capacité d’interroger la version ancienne sur le
schéma des objets, d’interroger les données historiques et d’améliorer les modifications d’analyses
(d’effectuer des modifications d’analyse).
Toute transaction logique génère une nouvelle version de la base de données. Avec Oracle database
10g, vous pouvez naviguer à travers ces versions pour trouver une erreur et sa cause :
Flashback Query : interroge toutes les données historiques (dans le temps)
Flashback Version Query : voit toutes les versions des données modifiées et la transaction qui a
effectué ce changement.
Flashback Transaction Query : voit tous les changements faits par une transaction.
La version 9i introduisait la notion de « flashback query » pour fournir un mécanisme simple pour
réparer les erreurs humaines.
Oracle 10g étend la technologie flashback pour assurer vite et facilement une réparation à tous les
niveaux :
Flashback database ; vous laisse rapidement ramener votre base à un point dans le temps en
réparant toutes les modifications apportées depuis cet instant.
Flashback drop ; donne une solution pour restaurer accidentellement des tables
Flashback table ; vous permet de retrouver rapidement une table et son contenu à un moment dans le
passé.
Flashback Query ; vous laisse voir les modifications apportée à une ou plusieurs données
accompagnées de ses les méta-données.
En effet, vous pouvez visualiser tous les objets que vous avez supprimés à partir des vues :
USER_RECYCLEBIN ou RECYCLEBIN.
DBA_RECYCLEBIN contient tous les objets qui ont été perdus par tous les utilisateurs de la base de
données et qui sont toujours dans la corbeille de recyclage.
La commande SQL*Plus : SHOW RECYCLEBIN permet de visualiser les objets qui ne peuvent pas être
supprimés.
COL_ID COL_NOM
---------- -----------------------------------
1 clotilde ATTOUCHE
1 melodie dupond
Table supprimÚe.
COL_ID COL_NOM
---------- -----------------------------------
1 clotilde ATTOUCHE
1 melodie dupond
Table supprimÚe.
Pour supprimer une table de façon définitive sans qu’elle aille dans la corbeille de recyclage il faut
utiliser la commande :
- INTO table_cible [alias] : spécifie la table cible des insertions ou mises à jour
table_cible : nom de la table
alias : alias sur la table (optionnel)
- ON condition : définit la condition sur la table cible qui va déterminer la nature de l’opération effectuée
sur chaque ligne de la table cible
Chaque ligne de la table cible telle que la condition est vraie est mise à jour avec les données
correspondantes de la source
Si la condition n’est vérifiée pour aucune ligne de la table cible, Oracle insère une ligne dans la
table cible avec les données correspondantes de la source
- WHEN MATCHED THEN clause_update : spécifie l’ordre UPDATE qui est exécuté sur les lignes de la
table cible lorsque la condition est vérifiée
UPDATE « normal » sans le nom de la table (déjà définie par la clause INTO de l’ordre MERGE)
- WHEN NOT MATCHED THEN clause_insert : spécifie l’ordre INSERT qui est exécuté dans la table cible
lorsque la condition n’est pas vérifiée
INSERT avec VALUES « normal » sans la clause INTO donnant le nom de la table (déjà définie par
la clause INTO de l’ordre MERGE)
5 lignes fusionnÚes.
Vérification :
6 ligne(s) sÚlectionnÚe(s).
En version 9i, la condition doit se faire sur l’identifiant 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
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)
-- supprimer les lignes des produits dont le statut est devenu obsolète
-- en effectuant l’UPDATE.
-- elle supprime les produits obsolètes 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)
;
La création d’une table peut se faire à partir d’une table existante en précisant la requête
d’extraction des colonnes désirées.
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
2 Boeing
3 Planeur
Table renommÚe.
ID_AVION NOM_AVION
---------- ------------------------------
1 Caravelle
2 Boeing
3 Planeur
Il est possible de créer des tables temporaires afin d’optimiser les temps d’exécution des requêtes,
ou pour des raisons pratiques lors de traitements.
Il s’agit de tables créés par un ordre SQL, CREATE TABLE, dont la définition est stockée dans la base
(« méta-données »), mais dont les données sont stockées à l’extérieur de la base (dans des
fichiers) et accessibles via un « driver » Oracle.
Le fonctionnement est complètement transparent du point de vue applicatif.
Par exemple elles permettent le stockage d’un fichier.
Seule la définition de la table est stockée dans la base, un peu comme une vue.
La définition d’une table externe comporte deux parties :
Une partie qui décrit les colonnes (nom et type)
Une partie qui décrit la correspondance entre les colonnes et les données externes
Les données externes peuvent avoir plus de champs, moins de champs, des types différents par
rapport aux colonnes de la table.
Le driver est capable de les présenter telles qu’elles sont définies dans la table.
Oracle fournit un driver permettant d’accéder à des données stockées dans un fichier.
L’avantage majeur de cette nouvelle fonctionnalité est de décharger des tables vers des fichiers
plats et d’utiliser ces fichiers plats pour charger le system cible. De cette manière des volumes
importants de données peuvent être transformés et chargés dans un fichier plat indépendant de la
plate forme.
Quand les données sont extraites elles sont converties de la représentation interne d’Oracle vers
une représentation externe native d’Oracle (DPAPI). Ce processus est accompli via une commande
CREATE TABLE AS SELECT. Dans ce cas la source correspond aux données extraites par la clause
SELECT et la destination le driver d’accès Oracle DATA Pump.
Après la création et le remplissage d’une table externe via la commande CREATE TABLE AS SELECT
aucune ligne ne peut plus être insérée, modifiée, ou supprimée.
Toute tentative de modification des données dans la table externe génère les erreurs ORA-30657.
Les fichiers de données créés pour les tables externes peuvent être déplacés pour être utilisés
comme fichiers de données pour d’autres tables externes de la même base ou d’une base
différente.
Ces fichiers ne peuvent être lus que via le driver d’accès Oracle DATA pump.
Lorsque des fichiers de données sont remplis via des tables externes différentes, ils peuvent être
spécifiés dans la clause LOCATION d’une autre table externe. Ceci fourni une méthode d’agrégation
de données à partir de sources multiples.
La seule restriction est que les meta-données pour toutes les tables externes doivent être
exactement les mêmes.
Le package DBMS_META_DATA peut être utilisé pour extraire les informations concernant les méta-
données.
Ces opérations parallèles sont exécutées quand la table externe est déclarée comme PARALLEL.
Au contraire d’une requête parallèle sur une table externe le degré de parallélisme de remplissage
parallèle est contraint par le nombre des fichiers concurrents qui peuvent être écrits par le driver
d’accès.
Ainsi comme illustré dans le diagramme il n’y a jamais plus d’un seul serveur d’exécution parallèle
qui écrit dans un fichier en simultané.
Le nombre des fichiers dans la clause LOCATION doit correspondre aux degrés spécifie de
parallélisme car chaque processeur serveur d’I/O demande un fichier qui lui est propre. Tout fichier
supplémentaire est ignores.
Cet exemple montre comment l’opération de remplissage de table externe peut aider à exporter
d’une manière sélective des enregistrements qui résultent d’une jointure entre les tables EMPLOYEES
et DEPARTEMENTS.
L’exemple illustre comment, tous les employés qui travaillent dans les départements « Marketing »
et « Achats » peuvent être déchargés en parallèle.
On présume que le répertoire EXT_DIR a déjà été créé.
Dans la majorité des cas le driver d’accès « Oracle_datapump » utilise les mêmes paramètres que
le driver d’accès « Oracle_loader ».
Oracle 10g permet de marquer une table externe comme REFERENCED ou ALL en fonction de vos
besoins.
SELECT count(order_id)
FROM order_items_ext
;
SELECT count(line_id)
FROM order_items_ext
;
La projection des colonnes REFERENCED est utile uniquement pour des raisons de performance car
seules certaines colonnes seront interprétées (parse) et converties.
Si vous êtes sûr que les données sont correctes, alors l’option REFERENCED donnera de meilleurs
résultats si un sous-ensemble des colonnes est sélectionné et fournira toujours le même résultat.
Il est possible de vérifier l’état de vos tables externes en regardant dans les nouvelles colonnes
PROPETY de la vue DBA_EXTERNAL_TABLES ; la valeur par défaut pour PROPETY de la vue
DBA_EXTERNAL_TABLES est « project all column ».
SELECT property
FROM DBA_EXTERNAL_TABLES
WHERE table_name = ‘OWNER_ITEMS_EXT’
;
Vous pouvez utiliser les vue matérialisées pour fournir des copies locales de données distantes à
vos utilisateurs ou pour stocker des données dupliquées dans la même base de données.
Une vue matérialisée se fonde sur une requête qui utilise un lien de base de données appelé
DATABASE LINK, pour sélectionner des données dans une base distante.
Ces vues peuvent être implémentées en lecture (READ-ONLY) ou en écriture (UPDATABLE).
Il est également possible de les indexer.
Selon la complexité de la requête qui définie une vue matérialisée, il est possible d’utiliser un
journal de vue matérialisée (Matérialized View Log) afin d’optimiser les performances des
opérations de réplication.
Les vues matérialisées peuvent être utilisées dans les Datawarehouses afin d’améliorer les
performances en étant utilisées comme objet d’agrégat.
Ces vues sont alors utilisées par l’optimiseur Oracle (CBO) pour établir le plan d’exécution des
requêtes.
Il est également possible de créer des vues matérialisées partitionnées et baser ces vues sur des
tables partitionnées.
Dans notre exemple la vue est rafraichie chaque fois qu’une transaction est validée dans la table
« maître » (COMMIT).
Cette vue est remplie lors de sa création (BUILD IMMEDIATE) et le chargement des données
s’effectue en parallèle (PARALLEL).
La commande ALTER MATERIALIZED VUE permet de modifier les paramètres de stockage de la vue.
Cependant ces caractéristiques n’étaient pas supportées dans les Vues Matérialisées (MV) utilisant
des jointures (MJV).
La base Oracle 10g supporte maintenant le rafraîchissement rapide pour les MJV à condition que :
Si la MJV a des instances multiples de la table dans la clause FROM, des colonnes ROWID pour
chaque instance doivent être présentes dans la liste SELECT de la MV, et le log MV doit contenir la
colonne ROWID.
Si la MJV a des vues référencées dans la clause FROM, la base Oracle 10g doit être capable
d’effectuer une fusion complète des vues (Complete View Merging). Après la fusion, la MV doit
satisfaire toutes les conditions nécessaires pour le rafraîchissement rapide. En particulier, la liste
SELECT de la MV doit contenir des colonnes ROWID pour toutes les tables présentes dans la clause
FROM de la MV. Aussi, les logs MV sont requis pour toutes les tables de la base, et elles doivent
contenir la colonne ROWID.
Si la MJV contient des tables distantes dans la clause FROM, toutes ces tables doivent être localisées
sur le même site. Attention, la commande ON COMMIT n’est plus supportée avec les MV de tables
distantes. Les logs MV doivent être présents sur le site distant pour chaque table de la MV, et les
colonnes ROWID doivent être présentes dans la liste SELECT de la MV.