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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top