SQL Module2
SQL Module2
Module n°2
Techniques de récupération des
données
PSBDMF!
Programme de Formation de Supinfo
Pour afficher des données issues de plusieurs tables, il faut utiliser une condition appelée jointure.
Une condition de jointure spécifie une relation existante entre les données d'une colonne dans une table avec
les données d'une autre colonne dans une table. Cette relation est souvent établie entre des colonnes définies
comme clé primaire et clé étrangère.
Figure 1 : Relation entre les valeurs contenues dans la colonne (clé étrangère) DEPTNO de la table EMP
et la colonne (clé primaire) DEPTNO de la table DEPT
- Equi-jointure (equijoin)
- Non equi-jointure (non-equijoin)
- Jointure externe (outer join)
- Auto jointure (self join)
Le produit cartésien génère un grand nombre d’enregistrements dont le résultat est rarement très utile.
Une équi-jointure est utilisée pour afficher des données provenant de plusieurs tables lorsqu’une valeur dans
une colonne d’une table correspond directement à une valeur d’une autre colonne dans une autre table (cf.
figure 3).
Les noms des colonnes doivent être qualifiés avec le nom de la table ou l’alias de la table à laquelle elles
appartiennent afin d’éviter toute ambiguïté.
Figure 3 : La clé étrangère de la table EMP est liée à la clé primaire de la table DEPT
Exemple :
Æ La requête affiche, pour chaque employé, son numéro (emp.empno), son nom
(emp.ename), son numéro de département (emp.deptno et dept.deptno) et la localisation du
département (dept.loc). La colonne DEPTNO de la table EMP est reliée à la colonne DEPTNO
de la table DEPT. Pour chaque numéro de département de la colonne DEPTNO de la table
EMP, la requête cherche la localisation correspondante dans la table DEPT.
Des conditions peuvent être ajoutées à la condition de jointure afin de restreindre les enregistrements.
Exemple :
1 row selected.
Pour alléger la requête, il est conseillé d’utiliser des alias pour les noms de table.
Remarques : les alias de table peuvent être utilisés pour améliorer les performances. En effet, ils
raccourcissent le code SQL et utilisent donc moins de mémoire. (Le gain de performance est surtout visible sur
les grosses requêtes).
Pour joindre n tables ensemble, au moins (n – 1) conditions de jointure sont nécessaires. Donc pour joindre
trois tables, deux conditions de jointures doivent être écrites :
Cette règle ne s’applique pas si une table possède une clé primaire concaténée (constituée de plusieurs
colonnes). Dans ce cas, plus d’une colonne sont nécessaires pour identifier de manière unique chaque
enregistrement.
Figure 5 : la colonne CUSTID de la table CUSTOMER est reliée à la colonne CUSTID de la table ORD, la
colonne ORDID de la table ORD est reliée à la colonne ORID de la table ITEM
Exemple :
3 rows selected.
Æ Cette requête affiche les orders, les numéros d’item, le total de chaque item et le total de
chaque order pour le customer TKB SPORT SHOP.
La ligne 3 de la requête correspond à la jointure des tables CUSTOMER et ORDER.
La ligne 4 de la requête correspond à la jointure des tables ORDER et ITEM.
La ligne 5 est une condition qui vise à restreindre le résultat des deux jointures au customer
portant le nom TKB SPORT SHOP.
Une condition de non équi-jointure est utilisée lorsque deux tables n’ont pas de colonnes qui correspondent
directement.
Il s’agit de la même syntaxe que pour la condition équi-jointure (cf 1.2.1).
Æ Cette requête cherche la tranche de salaires de chaque employé. Or il n’existe pas de clé
étrangère dans la table EMP faisant référence aux tranches de salaires de la table
SALGRADE. Pour trouver la tranche de salaires de chaque employé, la requête va comparer
les salaires des employés avec les limites de chaque tranche de salaires de la table
SALGRADE. Cette relation est une non equi-jointure (ligne 3 de la requête).
Chaque employé n’apparaît qu’une seule fois dans le résultat de la requête. Il y a deux
raisons à cela :
- Aucunes limites des tranches de salaires dans la table SALGRADE ne se chevauchent.
Donc le salaire d’un employé appartient au plus à une tranche.
- Aucun salaire n’est plus petit que la plus petite limite inférieure de tranche (700) et aucun
salaire n’est plus grand que la plus grande limite supérieure de tranche (9999).
D’autres opérateurs tels que <= et >= peuvent être utilisés, mais l’opérateur BETWEEN, dans cet exemple, est
plus simple à utiliser.
Une condition de jointure externe (outer join) est utilisée pour afficher tous les enregistrements incluant ceux
qui ne respectent pas la condition de jointure.
Æ Cet requête affiche tous les enregistrements de la colonne de la table 1 même si ils ne
respectent pas la condition de jointure
Æ Cette requête affiche tous les enregistrements de la colonne de la table 2 même si ils ne
respectent pas la condition de jointure
L’opérateur de jointure externe ne peut apparaître que d’un seul côté de l’expression, le côté où il manque de
l’information.
Une condition de jointure externe ne peut pas utiliser l’opérateur IN et ne peut pas être liée à une autre
condition par l’opérateur OR.
Exemple :
KING 10 ACCOUNTING
BLAKE 30 SALES
CLARK 10 ACCOUNTING
JONES 20 RESEARCH
...
ALLEN 30 SALES
TURNER 30 SALES
JAMES 30 SALES
...
14 rows selected.
Æ Cette requête affiche la liste des employés avec leur numéro et nom de département. Le
département OPERATIONS n’apparaît dans le résultat. En effet, aucun employé n’y travaille.
Æ Cette requête affiche la liste des employés avec leur numéro et nom de département. Le
département OPERATIONS apparaît cette fois dans le résultat malgré l’absence d’employé y
travaillant.
Une condition d’auto-jointure permet de faire une jointure sur deux colonnes liées appartenant à la même table.
Pour simuler deux tables dans la clause FROM, la table (table1) sur laquelle va être effectuée une auto-jointure
va posséder deux alias (table1 alias1, table1 alias2).
Exemple :
WORKER.ENAME||'WORKSFOR'||MANAG
-------------------------------
BLAKE works for KING
CLARK works for KING
JONES works for KING
MARTIN works for BLAKE
...
13 rows selected.
Æ Cette requête affiche la liste des employés avec le nom de leur manager.
Les fonctions de groupe sont utilisées pour afficher des informations sur un groupe d’enregistrements.
Les fonctions de groupe ne peuvent pas être utilisées dans les clauses FROM, WHERE et GROUP BY.
MIN( [DISTINCT | ALL] expr ) Retourne la plus petite valeur du groupe expr
MAX( [DISTINCT | ALL] expr ) Retourne la plus grande valeur du groupe expr
Toutes ces fonctions de groupes ignorent les valeurs nulles sauf COUNT(*).
Le type de données des arguments peut être CHAR, VARCHAR2, NUMBER, DATE sauf pour les fonctions
AVG, SUM, VARIANCE et STDDEV qui ne peuvent être utilisées qu’avec des données de type numérique.
Pour substituer les valeurs nulles dans un groupe, il faut utiliser la fonction single-row NVL (cf. cours SQLP "
Module 1 : Ordres SELECT Basiques" paragraphe 4.6.1 " La fonction NVL ").
Exemple 1 :
1 row selected.
Æ Cette requête retourne la moyenne des salaires, le salaire maximum, le salaire minimum et
la somme des salaires des employés dont la fonction commence par la chaîne de caractères
« SALES ».
Exemple 2 :
MIN(HIRED MAX(HIRED
--------- ---------
17-DEC-80 12-JAN-83
1 row selected.
Æ Cette requête retourne la date d’embauche la plus récente et la date d’embauche la plus
vieille.
Exemple 3 :
COUNT(*)
---------
6
1 row selected.
Æ Cette requête retourne le nombre d’enregistrements dans la table EMP dont la colonne
DEPTNO a pour valeur 30.
Exemple 4 :
COUNT(DEPTNO)
-------------
14
Æ Cette requête retourne le nombre de départements (doublons inclus) dans la table EMP.
Exemple 5 :
COUNT(DISTINCT(DEPTNO))
-----------------------
3
Exemple 6 :
AVG(COMM)
---------
550
Æ Cette requête retourne la moyenne des commissions touchées par les employés. Le calcul
de la moyenne ne tient pas compte des valeurs invalides telles que les valeurs nulles.
Seulement quatre employés sont pris en compte dans le calcul, car ils sont les seuls à
posséder une commission non nulle.
Exemple 7 :
AVG(NVL(COMM,0))
----------------
157.14286
Æ Cette requête retourne la moyenne des commissions touchées par les employés en tenant
compte des valeurs nulles. En effet, la fonction NVL substitue, le temps de la requête, les
valeurs nulles par la valeur 0, ce qui permet de prendre les quatorze employés en compte
pour le calcul de la moyenne.
La clause GROUP BY permet de diviser les enregistrements d’une table en groupes. Les fonctions de groupe
peuvent être alors utilisées pour retourner les informations relatives à chaque groupe.
Quelques règles :
- La clause WHERE peut être utilisée pour pré-exclure des enregistrements avant la division en
groupes.
- Les colonnes de la clause FROM qui ne sont pas inclues dans une fonction de groupe doivent être
présentes dans la clause GROUP BY.
- Les alias de colonne ne peuvent pas être utilisés dans la clause GROUP BY.
- Par défaut, la clause GROUP BY classe les enregistrements par ordre croissant. L'ordre peut être
changé en utilisant la clause ORDER BY (cf. cours "Ordres SELECT Basiques" paragraphe 3.4.1 "La
clause ORDER BY").
Exemple :
DEPTNO AVG(SAL)
Page 15 / 41 Laboratoire Supinfo des Technologies Oracle
07/03/2003 http://www.labo-oracle.com
Techniques de récupération des données - Version 1.2
--------- ---------
10 2916.6667
20 2175
30 1566.6667
3 rows selected.
Æ Cette requête affiche la moyenne des salaires des employés pour chaque département
présent dans la table EMP.
La colonne contenue dans la clause GROUP BY n’a pas obligatoirement besoin de se trouver dans la clause
FROM.
La clause ORDER BY peut accueillir la ou les fonctions de groupe contenues dans la clause FROM.
Exemple :
DEPTNO AVG(SAL)
--------- ---------
30 1566.6667
20 2175
10 2916.6667
3 rows selected.
Æ Cette requête affiche la moyenne des salaires des employés pour chaque département
présent dans la table EMP ordonné sur la moyenne.
Plusieurs colonnes peuvent être spécifiées dans la clause GROUP BY, ce qui permet de récupérer des
informations d’un groupe intégré dans un autre groupe. (Organiser les données en sous-groupe).
Æ Les données seront organisées en groupes par rapport à la colonne column1. Puis chaque groupe
sera à nouveau organisé en sous-groupes par rapport à la colonne column2.
Exemple :
Æ Cette requête affiche la moyenne des salaires pour chaque fonction dans chaque
département.
La clause WHERE n’acceptant pas les fonctions de groupes, la restriction du résultat des fonctions de groupes
se fera dans la clause HAVING.
Comme dans les clauses WHERE et GROUP BY, les alias de colonne ne peuvent pas être utilisés dans la
clause HAVING.
La clause HAVING peut être utilisée sans la présence de fonctions de groupe dans la clause FROM.
Exemple 1 :
DEPTNO MAX(SAL)
--------- ---------
10 5000
20 3000
2 rows selected.
Æ Cette requête affiche les départements dont le salaire maximal dépasse $2900.
Exemple 2 :
JOB PAYROLL
--------- ---------
ANALYST 6000
MANAGER 8275
2 rows selected.
Æ Cette requête affiche la somme des salaires des employés supérieure à $5000 pour
chaque fonction dont les cinq premières lettres sont différentes de la chaîne de caractères
« SALES ». Le résultat est ordonné de façon descendante sur les sommes des salaires.
Toutes les colonnes ou expressions dans la clause SELECT, qui ne sont pas le résultat d'une fonction de
groupe, doivent être présentes dans la clause GROUP BY.
Exemple :
Un alias de colonne ne peut pas être utilisé dans le GROUP BY. Sinon l’erreur suivante se produit : " invalid
column name ".
La clause HAVING ne peut pas être utilisée sans la clause GROUP BY.
Une fonction de groupe ne peut pas être utilisée dans la clause WHERE.
Exemple :
Des fonctions de groupe ayant comme argument le résultat d’une fonction de groupe sont appelées fonctions
imbriquées (nesting functions).
Exemple :
MAX(AVG(SAL))
-------------
2916.6667
Æ AVG(sal) calcule la moyenne des salaires dans chaque département grâce à la clause
GROUP BY. MAX(AVG(sal)) retourne la moyenne des salaires la plus élevée.
3 LES SOUS-REQUETES
3.1 Les sous-requêtes basiques
3.1.1 Les règles de conduite des sous-requêtes
Une sous-requête est une clause SELECT imbriquée dans une clause d’un autre ordre SQL.
Une sous-requête peut être utile lorsqu’il faut sélectionner des enregistrements en utilisant une condition qui
dépend d’une valeur inconnue d’une autre colonne.
Exemple :
L’objectif est d’écrire une requête qui identifie tous les employés qui touchent un salaire plus grand que celui de
l'employé Jones, mais la valeur du salaire de cet employé n’est pas connu. Dans ce cas, il faut faire appel à
une sous-requête qui va retournée le salaire de Jones à la requête principale.
Pour combiner deux requêtes, il suffira de placer une requête à l’intérieur d’une autre. La requête à l’intérieure
(ou la sous-requête) retourne une valeur qui est utilisée par la requête extérieure (ou requête principale).
L’utilisation d’une sous-requête est équivalente à l’utilisation de deux requêtes séquentielles. Le résultat de la
première requête est la valeur recherchée dans la seconde requête.
SELECT select_list
FROM table
WHERE expression operator (
SELECT select_list
FROM table ) ;
Exemple 1 :
Règles de conduite :
- Une sous-requête doit être mise entre parenthèses.
- Une sous-requête doit être placée du côté droit de l’opérateur de comparaison.
- Une sous-requête ne possède pas de clause ORDER BY.
- Une sous-requête peut être seulement placée dans les clauses WHERE, HAVING et FROM.
Une sous-requête single-row ne peut être utilisée qu'avec les opérateurs de comparaison suivants : <, >, =, <=,
>=, <>. (cf. cours SQLP " Module 1 : Ordres SELECT Basiques" paragraphe 3.2.1 " Les opérateurs de
comparaisons ").
Exemple :
ENAME JOB
---------- ---------
JAMES CLERK
SMITH CLERK
ADAMS CLERK
MILLER CLERK
4 rows selected.
Æ Cette requête affiche les employés dont la fonction est la même que celle de l’employé
numéro 7369.
SELECT select_list
FROM table
WHERE expression single-row_comparison_operator (
SELECT select_list
FROM table )
AND expression single-row_comparison_operator (
SELECT select_list
FROM table ) ;
Exemple :
ENAME JOB
---------- ---------
MILLER CLERK
1 row selected.
Æ Cette requête affiche la liste des employés dont la fonction est la même que l’employé
numéro 7369 et dont le salaire est le même que l’employé 7876.
Des fonctions de groupes peuvent être utilisées dans une sous-requête pour opérer sur un groupe de valeurs.
(cf. dans ce cours paragraphe 2 "Les fonctions de groupe").
Placer dans la sous-requête, elles permettent de ne retourner qu’une seule valeur à la requête principale.
Exemple :
1 row selected.
Æ Cette requête affiche le nom, la fonction et le salaire des employés dont le salaire est égal
au salaire minimum. La fonction MIN ne retourne qu’une seule valeur (800).
Exemple 1 :
DEPTNO MIN(SAL)
--------- ---------
10 1300
30 950
2 rows selected.
Æ Cette requête affiche les départements qui ont un salaire minimum plus grand que le
salaire minimum du département 20.
Exemple 2 :
Æ Cette requête affiche la fonction qui a le salaire moyen le plus bas. La sous-requête ne
retourne qu’un seul enregistrement grâce aux fonctions de groupe dans la clause SELECT de
la sous-requête.
Si la sous-requête contient la clause GROUP BY, cela signifie qu’elle retourne plusieurs enregistrements
(lignes). Il faut s’assurer que la sous-requête single-row ne retournera qu’un seul enregistrement.
Exemple :
ERROR:
ORA-01427: single-row subquery returns more than one row
no rows selected
Æ La sous-requête retourne trois valeurs : 800, 1300 et 950. La clause WHERE contient
l’opérateur de comparaison = single-row n’acceptant qu’une seule valeur. L’opérateur ne peut
pas accepter plus d’une valeur provenant de la sous-requête, c’est pourquoi il génère une
erreur. Pour corriger la requête, il suffit de changer l’opérateur = par l’opérateur IN.
Un problème courant avec les sous-requêtes est lorsque aucune valeur n’est retournée par la sous-requête.
Exemple :
3 WHERE job =
4 (SELECT job
5 FROM emp
6 WHERE ename='SMYTHE');
no rows selected
Æ Cette requête n’affiche aucun résultat. Aucun n’employé ne s’appelle SMYTHE, donc la
sous-requête ne retourne aucune valeur. La requête principale compare le résultat de la sous-
requête (null) dans sa clause WHERE. La requête principale ne trouve aucun employé dont la
fonction est égale à null et ne retourne donc aucun enregistrement.
Une sous-requête multiple-row retourne une liste de valeurs qui seront comparées à une seule valeur dans la
requête principale.
Une sous-requête multiple-row ne peut être utilisée qu'avec les opérateurs de comparaison multiple-row : IN,
NOT IN, ANY, ALL, BETWEEN. (cf. cours SQLP " Module 1 : Ordres SELECT Basiques" paragraphe 3.2 " Les
opérateurs de comparaisons ").
Une sous-requête multiple-row ne peut pas contenir une clause ORDER BY. En effet, l’ordonnancement du
résultat de la sous-requête n’est pas nécessaire : la requête principale n’utilise pas d’index quand elle compare
la valeur avec chaque résultat de la sous-requête.
Les fonctions de groupe peuvent être utilisées dans une sous-requête multiple-row.
Exemple :
Æ Cette requête affiche les employés dont le salaire est égal au salaire minimum d’un
département. Elle est équivalente à la requête suivante :
Une sous-requête multiple-row est utilisée pour récupérer un ensemble de valeurs qui sera comparé à la valeur
dans la clause WHERE de la requête principale.
Exemple 1 :
Æ Cette requête affiche les employés dont le manager travaille dans le département n°20.
Exemple 2 :
2 rows selected.
Æ Cette requête affiche les employés dont la fonction n’est pas CLERK et dont le salaire est
plus petit que les employés dont la fonction est CLERK. Le salaire maximum qu’un employé
dont la fonction est CLERK est de $1300. La requête affiche tous les employés dont la
fonction n’est pas CLERK et dont le salaire est inférieur à $1300.
L’opérateur ANY (équivalent à l’opérateur SOME) compare une valeur à chaque valeur
retournée par la sous-requête.
< ANY signifie plus petit que le minimum.
> ANY signifie plus grand que le maximum.
= ANY est équivalent à IN.
L’opérateur NOT ne peut être utilisé avec l’opérateur ANY.
Exemple 3 :
4 rows selected.
Æ Cette requête affiche les employés dont le salaire est plus grand que la moyenne des
salaires de chaque département.. La plus grande moyenne des salaires pour chaque
département est de $2916,66. La requête principale retourne donc les employés dont le
salaire est supérieur à $2916,66.
L’opérateur ALL compare une valeur à toutes les valeurs retournées par la sous-requête.
> ALL signifie plus grand que le maximum.
< ALL signifie plus petit que le minimum.
L’opérateur NOT ne peut être utilisé avec l’opérateur ALL.
Si la sous-requête retourne une valeur nulle à la requête principale, la requête principale ne retournera pas
d’enregistrements. Pour palier à ce problème, il faut utiliser la fonction NVL.
Pour comparer deux colonnes ou plus dans une clause WHERE, il faut utiliser les opérateurs logiques.
Les colonnes spécifiées dans la requête principale doivent correspondre aux colonnes dans la sous-requête : il
doit y avoir le même nombre de colonne et les types de données doivent correspondre.
Si il n’y a pas le même nombre de colonne, il y aura une erreur, si les types ne correspondent pas, les résultats
risquent d’être faux.
La clause WHERE de la requête principale attend des valeurs issues de deux colonnes qui
seront comparées aux valeurs de column1 et column2.
La sous-requête retourne les valeurs issues de deux colonnes column3 et column4.
column1 et column3 doit être du même type de données.
column2 et column4 doit être du même type de données.
Exemple :
5 rows selected.
Æ Cette requête affiche les employés possédant la date d’embauche la plus récente pour
chaque fonction.
Une comparaison "pairwise" peut générer des résultats différents d'une comparaison non "pairwise".
no rows selected.
Æ Cette requête affiche les employés qui ont le même salaire et la même commission qu’un
des employés du département 30, mais qui ne font pas parti du département 30. La sous-
requête retourne la liste des salaires et des commissions des employés du département 30.
Les valeurs fonctionnent par couple : un salaire et une commission. La requête principale
compare les couples salaire/commission de la table des employés avec les couples retournés
par la sous-requête et retourne ceux qui correspondent. Aucun n’employé ne faisant pas parti
du département 30 n’a le même salaire et la même commission qu’un employé du
département 30.
1 rows selected.
Des sous-requêtes multiple-column peuvent être écrites dans la clause FROM. La méthode est similaire
quelque soit le type de sous-requête.
Le résultat de la sous-requête dans la clause FROM est une table virtuelle. Cette table virtuelle doit possèder
un alias de table afin d'identifier le résultat de la sous-requête.
Exemple :
8 rows selected.
Æ Cette requête affiche, pour chaque employé touchant un salaire inférieur à la moyenne des
salaires de son département, son nom, son salaire, son numéro de département et la
moyenne des salaires dans son département.
La sous-requête retourne les numéros de département et la moyenne des salaires pour
chaque département. Ces résultats sont stockés dans une table virtuelle appelée b.
Une jointure) relie la table emp et la table virtuelle b (ligne 6).
Le salaire de chaque employé est ensuite comparé au salaire moyen de son département
(salavg) obtenu dans la sous-requête.
Lorsqu’une requête est exécutée un certain nombre de fois avec des valeurs différentes à chaque fois, la
requête doit être modifiée et lancée autant de fois qu’il y a de valeurs différentes.
Les variables de substitutions serviront à saisir les valeurs de l’utilisateur à chaque lancement de la requête au
lieu de modifier manuellement les valeurs.
Les variables de substitution sont des contenants dans lesquels sont stockées temporairement des valeurs.
L’utilisation des variables de substitution active SQL*Plus à demander à l’utilisateur d’entrer une valeur qui sera
substituée à la variable correspondante.
Une variable de substitution est une variable définie et nommée par le programmeur (celui qui écrit la requête).
Le nom de variable est précédé d’un à deux ‘&’.
Une variable de substitution peut être placée d’importe où dans un ordre SQL exceptée en tant que premier
mot de l’ordre. Une variable de substitution ne peut pas remplacer une clause SELECT.
Exemple d’utilisation :
- Les variables de substitution peuvent être utilisées pour demander à l’utilisateur de saisir un mot de
passe.
- Les entêtes et pieds de page de l’état peuvent être modifiés dynamiquement. Les états peuvent
s'afficher différemment suivant les utilisateurs.
A l’aide de variable de substitution, SQL*Plus peut être utilisé pour créer des états interactifs dans un fichier
script ou dans un ordre SQL.
Si la variable n’a pas de valeur ou si elle n’existe pas encore, SQL*Plus demandera à l’utilisateur de saisir une
valeur pour cette variable à chaque fois qu’il l’a rencontrera dans un ordre SQL.
Exemple:
DNAME DEPTNO
-------------- ------------
ACCOUNTING 10
1 row selected.
La commande SET VERIFY active SQL*Plus à fournir un feedback (retour de l’information) à l’utilisateur à
propos des variables de substitution et des valeurs qui ont été saisies précédemment.
Exemple :
DNAME DEPTNO
--------------------- -------------
ACCOUNTING 10
1 row selected.
Æ Après la saisie de l’utilisateur, SQL*Plus affiche la mise à jour de la ligne dans le code
SQL, et seulement après le résultat de la requête.
Rappel : Dans une clause WHERE, les valeurs de type date et chaîne de caractères doivent être entre simples
côtes.
Cette règle s’applique également aux variables de substitution. Si la valeur qu’elle substitue est du type date ou
chaînes de caractères, la variable doit être placée entre simples côtes.
Par contre, lorsque l’utilisateur saisit la valeur, il ne doit pas mettre de simples côtes.
Syntaxe d'une variable substituant une valeur de type date ou chaîne de caractères : ‘&user_variable’
Exemple :
2 rows selected.
Æ Cette requête affiche le nom, le département et le salaire annuel des employés dont le
fonction est défini par l’utilisateur comme étant ANALYST. Dans le code SQL, la variable est
entre simples cotes puisqu’elle substitue une chaîne de caractères. Ainsi, l’utilisateur n’a pas
besoin de saisir les côtes.
On peut utiliser les fonctions UPPER et LOWER sur des variables de substitution.
Laboratoire Supinfo des Technologies Oracle Page 30 / 41
http://www.labo-oracle.com 07/03/2003
Techniques de récupération des données - Version 1.2
UPPER(‘&user_variables’)
LOWER(‘&user_variables’)
L’utilisation de ces fonctions permet de ne pas tenir compte de la casse de la valeur saisie par l’utilisateur.
Si la variable de substitution attend la saisie d’une date, elle doit être saisie au format par défaut DD-MON-YY.
Une variable de substitution peut aussi substituer un nom de colonne, une expression, un nom de table, la liste
des éléments dans une clause SELECT, une expression, la liste des éléments d'ordonnancement dans une
clause ORDER BY, une condition dans la clause WHERE ou encore du texte.
Exemples :
Æ Cette requête combine les deux variables de substitution des exemples précédents.
Æ Cette requête combine les deux variables de substitution des exemples précédents avec la
variable condition qui substitue une condition dans la clause WHERE.
SQL> SELECT *
2 FROM &table_name ;
Si une variable est précédée de deux caractères ‘&’, alors SQL*Plus ne demandera la saisie de la valeur
qu’une seule fois lors de l’exécution d’une requête.
On utilise le double ‘&’, lorsqu’une variable est utilisé plusieurs fois dans une requête.
Exemple :
Æ L’utilisateur est appelé qu’une seule fois à saisir la variable column_name qui apparaît
deux fois dans l’ordre SQL. La valeur saisie par l’utilisateur (deptno) est utilisée pour les deux
apparitions de la variable dans le code.
La valeur est stockée dans la variable jusqu’à la fin de la session ou jusqu’à ce qu’elle soit indéfinie.
Des variables peuvent être définies avant l’exécution d’un ordre SQL.
SQL*Plus fournit deux commandes pour définir et initialiser des variables : DEFINE et ACCEPT.
La commande ACCEPT lit la valeur saisie par l’utilisateur et la stocke dans une variable.
Si la commande ACCEPT est tapée en ligne de commande, la valeur de la variable sera immédiatement
demandée.
Le nom de la variable ne doit pas être précédé d’un "&" dans la commande ACCEPT.
Exemple :
SQL> SELECT *
2 FROM dept
3 WHERE dname = UPPER(‘&dept’) ;
1 row selected.
Exemple :
Æ Cette commande ACCEPT permet de cacher la valeur saisie par l’utilisateur grâce au
paramètre HIDE.
La commande DEFINE est utilisée pour créer et définir des variables utilisateur.
La commande UNDEFINE est utilisée pour effacer les variables. A la fermeture d’une session, toutes les
variables définies au cours de cette session sont effacées. Pour éviter cela, le fichier login.sql peut être modifié
pour que les variables soit recréées au démarrage (cf. dans ce cours paragraphe 4.3.1 "Les variables
systèmes et la commande SET").
Exemple 1 :
Æ La première commande DEFINE définie la variable deptname et lui attribue la valeur sale.
La deuxième commande DEFINE affiche la variable deptname, sa valeur (sales) et son type
de données (CHAR).
SQL> SELECT *
2 FROM dept
3 WHERE dname = UPPER('&deptname');
1 row selected.
Æ Cette requête affiche le département dont le nom est défini par la variable deptname dont
la valeur est sale. La variable deptname définie par la commande DEFINE s’utilise comme
n’importe quelle variable.
Exemple 2 :
On peut utiliser la commande SHOW pour afficher le statut courant d’une variable système.
Exemple :
On peut utiliser la commande SHOW ALL pour afficher le statut courant de toutes les variables systèmes.
Lors de la fermeture d’une session, tous les modifications effectuées sur les variables système sont perdus.
Pour éviter de taper à chaque ouverture de session les changements de variables, il suffit de créer un fichier
LOGIN.SQL qui contiendra les commandes SET. A chaque ouverture de session, SQL*Plus chargera le fichier
et l’exécutera. LOGIN.SQL peut aussi contenir d’autres commandes variées qui n’ont pas été décrites ci-
dessus.
SQL*Plus fournit des commandes de formatage qui permettent de configurer les formatages des états :
Les changements appliqués aux variables de formatages sont valables jusqu’à la fin de la session.
Si un alias de colonne est utilisé, les commandes de formatage se réfèreront à l’alias de colonne et non au
nom de la colonne elle-même.
Les paramètres reprendront leur valeur par défaut après l’édition de chaque rapport (après l’exécution de
chaque requête).
Si la commande est trop longue et qu’elle doit continuer sur une nouvelle ligne, la ligne courante doit se
terminer par ( - ) avant de passer à la ligne suivante.
La commande BREAK place un espace entre les enregistrements, supprime les doublons pour une colonne
donnée, saute une ligne à chaque fois qu’une valeur d’une colonne donnée change et spécifie l’endroit où
imprimer.
element peut être le nom d’une colonne, ou peut être le mot clé REPORT.
action définit l’action du break :
REPORT crée un groupe au niveau de l‘état. La clause BREAK ON REPORT spécifie une position dans l’état
où SQL*Plus positionnera les valeurs ‘grand computed'.
Exemple :
MILLER 1300
JAMES 950
MANAGER JONES 2975
CLARK 2450
BLAKE 2850
PRESIDENT KING 5000
SALESMAN ALLEN 1600
MARTIN 1250
TURNER 1500
WARD 1250
14 rows selected.
Æ Cette requête affiche la liste des employés ordonnés suivant leur fonction. La commande
BREAK permet d’afficher qu’une seule fois chaque fonction, ce qui clarifie le rapport (le
résultat de la requête).
Pour utiliser des BREAK dans une requête, cette dernière doit posséder une clause ORDER BY.
La commande de formatage TTITLE permet d’afficher des informations dans la section d’entête de chaque
page de l’état.
La commande de formatage TTITLE permet d’afficher des informations dans la section de pied de chaque
page de l’état.
Le paramètre PRINTSEC dans une commande TITLE spécifie les valeurs des paramètres de formatage pour
personnaliser les sections de l’état.
COL n
S[KIP] n Saute n lignes entre le titre et les colonnes
Tabulation de n position (peut y en avoir plusieurs dans le même ordre
TAB n
SQL*Plus)
LE[FT] text Place la chaîne de caractères text à gauche
CE[NTER] text Place la chaîne de caractères text au centre
R[IGHT] text Place la chaîne de caractères text à droite
Met la chaîne de caractères text en gras (SQL*Plus représente le texte en gras
BOLD text
en l’écrivant trois fois à la suite)
FORMAT text Formate la chaîne de caractères text
SQL> TTITLE
SQL> BTITLE
Exemple :
Confidential
14 rows selected.
(cf. cours SQLP "Module 1 : Ordres SELECT Basiques" paragraphe 2.3.5 "Les commandes SQL*Plus
manipulant les fichiers").
Les abréviations des commandes SQL*Plus et les lignes blanches entre les commandes SQL*Plus sont
acceptées dans le fichier script.
Le mot clé REM sert à marquer un commentaire dans le fichier script.
Exemple :
Créer un script qui crée un rapport affichant la fonction, le nom et le salaire des employés
dont le salaire est inférieur à $3000.
Ajouter l’entête « Employee Report » centré sur deux lignes et le pied de page
« Confidential » centré.
Renommer le nom de la colonne JOB en « Job Category » placé sur deux lignes.
Renommer le nom de la colonne ENAME en « Employee ».
Renommer le nom de la colonne SAL en « Salary » et la formater comme suit : $2,500.00.
SET PAGESIZE 37
SET LINESIZE 60
SET FEEDBACK OFF
TTITLE ‘Employee|Report’
BTITLE ‘Confidential’
BREAK ON job
COLUMN job HEADING ‘Job|Category’ FORMAT A15
COLUMN ename HEADING ‘Employee’ FORMAT A15
COLUMN sal HEADING ‘Salary’ FORAMT $99,999.99
SET PAGESIZE 24
SET LINESIZE 80
SET FEEDBACK ON
TTITLE OFF
BTITLE OFF
CLEAR BREAK
COLUMN job CLEAR
COLUMN ename CLEAR
COLUMN sal CLEAR
Job
Category Employee Salary
----------------------- ----------------------- -----------------
CLERK ADAMS $1,100.00
JAMES $ 950.00
MILLER $1,300.00
SMITH $800.00
MANAGER BLAKE $2,850.00
CLARK $2,450.00
JONES $2,975.00
SALESMAN ALLEN $1,600.00
MARTIN $1,250.00
TURNER $1,500.00
Page 39 / 41 Laboratoire Supinfo des Technologies Oracle
07/03/2003 http://www.labo-oracle.com
Techniques de récupération des données - Version 1.2
WARD $1,250.00
Confidential