jeudi 5 février 2009

Tables externes

Les tables externes peuvent lire des fichiers plats comme si elles étaient des tables ordinaires.

Par conséquent, il est pratique d'employer les tables externes pour charger des fichiers plats dans la base de données.

Les exemples suivants montrent comment importer un fichier avec une table externe.


Exemple #1

Le fichier se compose de 4 colonnes dont les champs sont sépérés par des virgules:

1;Avalanche;Colorado;COL
2;Senators;Ottawa;OTT
4;Bruins;Boston;BOS
5;Canadiens;Montreal;MTL
6;Sabres;Buffalo;BUF


Pour accéder au fichier. un répertoire (Directory) doit être créé dans la base de données :

create or replace directory ext_dir as 'C:\Temp'; -- Répertoire où le fichier sera déposé

Pour avoir le droit d'utiliser le répertoire, l'utilisateur Oracle doit obtenir des privilèges :

grant read, write on directory ext_dir to eric; -- Nom de l'utilisateur Oracle

Maintenant, il faut créer une table pour recevoir les données du fichier. Il faut définir les colonnes suffisament grandes pour qu'elles puissent contenir les données :

create table Equipe_Hockey(no_equi number(2),
nom varchar2(30),
ville varchar2(30),
cd_equi varchar2(3))

organization external
(type oracle_loader

default directory ext_dir
access parameters
(records delimited by newline

fields terminated by ';'
missing field values are null
)
location ('equipe.txt')
)
reject limit unlimited;

Finalement, effectuer un SELECT sur la table :

select * from Equipe_Hockey;

Un fichier de trace est généré dans le même répertoire du fichier. Ce fichier Log vous renseigne sur l'accès au fichier. Si le traitement rencontre un erreur, elle sera inscrite dans ce fichier.

Exemple #2

Pour les DBAs, voici une utilisation qui peut être très utile. Cette procédure lit les fichiers d'alerte générés par Oracle. Vous devez avoir le droit "create any directory privilege" pour l'utiliser (n.b. je ne l'ai pas essayé... ) :

Create or Replace procedure external_alert_log as
path_bdump varchar2(4000);
name_alert varchar2(100);
Begin

select
value into path_bdump
from
sys.v_$parameter
where
name = 'background_dump_dest';

select
'alert_' value '.log' into name_alert
from
sys.v_$parameter
where
name = 'db_name';

execute immediate 'create or replace directory background_dump_dest_dir as '''
path_bdump '''';

execute immediate
'create table alert_log_external '
' (line varchar2(4000) ) '
' organization external '
' (type oracle_loader '
' default directory background_dump_dest_dir '
' access parameters ( '
' records delimited by newline '
' nobadfile '
' nologfile '
' nodiscardfile '
' fields terminated by ''#$~=ui$X'''
' missing field values are null '
' (line) '
' ) '
' location (''' name_alert ''') )'
' reject limit unlimited ';
End;
/

Pour exécuter la procédure :

begin
external_alert_log;
end;
/

Pour consulter le contenu :

select * from alert_log_external;

2 commentaires:

  1. bonjour,
    tu ne donnes pas d'exemple comment est la table externe est utilisée. suffit-il d'utiliser un SELECT * FROM Equipe_Hockey ? une fois qu'elle est définie et que le fichier texte se trouve bien dans le répertoire défini: C:\TEMP?
    Ou bien y a t-il autre chose à faire afin d'exploiter la table externe?

    RépondreEffacer
  2. Oui, un simple et habituel énoncé SQL (SELECT) sur la table fonctionne. Tu n'as rien à faire de différent.

    RépondreEffacer