Oracle tablas externas: Disposición de archivos planos avanzada
-
23-08-2019 - |
Pregunta
Me gustaría crear una tabla externa en una base de datos Oracle, recuperar sus datos desde un archivo plano en el servidor. El formato de este archivo no es trivial. Cada línea de este archivo puede ser uno de varios diseños diferentes, en función de prefijo de la línea (el prefijo en sí es siempre una longitud fija). Por ejemplo, una línea que comienza con 'TYPE1'
tendría un diseño distinto al de una línea que comienza con 'TYPE2'
.
He leído que las tablas externas pueden aprovechar todas las construcciones hechas disponible para SQL archivos de control del cargador. Sin embargo, cualquier documentación He leído solamente las costuras para hacer frente a los diseños de archivo plano triviales mediante el cual todas las líneas comparten un diseño común. Un archivo SQL control de la cargadora fácilmente podría manejar esta situación mediante la cláusula 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)
)
¿Cómo puedo expresar una disposición tal utilizando la sintaxis de definición de la tabla externa de Oracle?
Solución
Esto es de 9,2 docs pero se necesita la carga cuando la cláusula.
http://download.oracle.com /docs/cd/B10500_01/server.920/a96652/ch12.htm
Otros consejos
Si tiene registros fijos probar este
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;
A continuación, puede acceder a continuación, columnas dependiendo del tipo de registro declarar c1 cursor es
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;
Espero que esto ayude