Question

Je souhaite créer une table externe dans une base de données Oracle, récupérer 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 de plusieurs mises en page différentes, selon le 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 autre disposition d'une ligne commençant par 'TYPE2'.

J'ai lu que les tables externes peuvent profiter de toutes les constructions mises à SQL Les fichiers de contrôle de la chargeuse. Cependant, tous les documents que j'ai lu coutures seulement pour traiter les mises en page triviales fichiers plats dans lequel toutes les lignes partagent une disposition commune. A SQL fichier de contrôle du chargeur 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?

Était-ce utile?

La solution

Ceci est de 9,2 docs, mais vous devez la charge lorsque la clause.

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

Autres conseils

Si vous avez des enregistrements fixes essayer

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 ensuite accéder à colonnes puis selon le type enregistrement déclarer   c1 curseur 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 helps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top