2009-05-22 10 views
3

Je souhaite créer une table externe dans une base de données Oracle, en récupérant ses données à partir d'un fichier plat sur le serveur. Le format de ce fichier est non trivial. Chaque ligne de ce fichier peut être l'une des différentes mises en page, en fonction du préfixe de la ligne (le préfixe lui-même est toujours une longueur fixe). Par exemple, une ligne commençant par 'TYPE1' aurait une disposition différente d'une ligne commençant par 'TYPE2'.Tables externes Oracle: disposition de fichier plat avancée

J'ai lu que les tables externes peuvent tirer parti de toutes les constructions mises à la disposition des fichiers de contrôle de Loader SQL . Cependant, toute la documentation que j'ai lue ne contient que des mises en page de fichiers plats triviales où toutes les lignes partagent une mise en page commune. Un SQL fichier de contrôle Loader pourrait facilement gérer ce scénario en utilisant la clause WHEN:

WHEN (1:5) = 'TYPE1' 
(
    field1 POSITION(10:18), 
    field2 POSITION(26:35) 
) 
WHEN (1:5) = 'TYPE2' 
(
    field1 POSITION(23:27), 
    field2 POSITION(15:19) 
) 

Comment puis-je exprimer une telle mise en page en utilisant la syntaxe de définition de la table externe d'Oracle?

Répondre

1

Ceci est à partir de 9.2 docs mais vous avez besoin de la clause LOAD WHEN.

http://download.oracle.com/docs/cd/B10500_01/server.920/a96652/ch12.htm

+0

Merci pour le lien, c'est très utile! :) Cependant, selon cette documentation, la clause LOAD WHEN n'est pas utilisée pour choisir entre plusieurs dispositions de champs: "La clause LOAD WHEN condition_spec est utilisée pour identifier les enregistrements qui doivent être transmis à la base de données. varie: " Avez-vous un exemple de cette clause qui vous permet de choisir entre différentes configurations de champs plutôt que de choisir quels enregistrements seront exportés? –

+0

Vous allez vous retrouver avec plusieurs tables externes. Une table pour les enregistrements TYPE1 et une autre pour les enregistrements TYPE2. Si vous y pensez, une table ne peut pas avoir plusieurs mises en page. – David

+0

Je me demandais si j'allais devoir suivre cette route. Je comprends qu'une table ne peut pas avoir plusieurs mises en page. Cependant, dans mon cas, tous les types de lignes spécifient les mêmes champs, juste dans des positions différentes. Merci pour le conseil! :) Souhaitez-vous modifier votre réponse pour inclure votre dernier commentaire? –

0

Si vous avez des enregistrements fixes essayer cette

create table EXT_TABLE 
(
    record_type  char(2), 
    customer_id  char(10), 
    customer_name  char(60), 
    item_id   char(12) 
    quantity   char(10) 
) 
organization external 
(
    type ORACLE_LOADER 
    default directory DIR_FLUX_DEV 
    access parameters 
    (
    RECORDS DELIMITED BY NEWLINE 
    BADFILE 'ext_table.bad' 
    LOGFILE 'ext_table.log' 
    SKIP 0 
    FIELDS 
    (
    TP_REC    position(1:2) char(2), 
    customer_id   position(3:10) char(10), 
    customer_name  position(13:60) char(60), 
    item_id    position(3:12) char(12), 
    quantity    position(15:10) char(10) 
    ) 
) 
    location (DIR_FLUX_DEV:'file.txt') 
) 
reject limit 0; 

Vous pouvez alors accéder à puis colonnes en fonction enregistrement de type déclare curseur c1 est

select e.* from ext_table; 

begin 
    for r in c1 loop 
    if r.tp_rec = '02' then 
     dbms_output.put_line(r.tp_rec || ' ' || r.customer_id); 
    elsif r.tp_rec = '03' then 
     dbms_output.put_line(r.tp_rec || ' ' || r.item_id); 
    end if; 
    end loop; 
end; 

Hope this aide

Questions connexes