Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как в Лоадере сделать условие типа like?  [new]
salexa
Member

Откуда:
Сообщений: 95
так как в when не добавишь like, приходит на ум только
WHEN file_type='1'
..........
  FILE_NAME,
..........
  file_type "instr(:FILE_NAME,'ACS')"
вот только поле тогда новое добавляется и filler-ом его не прикроешь.
Варианты типа gawk или/и perl - не интересуют.
7 фев 08, 11:28    [5256098]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8135
Приведите
- управляющий файл полностью
- пример загружаемого файла данных
- версию Oracle SQL*Loader
7 фев 08, 11:39    [5256248]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
M_IV
Member

Откуда:
Сообщений: 1303
а вариант тоже внешних таблиц не интересует?
7 фев 08, 11:40    [5256256]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
M_IV
Member

Откуда:
Сообщений: 1303
а вариант внешних таблиц тоже не интересует? /sorry/
7 фев 08, 11:41    [5256268]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
salexa
Member

Откуда:
Сообщений: 95
Управляющий примерно такой:
LOAD DATA
truncate 
INTO TABLE XXX_INS
FIELDS TERMINATED BY ',' 
TRAILING NULLCOLS ( 
  name,
  corp,
  service,
  FILE_NAME,
  status
) 
пример строк файла:
ФП1,Y,1,010208ACS5.DAT,2
РПЛД,Н,1,010208KL5.DAT,2
ЧР,N,1,010208RN.DAT,0
SQL*Loader: Release 9.2.0.1.0
8 фев 08, 03:35    [5260738]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Создать вьюху на табличку и на нее повесить триггер INSTEAD OF INSERT. И заливать уже во вьюху. Правда TRUNCATE использовать не получится
Типа такого:
tst> create table xxx_ins(
  2  name varchar2(10),
  3  corp varchar2(10),
  4  service number,
  5  file_name varchar2(20),
  6  status number);

Table created.

tst> create view xxx_ins_v
  2  as select * from xxx_ins;

View created.

tst> create trigger xxx_ins_v_trg
  2  INSTEAD OF insert on xxx_ins_v
  3  for each row
  4  begin
  5      if instr(file_name, 'ACS') > 0 then
  6          insert into xxx_ins values
  7          (:new.name, :new.corp, :new.service, :new.file_name, :new.status);
  8      end if;
  9  end;
 10  /

Trigger created.
LOAD DATA
infile *
INTO TABLE XXX_INS_V
FIELDS TERMINATED BY ','
TRAILING NULLCOLS (
name,
corp,
service,
file_name,
status
)
begindata
FP1,Y,1,010208ACS5.DAT,2
RPLD,H,1,010208KL5.DAT,2
CHR,N,1,010208RN.DAT,0
tst> select * from xxx_ins;

NAME       CORP          SERVICE FILE_NAME                STATUS
---------- ---------- ---------- -------------------- ----------
FP1        Y                   1 010208ACS5.DAT                2
8 фев 08, 05:34    [5260771]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
salexa
Member

Откуда:
Сообщений: 95
ну это итак понятно, а средствами лоадера?
8 фев 08, 06:42    [5260794]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Без введения дополнительного поля (file_type) никак
8 фев 08, 06:48    [5260796]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Elic
Member

Откуда:
Сообщений: 29991
Вячеслав Любомудров
Без введения дополнительного поля (file_type) никак
Для некоторых like-ов - можно:
-- create table xxx_ins(name varchar2(20), corp varchar2(3), service int, file_name varchar2(20), status int);
load data
infile *
into table xxx_ins replace
when file_type = 'ACS'
(
name terminated by ',',
corp terminated by ',',
service terminated by ',',
file_name char(6) ":file_name||:file_type||:file_name2",
file_type boundfiller char(3),
file_name2 boundfiller terminated by ',',
status
)
begindata
ФП1,Y,1,010208ACS5.DAT,2
РПЛД,Н,1,010208KL5.DAT,2
ЧР,N,1,010208RN.DAT,0
*.log
Table XXX_INS:
1 Row successfully loaded.
0 Rows not loaded due to data errors.
2 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.

SQL> select * from xxx_ins;

NAME                 COR       SERVICE FILE_NAME            Stat
-------------------- --- ------------- -------------------- ----
ФП1                  Y               1 010208ACS5.DAT          2
8 фев 08, 11:34    [5262010]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Прикольно, но логики пока не понял
Пиво уже...
8 фев 08, 11:38    [5262055]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Elic
Member

Откуда:
Сообщений: 29991
Можно даже и like '%ASC%':
-- create table xxx_ins(name varchar2(20), corp varchar2(3), service int, file_name varchar2(20), status int);
load data
infile *
into table xxx_ins replace
fields terminated by ','
(
name,
corp,
service,
file_name terminated by 'ACS' ":file_name||'ACS'||:file_name2",
file_name2 boundfiller,
status
)
begindata
ФП1,Y,1,010208ACS5.DAT,2
РПЛД,Н,1,010208KL5.DAT,2
ЧР,N,1,010208RN.DAT,0
ФП2,Y,1,01022008ACS6.DAT,2
ФП3,Y,1,ACS7.DAT,2
ФП4,Y,1,DAT.ACS,2

*.log
Table XXX_INS:
4 Rows successfully loaded.
2 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
SQL> select * from xxx_ins;

NAME                 COR       SERVICE FILE_NAME            Stat
-------------------- --- ------------- -------------------- ----
ФП1                  Y               1 010208ACS5.DAT          2
ФП2                  Y               1 01022008ACS6.DAT        2
ФП3                  Y               1 ACS7.DAT                2
ФП4                  Y               1 DAT.ACS                 2

При желании можно сделать и так, чтобы сроки отвергались по условию, а не по формату.
8 фев 08, 11:57    [5262269]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Ога, просек, но пока писал ответ, навернулся блок питания на машинке, пока поменял...
Но, как ты сам понимаешь, это только для определеного формата
8 фев 08, 12:39    [5262611]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Elic
Member

Откуда:
Сообщений: 29991
Вячеслав Любомудров
Но, как ты сам понимаешь, это только для определеного формата
Ты второго варианта не видел? :)
8 фев 08, 12:50    [5262696]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Elic
Вячеслав Любомудров
Но, как ты сам понимаешь, это только для определеного формата
Ты второго варианта не видел? :)


Will not work for TRAILING NULLCOLS:

load data
infile *
into table xxx_ins replace
fields terminated by ','
TRAILING NULLCOLS
(
name,
corp,
service,
file_name terminated by 'ACS' ":file_name||'ACS'||:file_name2",
file_name2 boundfiller,
status
)
begindata
FP1,Y,1,010208ACS5.DAT,2
RPLD,N,1,010208KL5.DAT,2
CR,N,1,010208RN.DAT,0
FP2,Y,1,01022008ACS6.DAT,2
FP3,Y,1,ACS7.DAT,2
FP4,Y,1,DAT.ACS,2
FP5,Y,1,DAT.ACS

SQL> select * from xxx_ins;

NAME                 COR    SERVICE FILE_NAME                STATUS
-------------------- --- ---------- -------------------- ----------
FP1                  Y            1 010208ACS5.DAT                2
RPLD                 N            1 010208KL5.DAT,2ACS
CR                   N            1 010208RN.DAT,0ACS
FP2                  Y            1 01022008ACS6.DAT              2
FP3                  Y            1 ACS7.DAT                      2
FP4                  Y            1 DAT.ACS                       2
FP5                  Y            1 DAT.ACS

7 rows selected.

SY.
8 фев 08, 23:10    [5266841]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
salexa
Member

Откуда:
Сообщений: 95
Спасибо за варианты. к сожалению, SY прав.
+ создавать bad - нельзя (специфика системы, сразу орать начинает)
Однако вот такой вариант вполне подходит:
load data
infile *
append
into table xxx_ins 
when file_type = 'ACS'
TRAILING NULLCOLS
(
name terminated by ',',
corp terminated by ',',
service terminated by ',',
file_name char(6) ":file_name||:file_type||:file_name2",
file_type boundfiller char(3),
file_name2 boundfiller terminated by ',',
status
)
begindata
ФП1,Y,1,010208ACS5.DAT,2
РПЛД,Н,1,010208KL5.DAT,2
ЧР,N,1,010208RN.DAT,0
ФП2,Y,1,010208KTV121221.DAT,2

Нужно ещё утяжелить задачу, грузить не только ACS, но и KTV, как 2 таблицей у меня сделать не получилось.
11 фев 08, 04:29    [5269699]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Elic
Member

Откуда:
Сообщений: 29991
salexa
Нужно ещё утяжелить задачу, грузить не только ACS, но и KTV, как 2 таблицей у меня сделать не получилось.
...
status
)
into table xxx_ins
when file_type = 'KTV'
(
name position(1) terminated by ',',
...
RTFM Loading Data into Multiple Tables (FAQ)
11 фев 08, 10:08    [5270109]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
salexa
Member

Откуда:
Сообщений: 95
яя, сенкс
11 фев 08, 10:14    [5270148]     Ответить | Цитировать Сообщить модератору
 Re: Как в Лоадере сделать условие типа like?  [new]
Elic
Member

Откуда:
Сообщений: 29991
SY
Elic
Вячеслав Любомудров
Но, как ты сам понимаешь, это только для определеного формата
Ты второго варианта не видел? :)
Will not work for TRAILING NULLCOLS:
Elic
При желании можно сделать и так, чтобы сроки отвергались по условию, а не по формату:
FILE_NAME like '%ACS_%' :
load data
infile *
into table xxx_ins replace
when file_name2 != blanks
fields terminated by ',' TRAILING NULLCOLS
(
x1 filler,
x2 filler,
x3 filler,
x4 filler terminated by 'ACS',
file_name2 filler,
--
name position(1),
corp,
service,
file_name,
status
)
begindata
FP1,Y,1,010208ACS5.DAT,2
RPLD,N,1,010208KL5.DAT,2
CR,N,1,010208RN.DAT,0
FP2,Y,1,01022008ACS6.DAT,2
FP3,Y,1,ACS7.DAT,2
FP4,Y,1,DAT.ACS,2
FP5,Y,1,DAT.ACS
SQL> select * from xxx_ins;

NAME                 COR       SERVICE FILE_NAME            Stat
-------------------- --- ------------- -------------------- ----
FP1                  Y               1 010208ACS5.DAT          2
FP2                  Y               1 01022008ACS6.DAT        2
FP3                  Y               1 ACS7.DAT                2

3 rows selected.
11 фев 08, 11:07    [5270522]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить