Внешние таблицы Oracle:Расширенный макет плоского файла

StackOverflow https://stackoverflow.com/questions/898872

  •  23-08-2019
  •  | 
  •  

Вопрос

Я хочу создать внешнюю таблицу в базе данных Oracle, извлекая ее данные из плоского файла на сервере.Формат этого файла нетривиален.Каждая строка в этом файле может иметь один из нескольких различных макетов, в зависимости от префикса строки (сам префикс всегда имеет фиксированную длину).Например, строка, начинающаяся с 'TYPE1' будет иметь другой макет, чем строка, начинающаяся с 'TYPE2'.

Я читал, что внешние таблицы могут использовать все конструкции, доступные в SQL.Управляющие файлы загрузчика.Однако вся прочитанная мной документация посвящена только тривиальным макетам в виде плоских файлов, в которых все строки имеют общий макет.SQLФайл управления загрузчиком может легко справиться с этим сценарием, используя команду 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)
)

Как я могу выразить такой макет, используя синтаксис определения внешней таблицы Oracle?

Это было полезно?

Решение

Это из документации 9.2, но вам нужно предложение LOAD WHEN.

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

Другие советы

Если у вас есть фиксированные рекорды, попробуйте это

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;

Тогда вы можете получить доступ к столбцам в зависимости от декларации типа записей CROSOR C1

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;

Надеюсь это поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top