En outre, si au lieu d'un GLOBAL TEMPORARY TABLE on utilise une table ordinaire et donc on part sur le principe que l'alimentation de la table en question ne se fait pas dans un environnement multi-utilisateur, alors vous pouvez utiliser SQL*Loader afin d'injecter le contenu du fichier. L'avantage c'est qu'il existe un paramètre recnum qui indique le n° de ligne dans le fichier. On peut donc ajouter une nouvelle colonne qui sera alimentée par les valeurs renvoyées par recnum. Après dans les SELECT il faut faire un ORDER BY <cette colonne> ASC pour avoir le bon ordre.
http://docs.oracle.com/cd/B28359_01/...field_list.htm
Use the RECNUM parameter after a column name
to set that column to the number of the logical record from which that record was loaded. Records are counted sequentially from the beginning of the first datafile, starting with record 1. RECNUM is incremented as each logical record is assembled. Thus it increments for records that are discarded, skipped, rejected, or loaded. If you use the option SKIP=10, the first record loaded has a RECNUM of 11.
Voici un exemple, supposons que j'ai une table qui contient le nom des pays qui censé être limentée par SQL*Loader à partir d'un fichier plat où dans chaque ligne on a écrit le nom d'un pays.
Je crée donc la table
CREATE TABLE countries(country VARCHAR2(30) NOT NULL, recordNum NUMBER NOT NULL);
Mon fichier text intitulé: "countries.txt":
1 2 3 4 5 6 7 8 9
| Iran,
Iraq,
Belgique,
France,
Royaume-Uni,
Etats-Unis
Allemagne,
Pologne,
Espagne, |
Mon fichier de contrôle sql*loader intitulé "myscript.ctl"
1 2 3 4 5 6 7 8
| load data
infile './countries.txt'
into table countries
fields terminated by ","
(
country ,
recordNum recnum
) |
En me mettant dans le répertoire qui contient les fichier de contrôle ainsi que le fichier de données (ce n'est pas une obligation mais à ce moment-là il faut spécifier le chemin complet vers les fichiers), je lance SQL*Loader afin d'alimenter ma table.
sqlldr monUser/monPassword@ChaineConnexionTNS control=./myscript.ctl log=./log bad=./bad
Et je vérifie que les données sont dans la table et en faisant un ORDER BY sur la colonne recordNum, je les obtiens exactement selon l'ordre des éléments dans le fichier original
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| SQL> SELECT t1.country FROM countries t1 ORDER BY t1.recordNum ASC;
COUNTRY
------------------------------
Iran
Iraq
Belgique
France
Royaume-Uni
Etats-Unis
Allemagne
Pologne
Espagne
9 rows selected.
SQL> |
Partager