iMPLéMENTATION DE BASE DE DONNéES AVEC ORACLE
iMPLéMENTATION DE BASE DE DONNéES AVEC ORACLE
iMPLéMENTATION DE BASE DE DONNéES AVEC ORACLE
Objectifs 4
I - Cours 5
1. Exercice : Gestion des intervenants I .........................................................................5
2. Introduction à Oracle .................................................................................................7
2.1. Présentation d'Oracle Database .......................................................................................................7
2.2. Particularités SQL LDD sous Oracle ..................................................................................................7
2.3. Particularités SQL LMD sous Oracle .................................................................................................8
2.4. Dictionnaire de données Oracle .......................................................................................................9
2.5. Instance et schéma Oracle ..............................................................................................................10
2.6. Bibliographie commentée sur Oracle .............................................................................................11
II - Exercice 24
1. Exercice : Dictionnaire de données .........................................................................24
2. Exercice : Employés Oracle ......................................................................................25
III - Devoir 27
1. Exercice : MediaTek I ................................................................................................27
Contenus annexes 34
Abréviations 38
Bibliographie 39
Webographie 40
Index 41
Question 1
Produisez le MLD relationnel.
Question 2
Produisez un code SQL qui fonctionne pour Oracle et pour PostgreSQL.
Question 3
Produisez un code spécialisé pour Oracle.
Question 4
Vérifier la création de vos tables dans le dictionnaire de données (existence de la table, description de la
table, et liste des contraintes).
Indice :
1 TABLE_NAME
2 ------------------------------
3 TINTERVENANT
4 TCOURS
Indice :
1 Name Null Type
2 ------------- -------- -------------
3 PKANNEE NOT NULL NUMBER(4)
4 PKNUM NOT NULL NUMBER(38)
5 TITRE VARCHAR2(255)
6 TYPE NOT NULL CHAR(2)
7 FKINTERVENANT NOT NULL VARCHAR2(255)
8 DEBUT DATE
Indice :
1 TABLE_NAME TYPE CONSTRAINT_NAME SEARCH_CONDITION
2 ------------------------------ ---- ------------------------------ ------------------
----------------
3 TCOURS C SYS_C00411567 "FKINTERVENANT" IS
NOT NULL
4 TCOURS C SYS_C00411568 pkannee>2000 and
pkannee<2100
5 TCOURS C SYS_C00411569 type='C' OR
type='TD' OR type='TP'
6 TCOURS C SYS_C00411566 "TYPE" IS NOT NULL
7 TCOURS P SYS_C00411570
8 TCOURS R SYS_C00411571
9 TINTERVENANT C SYS_C00411564 "PRENOM" IS NOT
NULL
10 TINTERVENANT P SYS_C00411565
Question 5
Initialiser la base avec les données suivantes :
Stéphane Crozat est un intervenant, poste 4287.
Il fait deux cours, Introduction et Modélisation, le 1 janvier et le 8 janvier 2001.
Indice :
1 PKANNEE P TITRE TYPE FKINTERVENANT DEBUT
2 ------- - --------------- ---- --------------- ---------
3 2001 1 Introduction C CROZAT 01-JAN-01
4 2001 2 Modélisation TD CROZAT 08-JAN-01
Question 6
Écrivez la requête SQL permettant de renvoyer pour chaque cours le jour de la semaine (lundi, mardi...) et
le numéro de la semaine (1..53).
Indice :
1 COURS DAY WEEK
2 ----- --------- ----
3 1 monday 1
4 2 monday 2
Question 7
Écrivez la requête SQL permettant de renvoyer concaténés sur seule colonne le nom, le prénom et le
poste entre parenthèse de chaque intervenant.
Indice :
1 INTERVENANT
2 -------------------------------
3 STEPHANE CROZAT (4287)
Question 8
Écrivez la requête SQL permettant de renvoyer la liste des cours avec leur type en toutes lettres : Cours,
Travaux dirigés, Travaux pratiques.
Indice :
1 COURS TYPE_LABEL
2 ----- -----------------
3 1 Cours
4 2 Travaux dirigés
Question 9
Écrivez le code SQL*Plus et la requête permettant de renvoyer toutes les informations de la table tCours
sur un minimum de caractères.
Indice :
1 A N COURS T INTERVENANT DEBUT
2 ---- - --------------- -- --------------- ---------
3 2001 1 Introduction C CROZAT 01-JAN-01
4 2001 2 Modélisation TD CROZAT 08-JAN-01
2. Introduction à Oracle
Objectifs
Utiliser un SGBD professionnel largement répandu
Expérimenter l'usage du langage SQL
Savoir créer et interroger une base de données sous Oracle
Connaître les commandes de base de SQL*Plus
Savoir utiliser le dictionnaire de données
NUMBER(e,d)
NUMBER(e,d) se comporte globalement comme un type standard DECIMAL(e,d).
Oracle accepte la déclaration DECIMAL qu'il converti en NUMBER.
VARCHAR(x) Attention
Il est obligatoire de préciser la taille maximale d'un VARCHAR sous Oracle, la syntaxe est donc
nécessairement VARCHAR(x) et jamais VARCHAR seule.
Attention
Oracle : SQL∗, page 2 et 3, pour avoir une description plus détaillée des types de données.
http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm
Rappel
Le dictionnaire des données contient la description des objets créés et maintenus par le serveur Oracle.
DESCRIBE nom_objet
Complément
Recyclebin Complément
Selon la configuration du serveur Oracle, il peut y avoir une gestion de corbeille (recyclebin) qui
maintient des objets supprimés en les renommant avec un nom préfixé de BIN$.
Pour exclure ces objets des requêtes au catalogue, ajouter une contrainte de type WHERE adéquate,
par exemple :
1 SELECT table_name, constraint_type AS type, constraint_name, search_condition
2 FROM user_constraints
3 WHERE constraint_name NOT LIKE 'BIN$%'
4 ORDER BY table_name, constraint_type
Références Complément
Rappel
Par opposition aux fonctions de calcul SQL qui s'appliquent sur toute la table pour réaliser des
agrégats (en ne renvoyant qu'une seule valeur par regroupement), les fonctions "mono-ligne" sont des
fonctions au sens classique, qui s'appliquent à une ou plusieurs valeurs et renvoient une valeur en
retour.
Les fonctions "mono-ligne" :
Manipulent des éléments de données
Acceptent des arguments en entrée et retournent des valeurs en sortie
Agissent sur chaque ligne
Retournent un seul résultat par ligne
Exemple
Traitement de chaîne
CONCAT, SUBSTR, LENGTH, INSRT, LPAD, TRIM
LOWER, UPPER, INITCAP
Traitement de date
MONTHS_BETWEEN, ADD_MONTHS, NEXT_DAY, LAST_DAY
SELECT sysdate FROM dual
Opérations mathématiques sur les dates : SELECT sysdate + 10 FROM dual
Traitement numérique
ROUND, TRUNC
FLOOR, CEIL
MOD
Conversion
Conversion implicite
Conversion explicite : TO_DATE, TO_NUMBER, TO_CHAR
Générales
NVL (par exemple NVL(X,0) renvoie 0 si X vaut Null)
CASE WHEN condition1 THEN valeur1 WHEN condition2 THEN valeur2 ELSE valeur3 END
Imbrication de fonctions : F3(F2(F1(col,arg1),arg2),arg3)
Méthode
Complément
Fonctions SQL1
Vous pouvez consulter Oracle : SQL∗, page 9 à 12, pour avoir une description plus détaillée des
fonctions disponibles sous Oracle.
1
http://docs.oracle.com/cd/B19188_01/doc/B15917/sqfunc.htm
Complément
TO_DATE(char)1 (oracle.com)
TO_DATE(char)2 (techonthenet.com)
1
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm
2
http://www.techonthenet.com/oracle/functions/to_date.php
Rappel
Complément
TO_CHAR(date)1 ; TO_CHAR(date)2
TO_CHAR(number)3
Formatage4
1 SELECT prenom || ' ' || pknom || ' (' || poste || ')' AS intervenant FROM
tIntervenant;
1 INTERVENANT
2 -------------------------------
3 STEPHANE CROZAT (4287)
Complément
L'opérateur standard en SQL est CONCAT(col1, col2) ; il fonctionne également sous Oracle.
1
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions180.htm
2
http://www.techonthenet.com/oracle/functions/to_char.php
3
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions181.htm
4
http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm
3.5. Séquences
Séquence Définition
Les séquences permettent de générer automatiquement des numéros uniques (en général pour créer
une valeur de clé primaire artificielle).
Elles remplissent une fonction de compteur :
mémoriser une valeur,
retourner la valeur,
incrémenter la valeur.
Remarque
1 nom_sequence.CURRVAL
1 nom_sequence.NEXTVAL
user_sequences Remarque
La clause START WITH de l'instruction CREATE SEQUENCE permet de définir la première valeur de la
séquence.
Vous pouvez consulter Oracle : SQL∗, page 7, pour avoir une description plus détaillée de la syntaxe
des séquences et disposer d'exemples.
Rownum Syntaxe
Rownum
La restriction ROWNUM <= N dans la clause WHERE permet filtrer les N premières lignes de la table.
Remarque
rownum est une pseudo colonne qu'il est bien entendu possible de projeter : SELECT rownum
FROM ...
Cette syntaxe permet de sélectionner une fenêtre sur les données et pas seulement les N premières
lignes.
Lorsque l'on est en présence de gros volumes de données, et que l'on veut se faire une idée du contenu
de ces données, il n'est pas souhaitable de faire un simple SELECT *. En il serait trop long de rapatrier
les dizaines de milliers de lignes et de plus cela serait inutile puisque seules quelques unes seraient
effectivement lues.
L'usage de rownum permet de s'intéresser à des fenêtres de données représentatives, pour se faire une
idée générale.
Pour la bonne configuration du client Oracle (écrit en Java), il est parfois nécessaire de procéder à une
configuration manuelle.
Trouver l'emplacement de la machine virtuelle Java (JDK) sur le système, par exemple :
/usr/lib/jvm/java-8-openjdk-amd64
Cela peut-être fait avec la commande locate jvm.
Éditer le fichier :
~/sqldeveloper/sqldeveloper/bin/sqldeveloper.conf
Ajouter une directive :
SetJavaHome /usr/lib/jvm/java-8-openjdk-amd64
Si vous avez un message d'erreur Error: Java home /usr/lib/jvm/java-8-
openjdk-amd64 is not a JDK... ajouter également :
SetSkipJ2SDKCheck true
Complément
Attention
Pour rafraîchir la vue de gauche (catalogue) après une requête LDD, il faut faire un clic droit sur
l'élément du catalogue (par exemple Tables après une création de table) puis sélectionner
Régénérer.
SQL (script)
Remarque
Attention
Le bouton Exécuter l'instruction n'affiche pas les erreurs d'exécution ou les confirmations
de création ou insertion (requêtes CREATE, INSERT, UPDATE), il est donc à réserver aux requêtes
SELECT valides (si le résultat n'est pas correct, utiliser Exécuter un script).
Conseil
Méthode
Pour enregistrer un script SQL ou PL/SQL écrit dans Oracle SQL Developer sous la forme d'un fichier
utiliser la fonction file > save as.
Méthode
script.sql Exemple
1 @file1.sql
2 @file2.sql
3 @file3.sql
SQL*Plus Définition
SQL*Plus est un client Oracle basique en mode texte, qui n'est plus vraiment utilisé (on utilise
Oracle SQL Developer à la place).
SQL*Plus désigne aussi un langage interne à Oracle destiner à gérer la présentation des résultats
de requêtes en mode texte (états textuels).
Oracle SQL Developer utilise également SQL*Plus mais ne supporte pas toutes les fonctions.
http://www.oracle.com/technetwork/developer-tools/sql-developer/sql-worksheet-commands-09714
6.html
Usages Méthode
Le paramétrage de la présentation des résultats de requête est utile au développeur pour avoir
des retours lisibles dans son terminal d'exécution.
Il peut aussi servir à des parties applicatives comme le formatage pour un export CSV.
...
Attention
Syntaxe
Exemple
Complément
http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm
Complément
Largeur de la colonne : An
Chiffre (avec ou sans zéro à gauche) : 9 / 0
Symboles monétaires : $ / L
Séparateurs de virgule et de milliers : . / ,
...
Exemple
La table EMPLOYEE
Question 1
Écrivez le code SQL pour créer cette table sous Oracle.
Question 2
Vérifier que la table a bien été créée.
Indice :
Utiliser DESCRIBE.
Question 3
Modifier la table EMPLOYEE pour pouvoir allonger les noms de famille des employés à 50 caractères.
Vérifiez cette modification.
Indice :
On utilisera ALTER TABLE.
Question 4
Vérifiez l'existence de la table EMPLOYEE dans le dictionnaire de données.
Indice :
Faites une requête de sélection sur la table du dictionnaire USER_TABLES.
Question 5
Ajouter une contrainte PRIMARY KEY de niveau de table dans la table EMPLOYEE en utilisant la colonne ID.
Question 6
Vérifier que la contrainte a bien été ajoutée en utilisant la table USER_CONSTRAINTS ainsi que dans le
mode graphique.
Question 7
Rechercher les noms et types d'objets dans la vue USER_OBJECTS du dictionnaire de données
correspondant à la table EMPLOYEE.
Question 8
Modifier la table EMPLOYEE. Ajouter une colonne SALARY de type NUMBER avec une précision 7.
Question 9
Renommez la table EMPLOYEE en EMPLOYEE2.
Question 10
Supprimez la table EMPLOYEE2.
Pour chacune des questions suivantes, écrivez le code SQL permettant de répondre à la question sous
Oracle.
Question 1
A partir de la table "emp", afficher le nom des employés ("ename") concaténé avec leur poste ("job") en
les séparant par une virgule suivi d'une espace et donner comme titre à la colonne "EMPLOYE ET
FONCTION"
Question 2
Afficher le nom et la date d'embauche ("hiredate") des employés embauchés entre le 20 février 1981, et 1
mai 1981. Classez le résultat par date d'embauche.
Indice :
Attention à l'utilisation du format "YY" qui pose des problème vis à vis du passage à l'an 2000, préférer le
format "YYYY".
Question 3
Afficher le nom de tous les employés, dont le nom contient deux fois la lettre "L".
Question 4
Afficher le nom, poste et salaire ("sal') de tous les personnes qui ont comme poste 'Clerk' ou 'Analyst' et
dont le salaire est différent de $1000, $3000, ou $5000.
Question 5
Afficher le nom de chaque employé et calculer le nombre de mois qu'il a travaillé jusqu'à ce jour (après
l'avoir arrondi celui-ci à la plus proche valeur entière). Nommer la colonne MONTHS_WORKED.
Question 6
Ecrivez la requête qui affiche pour chaque employé le résultat suivant :
"X" gagne "Y" par mois mais il veut "3 fois Y".
Nommer la colonne SALAIRES DE REVES.
Question 7
Afficher le salaire maximum, minimum, la somme des salaires et le salaire moyen de tous les employés.
Nommer les colonnes respectivement Maximum, Minimum, Sum, and Average. Arrondissez les résultats à
zéro décimales.
1. Exercice : MediaTek I
[60 min]
L'association MediaTek fait appel à vous afin d'automatiser ses tâches de marketing (analyse des ventes,
analyse des profils des clients) et commerciales (facturation).
MCD et MLD
L'objectif est de réaliser une base de données permettant de gérer les clients, produits, et factures :
Une facture comporte un ou plusieurs produits.
Un produit peut paraître dans plusieurs factures.
Une facture est associée à un seul client.
Un client peut établir plusieurs factures.
Question 1
Dériver le modèle relationnel.
Implémentation
Vous demandez à un collègue de réaliser pour vous les instructions de création et d'initialisation des
tables, sur la base des données Oracle dont vous disposez.
1 CREATE TABLE client (
2 num number,
3 nom varchar(20),
4 prenom varchar(20),
5 ddn date,
6 tel varchar(20),
7 genre char check (genre in ('m','f')),
8 adresse varchar(128),
9 PRIMARY KEY (num)
10 );
11
12 CREATE TABLE facture (
13 num number,
14 datef date,
15 client number,
16 PRIMARY KEY (num),
17 FOREIGN KEY (client) REFERENCES client(num)
18 );
19
20 CREATE TABLE produit (
21 num number,
22 designation varchar(128),
23 prix number,
24 stock number,
25 PRIMARY KEY (num)
26 );
27
28 CREATE TABLE ligne_fact (
29 facture number,
30 produit number,
31 qte number,
32 FOREIGN KEY (facture) REFERENCES facture(num),
33 FOREIGN KEY (produit) REFERENCES produit(num),
34 PRIMARY KEY (facture, produit)
35 );
1 INSERT INTO client (num, nom, prenom, adresse, ddn, tel, genre) VALUES (
2 1,
3 'coulomb',
4 'francois',
5 '4, rue liberte',
6 to_date('02121980','DDMMYYYY'),
7 '06456780',
8 'm'
9 );
10
11 INSERT INTO client (num, nom, prenom, adresse, ddn, tel, genre) VALUES (
12 2,
13 'morin',
14 'bernard',
15 '120, square zola',
16 to_date('19081972','DDMMYYYY'),
17 '01345678',
18 'm'
19 );
20
21 INSERT INTO client (num, nom, prenom, adresse, ddn, tel, genre) VALUES (
22 3,
23 'corday',
24 'charlotte',
25 '66, bv napoleon III',
26 to_date('02101977','DDMMYYYY'),
27 '06455790',
28 'f'
29 );
30
31 INSERT INTO client (num, nom, prenom, adresse, ddn, tel, genre) VALUES (
32 4,
33 'pierre',
34 'alexandre',
35 '1, place des martyres',
36 to_date('19081972','DDMMYYYY'),
37 '01645870',
38 'f'
39 );
40
41 COMMIT;
1 INSERT INTO produit (num, designation, prix, stock) VALUES (
2 1,
3 'Matrix',
4 23.5,
5 100
6 );
7
8 INSERT INTO produit (num, designation, prix, stock) VALUES (
9 2,
10 'Seigneur des anneaux',
11 49.30,
12 100
13 );
14
15 INSERT INTO produit (num, designation, prix, stock) VALUES (
16 3,
17 'Mistral Gagnant',
18 25.9,
19 100
20 );
21
22 COMMIT;
1 -- INSERT INTO FACTURE, LIGNE_FACT
2
3 -- Facture 1
4
5 insert into FACTURE(num, client, datef) values(
6 1,
7 2,
8 to_date('20122000','DDMMYYYY')
9 );
10
11 insert into LIGNE_FACT(facture, produit, qte) values(
12 1,
13 1,
14 1
15 );
16
17 insert into LIGNE_FACT(facture, produit, qte) values(
18 1,
19 2,
20 2
21 );
22
23 -- Facture 2
24
25 insert into FACTURE(num, client, datef) values(
26 2,
27 2,
28 to_date('01012001','DDMMYYYY')
29 );
30
31 insert into LIGNE_FACT(facture, produit, qte) values(
32 2,
33 1,
34 2
35 );
36
37 insert into LIGNE_FACT(facture, produit, qte) values(
38 2,
39 3,
40 1
41 );
42
43 insert into LIGNE_FACT(facture, produit, qte) values(
44 2,
45 2,
46 2
47 );
48
49 -- Facture 3
50
51 insert into FACTURE(num, client, datef) values(
52 3,
53 2,
54 to_date('17112004','DDMMYYYY')
55 );
56
57 insert into LIGNE_FACT(facture, produit, qte) values(
58 3,
59 1,
60 2
61 );
62
63 insert into LIGNE_FACT(facture, produit, qte) values(
64 3,
65 2,
66 4
67 );
68
69 insert into LIGNE_FACT(facture, produit, qte) values(
70 3,
71 3,
72 1
73 );
74
75 -- Facture 4
76
77 insert into FACTURE(num, client, datef) values(
78 4,
79 3,
80 to_date('14012004','DDMMYYYY')
81 );
82
145 );
146
147 commit;
Question 2
Exécuter le code de votre collègue et vérifier que tout fonctionne.
Questions de base
Écrivez et exécutez les requêtes SELECT suivantes permettant de vérifier le contenu de la base de
données.
Question 3
Écrivez et exécutez la requête permettant d'afficher toutes les lignes de facture, avec pour chacune :
le numéro de la facture,
les nom et prénom du client,
la désignation et le prix du produit,
et la quantité achetée.
Indice :
Il faut joindre toutes les tables de la base de données.
Question 4
Écrivez la requête permettant de calculer le chiffre d'affaire, c'est à dire le nombre de produits achetés
multiplié par leur prix, pour chaque facture.
Vue
Le service après vente (SAV) est instruit à se comporter vis à vis des clients, selon leur catégorie :
"VIP" si le chiffre d'affaire pour ce client est supérieur à 500 euros,
"client ordinaire" si le chiffre d'affaire est compris entre 50 et 500 euros,
et "client à potentiel" si le chiffre d'affaire est inférieur à 50 euros.
Le mécanisme de vue est fréquemment utilisé pour masquer la complexité d'un schéma de BD aux yeux
d'opérateurs nécessitant un schéma simple (on parle de schéma externe).
Dans notre cas, les opérateurs du SAV désirent avoir la catégorie du client au téléphone grâce à une
instruction très simple :
select * from v_chiffre_affaire where code_client=# ;
Question 5
Écrivez la requête SQL LMD qui permet de renvoyer la liste des clients (num, nom et prénom) avec leur
chiffre d'affaire et leur catégorie (VIP, Ordinaire ou Potentiel)
Indice :
Utiliser CASE WHEN :
SELECT CASE WHEN ... THEN 'X' WHEN ... THEN 'Y' ELSE 'Z' END FROM ...
Question 6
Écrivez la requête SQL LDD qui crée la vue "v_chiffre_affaire" permettant de répondre au besoin des
opérateurs du service après vente.
Question 7
Écrire la requête SQL LMD qui renvoie la catégorie d'un client ayant pour nom Morin.
Indice :
Utilisez la vue dans la clause FROM de votre requête.
SQL*Plus
A présent que vous avez terminé vos requêtes, expérimentez SQL*Plus afin d'améliorer la lisibilité des
résultats de requête dans le terminal.
Question 8
Effectuez un SELECT * sur la table "produit". Que constatez vous ? Pourquoi ?
Question 9
Proposez une solution en utilisant le formatage SQL*Plus.
La gestion des dates peut poser des problèmes selon les formats paramétrés sur le serveur. La solution
la plus rigoureuse consiste à utiliser la fonction de conversion TO_DATE.
Exemple
https://docs.postgresql.fr/current/functions-formatting.html
Les paramètres de type fm pour format mask (fmday, fmDay, fmDAY, fmMonth...) permettent de
supprimer les zéros et espaces.
Ils sont à privilégier en général :
TO_CHAR(date,'day') retourne 'saturday___' (avec des espaces à la fin)
TO_CHAR(date,'fmday') retourne 'saturday'
https://docs.postgresql.fr/current/functions-formatting.html
Méthode
Pour transférer un résultat de requête dans un fichier CSV, il faut procéder en deux étapes.
1. Écrire un script qui :
formate la sortie de façon adéquate (SET) ;
oriente le résultat vers un fichier (SPOOL).
encadre les données non numériques par des guillemets et sépare les colonnes par des
points-virgules (||) ;
2. Appeler ce script pour obtenir le fichier CSV.
La sortie standard du client pourra être désactivée si le flux de données est important.
Exemple
1 -- script /tmp/exportCsv.sql
2 SET HEADING OFF
3 SET FEEDBACK OFF
4 SET ECHO OFF
5 SET PAGESIZE 0
6 SPOOL /tmp/out.dat
7 SELECT '"' || pkFamilleDefaut || '";"' || libelle || '"' FROM tFamilleDefaut ;
8 SPOOL OFF
1 -- exécution du script /tmp/exportCsv.sql
2 @/tmp/exportCsv.sql
Attention
Rappel
4. Fichier CSV
CSV∗ est un format informatique permettant de stocker des données tabulaires dans un fichier texte.
Chaque ligne du fichier correspond à une ligne du tableau. Les valeurs de chaque colonne du tableau
sont séparées par un caractère de séparation, en général une virgule ou un point-virgule. Chaque
ligne est terminée par un caractère de fin de ligne (line break).
Toutes les lignes contiennent obligatoirement le même nombre de valeurs (donc le même nombre de
caractères de séparation). Les valeurs vides doivent être exprimées par deux caractères de séparation
contigus.
La taille du tableau est le nombre de lignes multiplié par le nombre de valeurs dans une ligne.
La première ligne du fichier peut être utilisée pour exprimer le nom des colonnes.
Syntaxe
1 [NomColonne1;NomColonne2;...;NomColonneN]
2 ValeurColonne1;ValeurColonne2;...;ValeurColonneN
3 ValeurColonne1;ValeurColonne2;...;ValeurColonneN
4 ...
1 Pierre;Dupont;20;UTC;NF17
2 Pierre;Dupont;20;UTC;NF26
3 Paul;Durand;21;UTC;NF17
4 Jacques;Dumoulin;21;UTC;NF29
1 Prenom;Nom;Age;Ecole;UV
2 Pierre;Dupont;20;UTC;NF17
3 Pierre;Dupont;20;UTC;NF26
4 Paul;Durand;21;UTC;NF17
5 Jacques;Dumoulin;21;UTC;NF29
1 Jacques;Dumoulin;;UTC;NF29
Variations... Attention
La syntaxe des fichiers CSV n'est pas complètement standardisée, aussi des variations peuvent exister :
Les chaînes de caractères peuvent être protégées par des guillemets (les guillemets s'expriment
alors avec un double guillemet).
Le caractère de séparation des nombres décimaux peut être le point ou la virgule (si c'est la
virgule, le caractère de séparation doit être différent)
...
Un des problème les plus importants reste l'encodage des caractères qui n'est pas spécifié dans le
fichier et peut donc être source de problèmes, lors de changement d'OS∗ typiquement.
Les fichiers CSV sont très utilisés en BD∗ pour échanger les données d'une table (export/import).
Les SGBD∗ contiennent généralement des utilitaires permettant d'exporter une table ou un résultat de
requête sous la forme d'un fichier CSV, en spécifiant un certain nombre de paramètres (caractère de
séparation de valeur, caractère de fin de ligne, présence ou non d'une ligne de définition des noms des
colonnes, etc.). De même ils proposent des utilitaires permettant d'importer un fichier CSV dans une
table (en spécifiant les mêmes paramètres), voire de créer directement une table à partir du fichier CSV
(quand les noms des colonnes sont présents).
Les fichiers à largeur de colonne fixe n'utilisent pas de séparateur de colonne, mais imposent le même
nombre de caractères pour chaque cellule. L'avantage est de ne pas avoir à spécifier le caractère de
séparation, l'inconvénient est la taille de fichier supérieure si les valeurs ne font pas toutes la même
largeur.
XML Complément
Les fichiers XML∗ tendent de plus en plus à remplacer les fichiers CSV car ils permettent d'être
beaucoup plus expressifs sur le schéma d'origine. Ils sont également plus standards (encodage
spécifié, principe de séparation des données par les tags, etc.). Leur seul inconvénient est d'être plus
verbeux et donc plus volumineux.
Certains SGBD, comme Oracle, permettent de créer des tables dites externes, qui autorisent de créer
un schéma de table directement sur un fichier CSV, permettant ainsi un accès SQL standard à un
fichier CSV, sans nécessité de l'importer d'abord dans une table.
BD : Base de Données
CSV : Comma Separated Values
OS : Operating Système (Système d'Exploitation)
SGBD : Système de Gestion de Bases de Données
XML : eXtensible Markup Language
Abbey Michael, Corez Michael, Abramson Ian, Oracle 9i : Notions fondamentales, CampusPress, 2001.
Delmal Pierre. SQL2 SQL3, applications à Oracle. De Boeck Université, 2001.
Mata-Toledo Ramon A., Cushman Pauline K.. Programmation SQL. Ediscience, 2003.
|| .................................................14
Application............... 21, 22, 22, 22
Chaîne ........................................11
Clé ..............................................15
CONCAT .....................................14
CSV .............................................35
date........................... 11, 34, 14, 34
Dictionnaire .................................9
Domaine ......................................7
Etat ................................. 21, 35, 22
Fonction................... 11, 34, 14, 34
LMD ........................................ 8, 10
NUMBER.......................................7
Oracle ..................................... 7, 14
SQL Developer ...........................17
String .........................................11
SUBSTR ......................................11
TO_CHAR.................. 11, 34, 14, 34
TO_DATE................... 11, 34, 14, 34
VARCHAR2....................................7