Внешние таблицы Oracle:Расширенный макет плоского файла
-
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;
Надеюсь это поможет