Oracle Tableaux externes: mise en page de fichier plat avancée
-
23-08-2019 - |
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?
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