Une table externe sous Oracle est une méthode d'accès sans copie à des fichiers CSV dynamiques exactement comme s'il s'agissait d'une table de la BD.
CREATE OR REPLACE DIRECTORY <nom du répertoire source> AS '<chemin du répertoire de la source>';
CREATE OR REPLACE DIRECTORY <nom du répertoire log> AS '<chemin du répertoire des fichiers de log>';
Le répertoire de la source et le fichier source doivent être accessibles en lecture pour le processus Oracle.
Le répertoire des fichiers de log doit être accessible en lecture et écriture pour le processus Oracle.
« All directories are created in a single namespace and are not owned by an individual schema »
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5007.htm
« One important point to remember is that comments must be placed before any access parameters. If you include comments in the access parameter sections, Oracle will throw an error when you query the external table but not when you are creating it. »
https://oracleappsnotes.wordpress.com/2012/02/10/oracle-external-tables-a-few-examples/
CREATE OR REPLACE DIRECTORY monRepertoireSrc AS '/user1c/nf26/nf26/projet/csv/';
CREATE OR REPLACE DIRECTORY monRepertoireLog AS '/volsme/user1x/uvs/nf26/nf26p099/test/';
/
CREATE TABLE tImport (
a VARCHAR(50),
b NUMBER(10)
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY monRepertoireSrc
ACCESS PARAMETERS
(
RECORDS DELIMITED BY newline
SKIP 1
CHARACTERSET UTF8
BADFILE monRepertoireLog:'import.bad'
LOGFILE monRepertoireLog:'import.log'
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
)
LOCATION ('sources.csv'))
REJECT LIMIT UNLIMITED;
DESCRIBE Timport;
SELECT TABLE_NAME, TYPE_NAME, DEFAULT_DIRECTORY_NAME FROM USER_EXTERNAL_TABLES;
SELECT * FROM Timport;
Si les volumes de donnée sont importants (s'il y a beaucoup de lignes), privilégiez l'usage de la clause ROWNUM pour éviter de faire transiter des méga-octets de données entre le serveur et le client. Les délais de réaction en seront améliorés.
Vous pouvez aussi utiliser des SUM, MIN, MAX, etc. pour être sûr que toutes les lignes et colonnes sont correctement lues.
Une fois la procédure terminée effectuer un count(*)
pour déterminer si l'import a bien traité toutes les lignes du fichier source.