Sol-Oracle: Base de Données
Sol-Oracle: Base de Données
Introduction :
Une base de données est un ensemble organisé d'informations. Pour gérer une base de
données, il faut un système de gestion de bases de données (SGBD).
Un SGBD est un programme qui permet de stocker, d'extraire et de modifier des données à la
demande dans la base de données. Il existe cinq types principaux de bases de données :
Hiérarchique, réseau, relationnel, relationnel objet et objet.
Ensemble d'opérateurs agissant sur les relations afin de produire d'autres relations
1. Une ligne unique ou tuple indiquant toutes les données concernant un employé particulier.
Chaque ligne de la table doit être identifiée par une clé primaire, ce qui permet d'éviter les
doublons. L'ordre des lignes n'a pas d'importance; il peut être spécifié lors de l'extraction, des
données.
2. Une colonne ou attribut contenant le matricule des employés, est la clé primaire. Le matricule
identifie un employé unique dans la table EMP. La colonne clé primaire doit obligatoirement
être renseignée.
3. Une colonne ne contient pas de valeur clé. Dans une table, une colonne représente un type de
données.
4. La clé étrangère. Une clé étrangère est une colonne qui définit la manière dont les tables sont
liées entre elles. Elle fait référence à une clé primaire ou à une clé unique d'une autre table.
Dans l'exemple, DEPTNO identifie de façon unique un département de la table DEPT.
5. Un champ se situe à l'intersection d'une ligne et d'une colonne. Il ne peut contenir qu'une seule
valeur.
1
6. Un champ peut ne contenir aucune valeur. On parle alors de valeur NULL. Dans la table EMP,
seules les lignes des employés ayant le statut de vendeur contiennent une valeur dans le champ
COMM (commission).
Dans une base de données relationnelle, il est inutile d'indiquer le chemin d'accès aux tables
ni de connaître l'agencement physique des données.
Pur accéder à la base de données, vous exécutez un ordre du langage SQL (Structured Query
Language) qui est le langage standard ANSI des bases de données relationnelles. Il comprend un
grand nombre d'opérateurs qui permettent de partitionner et combiner les relations. La base de
données peut être modifiée au moyen d'ordre SQL.
Oracle offre un SGBDR flexible, Oracle Server. Ce système permet de stocker et gérer des
données, avec tous les avantages que procure une structure relationnelle combinée à PL/SQL,
moteur permettant de stocker et d'exécuter des unités de programme.
Oracle Server permet aux utilisateurs des accès optimisés aux données. Il inclut des fonctions
de sécurité qui contrôlent les accès à la base de données et son utilisation. Il comprend aussi des
mécanismes de verrouillage qui assurent la cohérence et la protection des données.
Les applications Oracle peuvent être exécutées sur le même ordinateur qu' Oracle Server.
2
Mais il est également possible d'exécuter les applications sur un ordinateur local et Oracle Server
sur un autre système (architecture client serveur). Un tel environnement client serveur peut faire
appel à de nombreuses ressources de traitement. Par exemple, une application de réservation de
billets d'avion peut tourner sur un PC client, avec accès aux données de vol gérées par un système
Oracle Server sur ordinateur central.
Oracle 8
Oracle 8 Server est la première base de données objet développée par Oracle. Les fonctions
de modélisation des données d'Oracle7 Server ont été étendues pour prendre en charge le nouveau
modèle de base de données relationnelle objet.
Oracle8 Server fonctionne avec un nouveau moteur permettant la programmation orientée
objet, les types de données et les objets de gestion complexes, ainsi qu'une compatibilité totale avec
le monde relationnel.
Oracle 8 Server offre de nombreuses améliorations par rapport à Oracle7 Server. Notamment,
il inclut de nombreuses fonctions destinées à augmenter les performances et fonctionnalités des
applications de traitement transactionnel en ligne (OLTP) comme, par exemple, un meilleur partage
des structures de données lors de l'exécution, des buffers et des caches de taille supérieure, et des
contraintes dont il est désormais possible de différer la vérification.
Les applications de data Warehouse vont bénéficier d'améliorations telles que l'exécution en
parallèle des opérations d'insertion, de mise à jour et de suppression, le partitionnement et
l'optimisation des requêtes en parallèle. Parce qu'il fonctionne dans le cadre de l'architecture NCA
(Network Computing Architecture), Oracle8 Server est compatible avec les applications client
serveur et Internet distribuées et multi niveaux.
Oracle8 Server accepte des dizaines de milliers d'utilisateurs simultanés, prend en charge
jusqu'à 512 péta octets et peut manipuler n'importe quel type de données (texte, spatial, image, son,
image vidéo, série chronologique, mais aussi des données structurées traditionnelles)
Les nouvelles versions 8i et 9i ont apportées beaucoup d'améliorations à ce niveau et surtout
au niveau ouverture vers Internet.
3
données stockées dans la base Oracle. Cependant, dans le cadre de programmes d'application, il
arrive souvent que vous accédiez à la base de données sans utiliser directement SQL ou PL/SQL :
vous vous contentez de cliquer sur un bouton ou de cocher une case par exemple, mais en fait, les
applications utilisent implicitement SQL ou PL/SQL lorsqu'elles exécutent la requête.
SQL* PIus est un outil Oracle qui reconnaît les ordres SQL et PL/SQL et en lance l'exécution
à partir du serveur. Il a son propre langage de commande.
Ordre Description
SELECT Extraction des données de la base de données.
INSERT Respectivement, ajout, modification et suppression de lignes
UPDATE dans les tables de la base de données. L'ensemble est appelé
DELETE langage de manipulation des données (LMD).
En suivant les règles et indications simples ci-dessous, vous pourrez créer des ordres
corrects, simples à lire et à éditer.
Sauf indication contraire, les ordres SQL peuvent être écrits indifféremment en majuscules
ou en minuscules.
Les ordres SQL peuvent être saisis sur plusieurs lignes.
Les mots-clés ne doivent pas être scindés sur deux lignes différentes, ni abrégés.
Les clauses se placent généralement sur des lignes distinctes pour en faciliter la lecture et
l'édition.
L'utilisation de tabulations et d'indentations permet une meilleure lisibilité.
Généralement, les mots-clés sont saisis en majuscules, et tous les autres termes, tels que les
noms de tables et de colonnes, sont saisis en minuscules.
Dans le SQL*Plus, un ordre SQL est saisi au prompt SQL, et les lignes qui suivent sont
numérotées. C'est ce qu'on appelle le buffer SQL. Il ne peut y avoir qu'un seul ordre courant à la
fois dans le buffer.
5
du mot-clé SELECT. Par exemple, l'ordre SQL suivant affiche toutes les colonnes et toutes les
lignes
LOC DEPTNO
-------------------------------------------------------
NEWYORK 10
DALLAS 20
CHICAGO 30
BOSTON 4
Expressions Arithmétiques
Si nécessaire, vous pouvez modifier l'affichage des données, effectuer des calculs ou étudier
différentes hypothèses au moyen d'expressions arithmétiques. Une expression arithmétique peut
contenir des noms de colonnes, des valeurs numériques constantes et des opérateurs arithmétiques.
Opérateurs Arithmétiques
Ce paragraphe présente les opérateurs arithmétiques disponibles dans SQL. Vous pouvez les
utiliser dans n'importe quelle clause d'un ordre SQL, excepté dans la clause FROM.
Les opérateurs disponibles sont : *, /, +, -
6
Lorsqu'une valeur NULL est utilisée dans une expression arithmétique, le résultat de cette
expression est NULL. Si vous essayez de diviser par zéro, vous obtenez une erreur. En revanche, si
vous divisez un nombre par NULL, le résultat sera NULL ou inconnu.
Exemple :
Sélect ename as name,sal salary
From Emp;
L'Opérateur de Concaténation
L'opérateur de concaténation (||) permet de concaténer des colonnes à d'autres colonnes, à des
expressions arithmétiques ou à des valeurs constantes afin de créer une expression caractère.
Les colonnes situées de part et d'autre de l'opérateur se combinent pour donner une colonne
unique lors de la restitution des données.
7
MONTHLY
----------------------------------------------------------------------------------------------------------------------------
14 rows selected.
SQL et SQL*Plus
SQL est un langage de commande qui permet de communiquer avec Oracle Server quels que
soient l'outil ou l'application utilisés. Le SQL d'Oracle comprend de nombreuses extensions.
SQL*Plus est un outil Oracle possédant son propre langage de commande qui reconnaît les
ordres SQL et les envoie à Oracle Server pour qu'ils soient exécutés. Lorsque vous saisissez
un ordre SQL, celui-ci est stocké dans un espace mémoire appelé buffer SQL où il reste
jusqu'à la saisie d'un nouvel ordre.
Caractéristiques de SQL
Peut être employé par de nombreux utilisateurs, y compris ceux ayant peu ou pas d'expérience
de programmation
Caractéristiques de SQL*Plus
8
Formate les résultats des requêtes dans des états élémentaires
SQL SQL*Plus
Langage de communication avec Oracle Reconnaît les ordres SQL et les envoie au
Server pour accéder aux données serveur
Basé sur le SQL standard ANSI (American Interface propriétaire Oracle pour l'exécution
National Standards Institute) des ordres SQL
Manipule les données et les définitions de Les commandes SQL*Plus ne permettent pas
tables dans la base de données \a manipulation de valeurs dans la base de
données
Est entré dans le buffer SQL sur une ou Entrée des lignes une par une, pas de stockage
plusieurs dans le buffer SQL
lignes
Ne comporte pas de caractère de continuation Le tiret (-) est utilisé comme caractère de
continuation lorsque la commande fait plus
d'une ligne
Ne peut être abrégé Peut être abrégé
Comporte un caractère de fin pour l'exécution Ne nécessite pas de caractère de fin ; les
immédiate des commandes commandes sont immédiatement exécutées
Utilise des fonctions pour effectuer les Utilise des commandes pour formater les
formatages données
9
Commande Description
SAV[E] filename [.ext] Sauvegarde dans un fichier le contenu actuel du buffer
[REP[LACE]APP[END]] SQL. APPEND ajoute le contenu à un fichier existant ;
REPLACE écrase un fichier existant. L'extension par
défaut est .sql.
GET filename [.ext] Charge le contenu d'un fichier déjà sauvegardé dans le
buffer SQL. Par défaut, l'extension du fichier est .sql.
STA[RT]y;/e/îawe [.ext] Exécute un fichier de commandes déjà sauvegardé.
@ filename Exécute un fichier de commandes déjà sauvegardé
(identique à START).
ED[IT] Appelle l'éditeur et sauvegarde le contenu du buffer
dans un fichier nommé afîedt.buf.
ED[IT] [fîlename[.ext]] Appelle l'éditeur et édite le contenu d'un fichier déjà
sauvegardé.
SPO[OL] [fîlename[.ext]| OFF| Stocke les résultats de requêtes dans un fichier. OFF
OUT] ferme le fichier spool. OUT ferme le fichier spool et
envoie les résultats du fichier à l'imprimante du
système.
EXIT Quitte SQL*Plus.
Vous pouvez limiter le nombre de lignes ramenées par la requête au moyen de la clause
WHERE. La clause WHERE permet de spécifier une condition à satisfaire. Elle se place
immédiatement après la clause FROM
Syntaxe :
La clause WHERE peut comparer des valeurs dans des colonnes, des littéraux, des expressions
arithmétiques ou des fonctions. Elle se compose de trois éléments :
Nom de colonne
Opérateur de comparaison
Nom de colonne, constante ou liste de valeurs
Opérateurs de Comparaison
Ces opérateurs de comparaison s'utilisent dans les conditions qui comparent deux
expressions. Dans la clause WHERE, ils s'utilisent de la façon suivante:
Syntaxe
... WHERE expr operator value
Exemples
BETWEEN ... AND ... : Compris entre ... et... (bornes comprises)
IN(liste) : Correspond à une valeur dans la liste
LIKE : Ressemblance partielle de chaînes de caractère
IS NULL : Correspond à une valeur NUL l
Opérateurs Logiques : AND , OR NOT
La Clause ORDER BY
Les lignes trouvées par une requête sont ramenées dans un ordre quelconque. La clause
ORDER BY sert à trier les ligne. Si vous l'utilisez, vous devez la placer en dernier dans l'ordre
SELECT. Vous pouvez spécifier une expression ou un alias sur lesquels le tri sera effectué.
Syntaxe
SELECT expr
FROM table
[WHERE condition (s)]
[ORDER BY {column, expr} [ASC | DESC]];
11
Où : ORDER BY précise l'ordre d'affichage des lignes trouvées.
ASC classe les lignes en ordre croissant. C'est l'ordre par défaut.
DESC classe les lignes en ordre décroissant.
Si la clause ORDER BY n'est pas utilisée, l'ordre de tri est indéfini et il peut arriver que Oracle
n'extraie pas deux fois de suite les lignes d'une même requête dans un ordre identique. Pour afficher
les lignes dans un ordre spécifique, il faut spécifier une clause ORDER BY.
Lorsque vous écrivez un ordre SELECT pour joindre des tables, il est recommandé, par souci
de clarté et de facilité d'accès, de placer le nom de la table avant le nom de la colonne.
Lorsque le même nom de colonne apparaît dans plusieurs tables, il doit obligatoirement être
préfixé par le nom de la table.
Pour joindre n tables entre elles, il faut au minimum (n-1) conditions de jointure. C’est
pourquoi, par exemple, trois jointures au moins sont nécessaires pour lier quatre tables. Cette
règle ne s'applique pas si votre table contient une clé primaire concaténée, auquel cas il faut
plus d'une colonne pour permettre d'identifier chaque ligne de manière unique.
Produit Cartésien
Lorsqu'une condition de jointure est incorrecte ou tout simplement omise, on obtient un
produit cartésien dans lequel sont affichées toutes les combinaisons de lignes. Toutes les lignes de
la première table sont jointes à toutes les lignes de la seconde.
Un produit cartésien fournit en général un nombre important de lignes, donnant un résultat
rarement exploitable. C'est pourquoi il faut toujours inclure une condition de jointure correcte
dans une clause WHERE, à moins que vous n'ayez réellement besoin de combiner toutes les
lignes de toutes les tables.
Types de Jointures
II existe deux principaux types de conditions de jointure :
12
Les équijointures
Les non-équijointures
Les autres méthodes de jointures sont les suivantes :
Jointures externes
Autojointures
Les opérateurs ensemblistes
Equijointures
Pour déterminer le département auquel appartient un employé, vous devez comparer les
valeurs de la colonne DEPTNO de la table EMP avec les valeurs de la colonne DEPTNO de la table
DEPT. La relation établie entre les tables EMP et DEPT est une équijointurc : les valeurs de la
colonne DEPTNO appartenant aux deux tables doivent être identiques. Ce type de relation fait
souvent appel aux clés primaires et étrangères.
Remarque : les équijointures sont aussi appelées jointures simples ou jointures internes.
Alias de Table
La qualification des noms de colonne à l'aide des noms de table peut prendre beaucoup de
temps, en particulier si les noms de table sont longs. Vous pouvez substituer des alias de table aux
noms de table. De la même manière qu’un alias de colonne renomme une colonne, un alias de table
donne un nouveau nom à une table. Les alias de table permettent ainsi de réduire le volume du code
13
SQL et donc, de gagner de la place en mémoire.
Notez la manière dont les alias de table sont identifiés dans la clause FROM de l'exemple. Le
nom de la table spécifié en entier est suivi d'un espace puis de l'alias de table. E est l'alias de la table
EMP, et D l'alias de la table DEPT.
Conseils
Bien qu'un alias de table puisse compter jusqu'à 30 caractères, il est préférable qu'il soit le plus
court possible.
Lorsqu'un alias de table est substitué à un nom de table dans la clause FROM, cette substitution
doit s'opérer dans la totalité de l'ordre SELECT.
Choisissez de préférence des alias "parlants".
Un alias de table ne s'applique que dans l'ordre SELECT courant.
Non-Equijointures
La relation entre la table EMP et la table SALGRADE est une non-équijointure car aucune
colonne de la table EMP ne correspond directement à une colonne de la table SALGRADE. La
relation existant entre les deux tables est la suivante : les valeurs de la colonne SAL de la table
EMP sont comprises entre celles des colonnes LOSAL et HISAL de la table SALGRADE. Il faut
donc utiliser un autre opérateur que le signe égal (=) pour effectuer une jointure.
Exemple : Select e.ename, e.sal, s.grade
From Emp e, Salgrade s
Where e.sal between s.losal and hisal;
14
Liaison d'une Table à Elle-même
II se peut que vous ayez besoin de relier une table à elle-même. Ici, pour retrouver le nom du
manager de chaque employé, il faut que la table EMP soit reliée à elle-même. Par exemple,
pour retrouver le nom du manager de l'employé Blake, vous devez :
Trouver Blake dans la table EMP en cherchant dans la colonne ENAME
Trouver le matricule du manager de Blake en cherchant dans la colonne MGR.
Trouver le nom du manager dont le matricule est 7839 dans la colonne EMPNO, puis regarder
le nom correspondant dans la colonne ENAME. Le matricule 7839 appartient à King, donc King
est le manager de Blake.
Dans ce processus, vous utilisez la même table deux l'ois : la première, pour rechercher le
nom de Blake dans la colonne ENAME et la valeur correspondante dans la colonne MRG ; la
seconde, pour rechercher le matricule 7839 dans la colonne EMPNO et le nom correspondant
(King) dans la colonne ENAME.
Exemple :
Les fonctions représentent une caractéristique très puissante de SQL et sont utilisées pour :
Effectuer des calculs sur des données
Transformer des données
Effectuer des calculs sur des groupes de lignes
Formater des dates et des nombres pour l'affichage
Convertir des types de données de colonnes
Les fonctions SQL acceptent les arguments et ramènent des valeurs.
Il existe deux types de fonctions :
Les fonctions mono-ligne
Les fonctions multi-ligne
Fonctions Mono-Ligne
Ces fonctions agissent sur une seule ligne à la fois et ramènent un seul résultat. Il existe
plusieurs types de fonctions mono-ligne. Ce chapitre décrit les quatre suivantes :
Caractère
Numérique
Date
Conversion
Fonctions Multi-Lignc
Ces fonctions manipulent des groupes de lignes et ramènent un seul résultat par groupe de
lignes
Fonctions caractère
15
Les fonctions mono-ligne caractère acceptent des données caractère en entrée et ramènent
des données caractère ou numériques. Les fonctions caractère se divisent en deux groupes :
Les fonctions de conversion majuscules/minuscules
Les fonctions de manipulation des caractères
Fonction Modification
LO'WER(column|expression) Convertit les caractères alphabétiques en minuscules.
UPPER(COLUMN | expression) Convertit les caractères alphabétiques en majuscules.
INITCAP(column |expression) Convertit l'initiale de chaque mot en majuscule et les caractères
suivants
CONCAT(column1|expression1, en minuscules.
Concatène la première chaîne de caractère à la seconde. Equivaut
column2\expression2) à
l'opérateur de concaténation (||).
SUBS'TR(column\expression,m[,n]) Extrait une partie de la chaîne de caractères en commençant au
caractère situé à la position m et sur une longueur de n caractères.
Si m est une valeur négative, le décompte s'effectue dans le sens
inverse (à partir du dernier caractère de la chaîne).
Si n est omis, tous les caractères jusqu'à la fin de la chaîne sont
ramenés.
LENGTH(COLUMN| expression) Ramène le nombre de caractères d'une chaîne de caractères.
INSTR(COLUMN | expression, m) Ramène une valeur égale à la position du caractère m.
LPAD(co!umn\expression, n, Complète une chaîne de caractère sur la gauche avec la chaîne
'string ') 'string' pour parvenir à une longueur totale de n caractères.
Exemple :
SQL> SELECT ' The job title for ' || INITCAP (ename) || ' is '
2 || LOWER (JOB) as " EMPLOYEE DETAILS"
3 FROM emp;
SQL> SELECT ename, CONCAT (ename, job) , LENGTH (ename) , INSTR (ename , 'A' )
2 FROM ename
3 WHERE SUBSTR ( ename , 1, 1) = 'N' ;
Fonctions numériques
Les fonctions numériques utilisent et ramènent des valeurs numériques.
Fonction Modification
16
ROUND(column\expression. N) Arrondit la valeur de la colonne ou de l'expression à une
précision de 10 '".
Si n est positif, le nombre sera arrondi à n décimales.
Si n est omis, il n'y aura pas de décimale.
Si n est négatif, l'arrondi portera sur la partie du nombre
située à gauche de la virgule (dizaine, centaine...)
T'RUNC(column\expression,n) Tronque la valeur de la colonne ou de l'expression à une
précision de 10 -".
Si n est positif, le nombre sera tronqué à n décimales.
Si n est omis, il n'y aura pas de décimale.
Si n est négatif, ce sera la partie du nombre située à gauche
de la virgule (dizaine, centaine...) qui sera tronquée.
MOD(m,n) Ramène le reste de la division de m par n.
SYSDATE
SYSDATE est une fonction date qui permet d'obtenir la date et l'heure courante. SYSDATE s'utilise
de la même façon qu'un nom de colonne quelconque. Il est usuel d'interroger la table "factice"
DUAL.
DUAL
La table DUAL appartient à l'utilisateur SYS, mais tous les utilisateurs peuvent y accéder.
Elle contient une seule colonne, DUMMY, et une seule ligne contenant la valeur X. La table DUAL
est utile lorsque vous souhaitez ramener une valeur une seule fois, par exemple, la valeur d'une
constante, d'une pseudo-colonne ou d'une expression qui ne dépend pas d'une table de données
utilisateur.
Exemple
Afficher la date courante au moyen de la table DUAL.
SQL> SELECT SYSDATE
2 FROM DUAL;
date + nombre de jours Date Ajoute un certain nombre de jours à une date
date - nombre de jours Date Soustrait un certain nombre de jours d'une date
17
date - date Nombre Soustrait une date d'une autre
de jours
date + (nombre d'heures)/ Date Ajoute un certain nombre d'heures à une date
24
Fonctions Date
Les fonctions date s'appliquent aux données de type DATE. Toutes les fonctions date
ramènent une valeur de type DATE, à l'exception de MONTHS_BETWEEN qui ramène une valeur
numérique.
MONTHS_BETWEEN (date l, date 2) : Donne le nombre de mois situés entre une date (date l)
et une autre date (date2). Le résultat peut être positif ou négatif. Si date l est postérieure à date2,
le résultat est positif; si date l est antérieure à date l, le résultat est négatif. La partie non entière
du résultat représente une portion de mois.
ADD_MONTHS (date, n) : Ajoute un nombre n de mois à une date. n doit être un nombre entier
et peut être négatif.
NEXT_DAY (date, 'char') : Fournit la date de la première occurrence du jour spécifié ('char')
après la date fournie, char peut être, soit un numéro de jour de semaine, soit une chaîne de
caractères.
LAST_DAY(date) : Indique la date du dernier jour du mois auquel appartient la date indiquée.
ROUND (date[, ‘fmt’]) : Ramène la date, arrondie à l'unité précisée par le modèle de format
fmt. Lorsque fmt est omis, la date est arrondie au jour le plus proche.
TRUNC(date[, ‘fmt’]) : Ramène la date, tronquée à l'unité précisée par le modèle de format fmt.
Lorsque fmt est omis, la date est tronquée au jour.
Exemple :
Pour tous les employés ayant moins de 200 mois d'ancienneté, affichez les données suivantes: le
matricule, la date d'embauche, le nombre de mois d'ancienneté, la date correspondant à la révision
de salaire après 6 mois, le premier vendredi suivant la date d'embauche et le dernier jour du mois
d'embauche.
SQL> SELECT empno, hiredate,
2 MONTHS_BETWEEN(SYSDATE, hiredate) TENURE,
3 ADD_MONTHS(hiredate, 6) REVIEW,
4 NEXT_DAY(hiredate, 'FRIDAY'), LAST_DAY(hiredate)
5 FROM emp
6 WHERE MONTHS_BETWEEN (SYSDATE, hiredate)<200;
Les fonctions ROUND et TRUNC peuvent être utilisées avec des valeurs de type numérique ou
date. Utilisées avec des dates, ces fonctions arrondissent ou tronquent au modèle de format spécifié.
Vous pouvez par conséquent arrondir les dates au premier jour du mois ou de l'année les plus
proches.
Exemple
Afficher les dates d'embauche de tous les employés ayant commencé en 1987. Affichez le
matricule, la date d'embauche et le mois de début d'activité en utilisant les fonctions ROUND et
TRUNC.
18
SQL> SELECT empno, hiredate,
2 ROUND(hiredate, 'MONTH'), TRUNC(hiredate, 'MONTH')
3 FROM emp
4 WHERE hiredate like '%87';
Fonctions de Conversion
II est possible d'utiliser des types de données ANSI, DB2 et SQL/DS, en plus des types de données
Oracle, pour définir les colonnes d'une table dans une base de données Oracle8.
Toutefois, Oracle Server convertit en interne ces types de données en types de données Oracle8.
Dans certains cas, Oracle peut accepter des données d'un type différent de celui normalement
attendu, sous réserve qu'Oracle Server puisse effectuer une conversion automatique de ces données.
Cette conversion de types de données est réalisée, soit de manière implicite par Oracle Server, soit
de manière explicite par l'utilisateur.
Les conversions implicites de types de données fonctionnent selon des règles que nous allons
expliquer dans les deux diapositives suivantes.
Les conversions explicites des types de données se font au moyen des fonctions de conversion, qui
convertissent une valeur d'un type de données en un autre type. En principe, le format de la fonction
suit la convention datatype TO datatype, le premier datatype étant le type de données d'entrée, le
second datatype étant le type de données restitué.
Remarque : Bien que la conversion implicite des types de données soit possible, il est recommandé
d'effectuer des conversions explicites afin d'assurer une meilleure efficacité des ordres SQL.
SQL offre trois fonctions pour convertir une valeur d'un certain type de données dans autre type.
Fonction Résultat
TO_CHAR(numher|date, ['fmt']) Convertit un nombre ou une date en une
chaîne de caractères de type VARCHAR2 et
de format fmt.
TO_NUMBER(char) Convertit une chaîne de caractères en
un nombre.
TO_DATE(char,['fmt']) Convertit une chaîne de caractères
représentant une date au format fmt en
une date Oracle. Lorsque fmt est omis, le
format est DD-MON-YY.
Conseils
Le modèle de format doit être placé entre simples quotes et différencie les majuscules et
minuscules.
19
Il peut comprendre tout élément valide de format date. N'oubliez pas de séparer la date et le
modèle de format par une virgule.
Les noms de jours et de mois sont automatiquement complétés par des espaces.
Pour supprimer les espaces de remplissage ou les zéros de tête, utilisez ['élément f m. fm signifie
fill mode, ou mode de remplissage.
Elément Description
SCC ou CC Siècle; le S fait précéder les dates av. J.C. d'un signe -
YYYY ou SYYYY Année; le S fait précéder les dates av. J.C. d'un signe -
YYY ou YY ou Y Les 3, 2 ou 1 derniers chiffres de l'année
Y,YYY Année avec une virgule insérée
IYYY, IYY, IY, 1 Les 4, 3, 2 ou 1 derniers chiffres de l'année (norme ISO)
SYEAR ou YEAR Année en toutes lettres ; le S fait précéder les dates av. J.C. d'un signe -
BC ou AD Respectivement, av. JC ou apr. JC
B.C. ou A.D. Respectivement, av. J.C. ou apr. J.C.
Q Numéro du trimestre
MM Mois exprimé avec 2 chiffres
MONTH Mois en toutes lettres complété par des blancs à concurrence de 9
caractères
MON 3 premières lettres du nom du mois
RM Numéro du mois en chiffres romains
WW ou W Numéro de la semaine dans l'année ou le mois
DDD ou DD ou D Numéro du jour dans l'année, le mois ou la semaine
DAY Nom du jour exprimé en toutes lettres et complété par des blancs à
concurrence de 9 caractères
DY 3 premières lettres du nom du jour
J Jour du calendrier Julien . nombre de jours depuis le 31 décembre 4713
av.J.C
20
Pour pouvoir afficher des valeurs numériques sous la forme de chaînes de caractères, il
convient de convertir ces nombres en données de type caractère avec la fonction TO_CHAR, qui
transforme une valeur de type NUMBER en un type VARCHAR2. Cette technique est très utile
pour la concaténation.
Exemple
Afficher le nom et la date d'embauché de tous les employés entrés le "February 22, 198l".
La fonction NVL
Pour transformer une valeur NULL en une valeur réelle, on utilise la fonction NVL.
Syntaxe
NVL (exprl, expr2)
où : exprl est l'expression ou la valeur source susceptible de contenir une valeur NULL
expr2 est la valeur de remplacement pour la valeur NULL
La fonction NVL permet de convertir n'importe quel type de données, mais toutefois, la valeur de
remplacement doit être de même type que la valeur de l'expression exprl. Pour calculer la
21
rémunération annuelle de chaque employé, il faut multiplier son salaire mensuel par 12 puis ajouter
la commission au résultat obtenu.
La Fonction DECODE
La fonction DECODE permet de décoder les expressions de la même manière que l'ordre
logique IF-THEN-ELSE utilisé dans de nombreux langages. Elle décode l'expression après l'avoir
comparée à chacune des valeurs de recherche {search). Si l'expression est identique à search, le
résultat (result) est ramené.
Si la valeur par défaut (default) est omise, on obtient une valeur NULL chaque fois que
la colonne ou expression ne correspond à aucune valeur search.
Syntaxe :
Fonctions de Groupe
Contrairement aux fonctions mono-ligne, les fonctions de groupe agissent sur des groupes de
lignes et donnent un résultat par groupe. Un groupe peut être une table entière ou un ensemble de
lignes d'une table.
Chaque fonction accepte un argument. La table suivante présente les différentes options de syntaxe
possibles.
Fonction Description
AVG([DISTINCT|ALL]n) Valeur moyenne de n, en ignorant les valeurs NULL
COUNT({*|[DISTINCT|ALL]expr} ) Nombre de lignes, où expr est différent de NULL. Le
caractère * comptabilise toutes les lignes sélectionnées y
compris les doublons et les lignes NULL
MAX([DISTINCT|ALL]expr) Valeur maximale de expr, en ignorant les valeurs NUL
MIN([DISTINCT|ALL]expr) Valeur minimale de expr, en ignorant les valeurs NULL
STDDEV([DISTINCT|ALL]x) Ecart standard de n, en ignorant les valeurs NULL
SUM([DISTINCT|ALL]n) Somme des valeurs de n, en ignorant les valeurs NULL
VARIANCE([DISTINCT|ALL]n) Variance de n, en ignorant les valeurs NULL
Si expr est spécifié, les différents types de données possibles pour les arguments sont CHAR,
VARCHAR2, NUMBER ou DATE
Toutes les fonctions de groupe, à l'exception de COUNT(*), ignorent les valeurs NULL. Pour
substituer une valeur à une valeur NULL, utilisez la fonction NVL. Vous pouvez utiliser les
22
fonctions AVG, SUM, MIN et MAX avec des colonnes de données numériques. Vous pouvez
utiliser les fonctions MAX et MIN pour tous les types de données
Groupes de Données
Il est parfois nécessaire de diviser les informations d'une table en groupes plus petits. Pour
cela, il faut utiliser la clause GROUP BY.
Vous pouvez utiliser la clause GROUP BY pour diviser une table en groupes de lignes. Vous
pouvez alors utiliser les fonctions de groupe pour effectuer des calculs statistiques sur chaque
groupe.
Syntaxe :
SELECT expr
FROM table
[WHERE condition (s)]
[Group by group_by_expression]
[ORDER BY {colunrn, expr} [ASC|DESC]];
groupe_by_expression spécifie les colonnes dont les valeurs déterminant les différents groupes
Conseils
Lorsque vous intégrez une fonction de groupe dans une clause SELECT, vous ne pouvez pas en
même temps sélectionner des résultats individuels, à moins que la colonne individuelle ne soit
mentionnée dans la clause GROUP BY. Si vous omettez de spécifier un de ces colonnes, un
message d'erreur s'affichera.
Avec la clause WHERE, vous pouvez exclure des lignes avant de créer des groupes.
Vous devez inclure les "column" de la liste SELECT dans la clause GROUP BY.
Vous ne pouvez pas utiliser l'alias de colonne dans la clause GROUP BY.
Par défaut, les lignes sont triées dans l'ordre croissant des colonnes incluses dans la liste
GROUP BY. Vous pouvez changer cet ordre en utilisant la clause ORDER BY.
Exemple :
Sous-groupes
II est parfois nécessaire d'obtenir des résultats pour des sous-groupes de lignes.
Note :
Lorsque vous utilisez la clause GROUP BY, pensez à inclure dans cette clause toutes les
colonnes de la liste SELECT qui ne figurent pas dans les fonctions de groupe.
23
Exclusion de Groupes
De la même manière que vous utilisez la clause WHERE pour limiter les lignes que vous
sélectionnez, vous pouvez utiliser la clause HAVING pour restreindre des groupes.
La Clause HAVING
Utilisez la clause HAVING pour indiquer les groupes que vous souhaitez afficher.
Syntaxe :
SELECT expr
FROM table
[WHERE condition (s)]
[Group by group_by_expression]
[Having group_condition]
[ORDER BY {column, expr} [ASC|DESC]];
où group_condition limite les groupes de lignes ramenés aux groupes pour lesquels la
condition spécifiée est VRAIE
Oracle Server opère de la manière suivante avec la clause HAVING :
Les lignes sont groupées.
La fonction de groupe s'applique au groupe.
Les groupes qui correspondent aux critères de la clause HAVING sont affichés.
Opérateurs Ensemblistes ;
Les opérateurs ensemblistes combinent les résultats de deux ou plusieurs requêtes en un seul résultat.
Une requête composée est une requête contenant des opérateurs ensemblistes.
L'opérateur Ramène
INTERSECT Toutes les lignes communes aux deux requêtes. INTERSECT
combine les deux requêtes et ramène les lignes du premier
ordre SELECT identiques aux lignes du second ordre
SELECT.
UNION Toutes les lignes distinctes ramenées par les deux requêtes.
UNION ALL Toutes les lignes sélectionnées par les deux requêtes, y
compris les doublons.
MINUS Toutes les lignes sélectionnées par le premier ordre SELECT
moins les lignes sélectionnées dans le second ordre SELECT.
Tous les opérateurs ensemblistes ont la même priorité. Si un ordre SQL en contient plusieurs,
la base de données les évalue de gauche à droite ou de haut en bas, si aucune parenthèse
n'indique explicitement un autre ordre. Pour être conforme aux nouvelles normes SQL, la
prochaine version de la base de données accordera une priorité plus importante à l'opérateur
INTERSECT qu'aux autres opérateurs ensemblistes. Vous devez donc indiquer explicitement
24
par des parenthèses l'ordre d'exécution des requêtes contenant l'opérateur INTERSECT et
d'autres opérateurs ensemblistes.
L'Opérateur UNION
Cet opérateur combine le résultat de deux requêtes. Il permet de ramener toutes les lignes
issues de plusieurs requêtes et d'éliminer les doublons.
Instructions
Le nombre de colonnes et les types de données des colonnes doivent être identiques dans les
deux ordres SELECT. En revanche, les noms de colonnes peuvent être différents.
L'opérateur UNION intervient sur toutes les colonnes sélectionnées.
Les colonnes NULL sont ignorées lors du contrôle des doublons.
L'opérateur IN a une priorité plus élevée que l'opérateur UNION.
Les requêtes incluant l'opérateur UNION dans la clause WHERE doivent comprendre le même
nombre de colonnes et des colonnes du même type que celles de la clause SELECT.
Par défaut, les données sont affichées par ordre
Règles
Contrairement à l'opérateur UNION, les doublons ne sont pas éliminés et le résultat n'est pas trié
par défaut.
Il n'est pas possible d'utiliser le mot-clé DISTINCT.
Remarque : Les règles relatives aux opérateurs UNION et UNION ALL sont les mêmes, excepté
les deux points ci-dessus.
L'OPÉRATEUR INTERSECT
Cet opérateur permet de ramener toutes les lignes communes aux deux requêtes.
Le nombre de colonnes et les types de données des deux colonnes doivent être identiques dans
les deux ordres SELECT. En revanche, tes noms de colonnes peuvent être différents.
L'inversion de l'ordre des tables interrogées ne modifie pas le résultat.
Comme l'opérateur UNION, l'opérateur INTERSECT ignore les colonnes NULL.
Les requêtes incluant l'opérateur INTERSECT dans la clause WHERE doivent comprendre le
même nombre et des colonnes du même type que celles de la clause SELECT
L'opérateur MINUS
Cet opérateur ramène les lignes retournées par la première requête, qui ne le sont pas par la
seconde (premier ordre SELECT moins le second).
Le nombre de colonnes et les types de données des colonnes doivent être identiques dans
les deux ordres SELECT. En revanche, les noms de colonnes peuvent être différents.
Toutes les colonnes incluses dans la clause WHERE doivent également être incluses dans
la clause SELECT pour que la requête de l'opérateur MINUS puisse être exécutée.
Les requêtes incluant l'opérateur MINUS dans la clause WHERE doivent comprendre le
même nombre de colonnes et des colonnes GU même type que celles de la clause
SELECT.
25
LES SOUS-INTERROGATIONS
Sous interrogations
Une sous interrogation est un ordre SELECT imbriqué dans une clause d'un autre ordre
SELECT. Les sous interrogations vous permettent de construire des ordres puissants à partir
d'instructions toutes simples. Elles s'avèrent très utiles pour sélectionner des lignes d'une table
lorsqu'une condition dépend des données de la table elle-même.
Vous pouvez placer une sous interrogation dans les clauses SQL suivantes :
WHERE
HAVING
FROM
Syntaxe :
Select select_list
From table
Where expr operator (select select-list from table);
Remarque : les opérateurs de comparaison se classent en deux catégories : les opérateurs mono-
ligne (>. =. >-. <. <>, <=) et les opérateurs multi-ligne (IN, ANY, ALL).
Une sous interrogation est souvent désignée sous le nom "d'ordre SELECT imbriqué", "sous- ordre
SELECT", ou encore "ordre SELECT interne". Elle est exécutée en premier, et son résultat sert à
évaluer la condition définie dans l'interrogation principale ou externe.
Exemple :
26
SQL> SELECT ename, job
2 FROM emp
3 WHERE job =
4 (SELECT job
5 FROM emp
6 WHERE empno = 7369);
Sous-Interrogations Synchronisées
Une Sous-Interrogation Synchronisée est une sous-interrogation imbriquée qui est exécutée
une seule fois pour chaque ligne traitée par la requête principale et qui, pendant son exécution,
utilise une valeur d'une colonne de la requête externe.
27
Syntaxe :
L'Opérateur EXISTS
Avec des ordres SELECT imbriqués, tous les opérateurs logiques sont valides. De plus, vous
pouvez recourir à l'opérateur EXISTS. Cet opérateur est souvent utilisé dans les Sous-
Interrogations Synchronisées, car il permet de tester s'il existe une valeur. Si la valeur existe, il
retourne la valeur TRUE (vrai) ; sinon, il retourne la valeur FALSE (faux). De la même façon,
l'opérateur NOT EXISTS garantit qu'il n'existe aucune valeur. Cet opérateur garantit que la
recherche dans la requête interne ne se poursuivra pas s'il existe au moins une correspondance entre
un responsable et des numéros d'employés.
Exemple :
Remarques :
Dans le cas d'un ordre UPDATE, une sous-interrogation synchronisée permet de mettre à jour
les lignes d'une table basée sur des lignes d'une autre table.
Avec un ordre DELETE, une Sous-Interrogation Synchronisée permet de ne supprimer que les
lignes existant également dans une autre table
28
Syntaxe :
INSERT INTO table[(column [, column ...])]
VALUES (value [, value ...]);
table nom de la table
column nom de la colonne dans la table à remplir
value valeur qui figurera dans la colonne
Remarque : lorsque cet ordre est utilisé avec la clause VALUES, il n'insère qu'une seule ligne à la
fois.
Etant donné que vous pouvez insérer une nouvelle ligne en précisant une valeur pour chaque
colonne, il n'est pas obligatoire de lister les colonnes dans la clause INSERT. Dans ce cas, les
valeurs doivent être fournies dans l'ordre par défaut des colonnes dans la table
Méthode Description
Implicite Omettez la colonne dans la liste
Explicite Spécifiez le mot-clé NULL dans la liste VALUES
Vous pouvez aussi spécifier une chaîne vide (' ') dans la liste VALUES,
mais uniquement pour les chaînes de caractères et les dates
Assurez-vous que la colonne cible admet les valeurs NULL en vérifiant l'état NULL? Au
moyen de la commande SQL*Plus DESCRIBE. Oracle Server applique automatiquement toutes les
contraintes applicables aux types de données, aux intervalles de données et à l'intégrité. Si une
colonne n'est pas explicitement spécifiée dans la liste, elle reçoit automatiquement une valeur
NULL dans la nouvelle ligne.
Syntaxe
INSERT INTO table [ column (,column) ]
subquery;
Modification de Lignes
Vous pouvez modifier des lignes existantes au moyen de l'ordre UPDATE. Dans la syntaxe
présentée ci-dessus.
UPDATE table
SET column= value [, column = value]
[WHERE condition]
29
table est le nom de la table
Column est le nom de la colonne à modifier dans la table
value est la nouvelle valeur qui figurera dans la colonne, ou une sous-
interrogation fournissant cette valeur
condition identifie les lignes à mettre à jour. Se compose de noms de colonne,
d'expressions, de constantes, de sous-interrogations et d'opérateurs de
comparaison.
Il est possible d'utiliser des sous-interrogations multi-colonne dans la clause SET d'un ordre
UPDATE.
Syntaxe
UPDATE table
SET (column, column, ...) =
(SELECT column, column,
FROM table WHERE condition)
WHERE condition;
Suppression de Lignes
Vous pouvez supprimer des lignes existantes au moyen de l'ordre DELETE.
Syntaxe :
DELETE [FROM] table
[WHERE condition];
30
Comme un ordre LDD ou LCD est automatiquement validé, il termine implicitement une
transaction.
Etat Circonstances
Commit automatique Exécution d'un ordre du LDD ou du LCD
Sortie normale de SQL* Plus, sans précision d'un ordre
COMMIT ou RDI.I.RACK explicite
Rollback automatique Fin anormale de SQL*Plus ou panne du système
31
Annulation des Modifications
Vous pouvez annuler toutes les modifications de données en instance au moyen de l'ordre
ROLLBACK. Après l'exécution d'un ordre ROLLBACK :
Les modifications apportées aux données sont annulées.
Les données sont retrouvent leur état précédent.
Les lignes verrouillées sont libérées
Lecture Cohérente
On peut accéder à une base de données de deux manières différentes :
En lecture (ordre SELECT)
En écriture (ordres INSERT, UPDATE, DELETE)
Le principe de lecture cohérente a les effets suivants :
L'utilisateur qui lit la base de données et celui qui y écrit ont une vue cohérente des données
Les utilisateurs qui accèdent en lecture ne peuvent pas voir les données en cours de modification
Les utilisateurs qui accèdent en écriture sont sûrs que leurs modifications seront cohérentes
Les modifications effectuées par un utilisateur ne peuvent pas interrompre ou gêner les
modifications en cours d'un autre utilisateur
L'objectif de la lecture cohérente est de garantir que chaque utilisateur voit les données telles
qu'elles se présentaient lors de la dernière validation, c'est-à-dire avant le démarrage d'une opération
du LMD.
32
Les verrous sont des mécanismes qui empêchent les destructions dues aux interactions entre
des transactions qui accèdent à la même ressource, qu'il s'agisse d'un objet utilisateur (comme des
tables ou des lignes), ou d'objets système non visibles par les utilisateurs (tels que des structures de
données partagées et des lignes du dictionnaire de données).
33
sera étudié dans les prochains chapitres. Les ordres du LDD représentent un sous-ensemble des
ordres SQL utilisés pour créer, modifier ou supprimer des structures de données OracleS. Ils
agissent directement sur la base de données, et enregistrent des informations dans le dictionnaire de
données.
Pour créer une table, l'utilisateur doit disposer du privilège CREATE TABLE et d'un espace
de stockage dans laquelle il pourra créer des objets. L'administrateur de base de données utilise des
ordres du LCD (langage de contrôle des données) pour accorder des privilèges aux utilisateurs ;
Syntaxe :
CREATE TABLE [schema.]table
(column datatype [DEFAULT exp],...);
Types de Données
34
BFILE Données binaires, stockées dans un fichier externe ; jusqu'à 4
giga- octets.
Syntaxe :
CREATE TABLE table[(column,...)]
AS subquery;
Conseils
La table est créée avec les noms de colonnes spécifiés, puis remplie avec les lignes extraites au
moyen de l'ordre SELECT.
La définition des colonnes ne peut contenir que le nom de la colonne et la valeur par défaut.
Si des colonnes sont spécifiées, leur nombre doit être le même que celui de la sous-
interrogation SELECT.
Si aucune colonne n'est spécifiée, elles seront du même nom que celles de la sous- interrogation.
Ordre ALTER TABLE
Après avoir créé vos tables, il peut arriver que vous deviez en modifier la structure pour
ajouter une colonne oubliée ou que vous décidiez de changer une définition de colonne. Cela est
possible grâce à l'ordre ALTER TABLE.
Vous pouvez ajouter des colonnes à une table en utilisant l'ordre ALTER TABLE avec la
clause ADD.
Syntaxe :
ALTER TABLE table
ADD (column datatype [DEFAULT expr][, column datatype] ...);
Vous pouvez modifier des colonnes existantes d'une table au moyen de l'ordre ALTER TABLE
avec la clause MODIFY.
Remarque : si une table contient déjà des lignes lorsque l'on ajoute une colonne, la nouvelle
colonne sera initialisée à NULL pour toutes les lignes sauf si l'on précise une valeur par défaut,
35
dans ce cas pour toutes les lignes de la table, la colonne sera initialisée avec la valeur par défaut.
Modification de Colonnes
Vous pouvez modifier la définition d'une colonne au moyen de l'ordre ALTER TABLE et de
la clause MODIFY. Les modifications effectuées peuvent être des modifications du type de
données, de taille et de la valeur par défaut.
Conseils
Vous pouvez augmenter la largeur ou la précision d'une colonne numérique.
Réduisez la largeur d'une colonne si celle-ci ne contient que des valeurs NULL ou si la table ne
contient aucune ligne.
Modifiez le type de données si la colonne contient des valeurs NULL ou si la table est vide.
Convertissez une colonne de type CHAR en type clé données VARCHAR2 ou inversement,
si la colonne contient des valeurs NULL, si vous ne réduises pas sa (aille ou si la table est
vide.
La modification d'une valeur par défaut ne s'appliquera qu'aux insertions ultérieures.
Suppression de Tables
L'ordre DROP TABLE supprime la définition d'une table Oracle8. Lorsque vous supprimez
une table, la base de données perd toutes les données de la table ainsi que tous les index associés.
Syntaxe
DROP TABLE table;
Une fois exécuté, l'ordre DROP TABLE est irréversible. Oracle ne demande pas
confirmation lorsque vous lancez cet ordre. Si vous êtes le propriétaire de la table ou disposez
d'un niveau de privilège élevé, la table sera immédiatement supprimée. Tous les ordres du LDD
effectuent une validation qui rend la transaction permanente.
L'ordre RENAME est un ordre du LDD qui permet de renommer une table, une vue, une
séquence ou un synonyme.
Syntaxe
RENAME o.ld_name TO new_name;
où : old_name est l'ancien nom de la table, de la vue, de la séquence ou du synonyme
new_ name est le nouveau nom de la table, de la vue, de la séquence ou du synonyme
Vous devez être propriétaire de l'objet que vous renommez.
36
Vider une Table
TRUNCATE TABLE est un autre ordre LDD, qui permet de supprimer toutes les lignes
d'une table tout en libérant l'espace utilisé pour stocker cette table. L'ordre TRUNCATE
TABLE ne peut être annulé.
Syntaxe
TRUNCATE TABLE table;
où : table est le nom de la table
Vous devez être propriétaire de la table ou disposer du privilège système DELETE TABLE
pour tronquer une table.
L'ordre DELETE supprime aussi les lignes d'une table, mais il ne libère pas l'espace de
stockage
Les Contraintes
Oracle fait appel à des contraintes pour empêcher l'entrée de données incorrectes dans des
tables.
Vous pouvez utiliser des contraintes pour :
Appliquer des règles au niveau d'une table chaque fois qu'une ligne est insérée, mise à jour ou
supprimée dans cette table. La contrainte doit être satisfaite pour que l'opération réussisse.
Empêcher la suppression d'une table si il y a des dépendances avec d'autres tables.
Fournir des règles pour des outils Oracle comme Developer 2000.
Contrainte Description
NOTNULL Spécifie que cette colonne ne doit pas contenir de valeur null
UNIQUE Spécifie une colonne ou une combinaison de colonnes dont les
valeurs doivent être uniques pour toutes les lignes de la table
PRIMARY KEY Identifie chaque ligne de la table de manière unique
FOREIGN KEY Etablit et contrôle une relation de clé étrangère entre la
colonne et une colonne de la table référencée
CHECK Spécifie une condition qui doit être vraie
37
La contrainte NOT NULL
La contrainte NOT NULL interdit la présence de valeurs NULL dans la colonne à laquelle
elle s'applique. Par défaut, les colonnes qui ne sont pas associées à la contrainte NOT NULL
peuvent contenir des valeurs NULL.
Exemple :
... deptno MUMBER (7,2)
CONSTRAINT emp_deptno_nn NOT NULL;
Exemple :
Remarque : Oracle Server contrôle la contrainte UNIQUE en créant implicitement un index unique
sur la clé.
Exemple :
... Constraint dept_deptno_pk PRIMARY KEY(deptno)
Remarque : un index UNIQUE est automatiquement créé pour une colonne PRIMARY KEY.
La clé étrangère est définie dans la table détail et la table contenant la colonne référencée est
la table maître. Pour définir la clé étrangère, on utilise une combinaison des mots-clés suivants :
FOREIGN KEY définit une colonne de la table détail dans une contrainte de niveau table.
REFERENCES identifie la table et la colonne dans la table maître.
ON DELETE CASCADE indique que si une ligne est supprimée de la table maître, les lignes
dépendantes de la table détail seront également supprimées.
En l'absence de l'option ON DELETE CASCADE, la ligne de la table maître ne peut pas être
supprimée si elle est référencée dans la table détail.
La contrainte CHECK
La contrainte CHECK définit une condition que chaque ligne doit obligatoirement satisfaire.
La condition peut utiliser les mêmes constructions que les conditions d'une requête, aux exceptions
près suivantes :
Références aux pseudo-colonnes CURRVAL, NEXTVAL, LEVEL et ROWNUM
Appels aux fonctions SYSDATE, UID, USER et USERENV
Requêtes faisant référence à d'autres valeurs dans d'autres lignes
Plusieurs contraintes CHECK peuvent être définies sur la même colonne. Le nombre de
contraintes CHECK pouvant être associées à une colonne est illimité.
Vous pouvez ajouter des contraintes dans une table existante en utilisant l'ordre ALTER
TABLE avec la clause ADD.
Syntaxe :
ALTER TABLE table
ADD [CONSTRAINT constraint] type (column) :
Syntaxe
ALTER TABLE table DROP PRIMARY KEY | UNIQUE (column) \
CONSTRAINT constraint [CASCADE];
où : table représente le nom de la table
column représente le nom de la colonne concernée par la contrainte
constraint représente le nom de la contrainte
Lorsque vous supprimez une contrainte d'intégrité, elle n'est plus contrôlée par Oracle et
n'existe plus dans le dictionnaire de données.
39
Vous pouvez désactiver une contrainte sans la supprimer (ce qui évite d'avoir à la recréer) en
utilisant l'ordre ALTER TABLE avec la clause DISABLE.
Syntaxe
ALTER TABLE table DISABLE CONSTRAINT constraint [CASCADE] ;
où : table représente le nom de la table
constraint représente le nom de la contrainte
Conseils
Vous pouvez utiliser la clause DISABLE aussi bien dans l'ordre CREATE TABLE que
ALTER TABLE.
La clause CASCADE désactive des contraintes d'intégrité dépendantes.
Syntaxe
ALTER TABLE table ENABLE CONSTRAINT constraint;
où : table représente le nom de la table
constraint représente le nom de la contrainte
Conseils
Si vous activez une contrainte, celle-ci s'applique à toutes les données de la table. Les
données de la table doivent donc toutes respecter la contrainte.
Si vous activez une contrainte UNIQUE ou PR1MARY K.EY, un index unique est
automatiquement créé.
Vous pouvez utiliser la clause ENABLE aussi bien dans l'ordre CREATE TABLE que
ALTER TABLE.
Vérification des Contraintes
Une fois que vous avez créé une table, vous pouvez en contrôler l'existence en exécutant la
commande DESCRIBE. Cependant, la seule contrainte que vous pouvez vérifier de cette manière
est NOT NULL. Si vous voulez afficher toutes les contraintes de votre table, interrogez la table
USER_CONSTRAINTS.
Remarque : les contraintes qui ne sont pas explicitement nommées par le propriétaire de la table se
voient attribuer un nom par le système. Dans la colonne décrivant le type de contrainte, la lettre C
signifie CHECK, P représente PR1MARY KEY, R intégrité référentielle et U UNIQUE. A noter
que la contrainte NULL est en réalité une contrainte CHECK.
Vous pouvez afficher le nom des colonnes associées à des contraintes en interrogeant la vue
USER_CONS_COLUMNS du dictionnaire de données. Cette vue est particulièrement utile pour les
contraintes ayant un nom attribué par le système.
40
vue est basée sont appelées tables de base. Une vue est stockée dans le dictionnaire de données,
comme un ordre SELECT.
41
constraint nom attribué à la contrainte CHECK OPTION.
WITH READ ONLY garantit qu'aucune opération LMD ne peut être exécutée dans la vue.
Vous pouvez exécuter des opérations LMD sur les données d'une vue, sous réserve de
respecter certaines règles.
Vous ne pouvez pas supprimer une ligne d'une vue si elle contient l'un des éléments
suivants :
Fonctions de groupe
Clause GROUP BY
Mot-clé DISTINCT
Vous ne pouvez pas modifier les données d'une vue qui contient une des conditions
mentionnées précédemment et un des éléments suivants :
Colonnes définies par des expressions. Exemple : SALARY * 12
Colonne ROWNUM
Vous ne pouvez pas ajouter de données dans une vue si elle contient un des éléments ci-
dessus et s'il existe dans la table de base des colonnes NOT NULL sans valeur par défaut qui ne
sont pas sélectionnées par la vue. Toutes les valeurs obligatoires doivent figurer dans la vue.
N'oubliez pas que vous ajoutez des valeurs directement dans la table sous-jacente par le biais d'une
vue.
42
un message d'erreur s'affiche avec le nom de la contrainte, si ce dernier a été précisé.
update empvu20
*
ERROR at line 1:
Remarque : Aucune ligne n'est mise à jour si le numéro du département est modifié (10), car la vue
ne pourra plus afficher cet employé. Avec la clause WITH CHECK OPTION, la vue ne peut
afficher que les employés du département 20 et n'autorise pas la modification du numéro de
département de ces employés au travers de la vue.
Un grand nombre d'applications exigent l'utilisation de numéros uniques pour les valeurs de
la clé primaire. Vous pouvez créer un code dans l'application pour répondre à cette exigence ou
générer des numéros uniques à l'aide d'une séquence.
Si vous souhaitez améliorer les performances de certaines requêtes, vous devez créer un
index. Les index permettent également de contrôler l'unicité d'une colonne ou d'un groupe de
colonnes.
43
Vous pouvez attribuer d'autres noms aux objets en utilisant des synonymes.
44
La pseudocolonne NEXTVAL permet d'extraire des numéros successifs à partir de la
séquence indiquée. Vous devez désigner NEXTVAL avec le nom de la séquence. Lorsque vous
référencez séquence.NEXTVAL, un nouveau numéro de séquence est généré et CURRVAL reçoit le
numéro de séquence actuel.
La pseudocolonne CURRVAL fait référence au numéro de séquence que l'utilisateur vient de
générer. NEXTVAL doit générer un numéro de séquence dans la session actuelle de l'utilisateur
pour que CURRVAL puisse être référencée. Vous devez désigner CURRVAL avec le nom de la
séquence. Lorsque vous référencez séquence.CURRVAL, la dernière valeur retournée pour cette
session utilisateur s'affiche.
Exemple:
45
sont mises en mémoire cache, elles seront perdues en cas de panne du système.
Comme les séquences ne sont pas directement liées aux tables, la même séquence peut être
utilisée pour plusieurs tables. Dans ce cas, chaque table peut contenir des intervalles entre les
numéros de séquence.
Syntaxe
ALTER SEQUENCE séquence [INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
où ; séquence représente le nom du générateur de séquences
Règles
Pour modifier une séquence, vous devez en être le propriétaire ou avoir le privilège ALTER.
L'ordre ALTER SEQUENCE ne modifie que les numéros de séquence à venir.
L'option START WITH ne peut pas être modifiée à l'aide de l'ordre ALTER SEQUENCE. Si
vous voulez que la séquence commence par un autre numéro, vous devez la supprimer puis la
recréer.
Une validation est exécutée. Par exemple, il n'est pas possible d'imposer une nouvelle valeur
maximale (MAXVALUE) qui soit inférieure au numéro de séquence actuel.
Syntaxe
DROP SEQUENCE séquence;
où : séquence représente le nom du générateur de séquences
46
Remarque : Lorsque vous supprimez une table, les index correspondants sont également
supprimés.
47
index, vous devez en être le propriétaire ou avoir le privilège DROP ANY INDEX.
Dans la syntaxe :
DROP INDEX index
index représente le nom de l'index.
Privilèges
Un privilège donne le droit d'exécuter certains ordres SQL. L'administrateur de base de
données est un utilisateur de haut niveau qui est habilité à autoriser les utilisateurs à accéder à la
base de données et à ses objets. Les utilisateurs doivent obtenir des privilèges système pour pouvoir
accéder à la base de données, et des privilèges objets pour pouvoir manipuler le contenu des objets
de la base de données. Ils peuvent aussi avoir reçu le droit d'accorder des privilèges supplémentaires
à d'autres utilisateurs ou à des rôles, qui sont des regroupements de privilèges.
Schéma
Un schéma est une collection d'objets, tels que des tables, des vues et des séquences. Un
schéma appartient à un utilisateur de la base de données et porte le même nom que ce dernier.
Privilèges Système
II existe plus de 100 privilèges système destinés aux utilisateurs et aux rôles. En général, ces
privilèges sont accordés par l'administrateur de base de données.
48
Privilège système Opérations autorisées
CREATE USER Permet au bénéficiaire de créer d'autres utilisateurs
Oracle (privilège obligatoire pour le rôle d'administrateur
de base de données)
DROP USER Supprime un utilisateur
Privilèges Objet
Un privilège objet est un droit qui permet d'exécuter une action donnée sur une table, une
vue, une séquence, une procédure, une fonction ou un package spécifique. A chaque objet
correspond un ensemble de privilèges qui peut être accordé. Le tableau ci-dessus donne la liste des
privilèges associés à chaque objet. A noter que SELECT et ALTER sont les seuls privilèges qui
49
s'appliquent à une séquence. Les privilèges UPDATE, REFERENCES et INSERT peuvent être
limités, et ne s'appliquer qu'à une ou plusieurs colonnes. Il est possible
de limiter le privilège SELECT en créant une vue avec un sous-ensemble de colonnes et en
attribuant le privilège SELECT à la vue. Une autorisation associée à un synonyme peut être
convertie en une autorisation sur la table de base à laquelle le synonyme fait référence.
Règles
Pour accorder des privilèges sur un objet, il doit se trouver dans votre propre schéma ou les
privilèges objet doivent vous avoir été accordés avec le mot-clé WITH GRANT OPTION.
Le propriétaire d'un objet peut accorder un privilège lié à cet objet à un autre utilisateur ou à un
rôle de la base de données.
Le propriétaire d'un objet acquiert automatiquement tous les privilèges de l'objet.
Remarque : Si un privilège est accordé avec le mot-clé WITH GRANT OPTION à un utilisateur,
50
ce dernier peut également accorder ce privilège de façon à former une chaîne de bénéficiaires, mais
les octrois circulaires ne sont pas autorisés. Si le propriétaire retire un privilège à un utilisateur qui a
accordé le même privilège à d'autres utilisateurs, l'ordre REVOKE s'applique en cascade à tous les
utilisateurs ayant reçu ce privilège. Par exemple, si l'utilisateur A accorde à l'utilisateur B le
privilège SELECT dans une table en incluant le mot-clé WITH GRANT OPTION, l'utilisateur B
peut accorder à l'utilisateur C le même privilège avec le même mot-clé, et l'utilisateur C peut
également accorder ce privilège et ce mot-clé à l'utilisateur D. Si l'utilisateur A retire le privilège à
l'utilisateur B, le même privilège sera également retiré aux utilisateurs C et D.
51