Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL Loader / 20 сообщений из 20, страница 1 из 1
03.02.2019, 09:38
    #39768828
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
Здравствуйте.
Мне надо с помощью Sql loader загрузить в таблицу информацию из файла в таблицу. Кроме того мне надо загрузить в эту же таблицу имя файла, из которого происходит загрузка. Причем при каждой новой загрузке название этого файла будет новым.
В управляющем CTL-файле INFILE определяет файл, из которого происходит загрузка.


К примеру вот CTL-файл:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
LOAD DATA
INFILE *
TRUNCATE
INTO TABLE APPS.XX_MYEXAMPLE
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( 
  VAL1,
  VAL2
)



Пусть VAL2 - столбец таблицы под имя файла, из которого происходит загрузка данных в таблицу.
Если поставить INFILE *, то что нужно прописать в блоке TRAILING NULLCOLS, чтобы имя файла, из которого происходит загрузка, записывалось в таблицу?
...
Рейтинг: 0 / 0
03.02.2019, 10:06
    #39768833
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
sinerЕсли поставить INFILE *, то что нужно …, чтобы имя файла, из которого происходит загрузка, записывалось в таблицу?Такое не поддерживается. CTL придётся генерировать. STFF
...
Рейтинг: 0 / 0
03.02.2019, 14:41
    #39768906
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
Elic, подскажите, пожалуйста, как реализовать считывание имени файла и его запись в таблицу.
...
Рейтинг: 0 / 0
03.02.2019, 17:02
    #39768942
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
siner,
1) Внешним скриптом (cmd,bash,perl ...) генерируете ctl в котором прописываете имя файла через const

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
LOAD DATA 
INFILE 'data0032.dat'
TRUNCATE
INTO TABLE APPS.XX_MYEXAMPLE
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( 
  VAL1 CONSTANT 'data0032.dat',
  VAL2
)



2) если данные на сервере, то данные загружаются процедурой которая сканирует директорию с входными файлами, генерирует external table с полем constant имени файла как указано выше, переливает данные из external table в нужную таблицу и удаляет external table.
...
Рейтинг: 0 / 0
03.02.2019, 21:50
    #39768992
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
Vadim Lejninsiner,
1) Внешним скриптом (cmd,bash,perl ...) генерируете ctl

что касается пункта 1, то вызов следующего perl-скрипта с любыми аргументами отработает идентично и под bash, и под cmd, и под powershell

( загвоздка в том, что в windows ни cmd, ни powershell не поддерживают globbing )

genctl:
Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#!/usr/bin/env perl

while(<@ARGV>)
{
	print << "EOF";

LOAD DATA 
INFILE '$_'
TRUNCATE
INTO TABLE APPS.XX_MYEXAMPLE
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( 
  VAL1 CONSTANT '$_',
  VAL2
)
EOF

}



Код: php
1.
chmod +x genctl


Код: php
1.
perl genctl *.dat



PS: сейчас реализован просто вывод на stdout, поэтому случай (2) множества файлов на входе ( *.dat ) нуждается в некоторой доработке
...
Рейтинг: 0 / 0
03.02.2019, 22:26
    #39768998
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
volodin661, Спасибо, данный способ подходит только для случая когда в директории находится один файл с данными?
...
Рейтинг: 0 / 0
03.02.2019, 22:27
    #39768999
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
Vadim Lejnin, спасибо
...
Рейтинг: 0 / 0
03.02.2019, 22:42
    #39769005
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
sinerданный способ подходит только для случая когда в директории находится один файл с данными?

Нет, для всех случаев, но надо решить что будем делать при выводе, когда много файлов на входе ?

а) генерировать много .ctl файлов
б) запускать с помощью perl SQLLDR для каждого обработанного файла
...
Рейтинг: 0 / 0
04.02.2019, 14:00
    #39769214
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
siner,
Кусок генерилки-запускалки. Список файлов предварительно в табличку files
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Prompt Шаг 3. Сгенерируем управляющий файл для загрузки файлов через SqlLoader
set feed off
set head off
set verify off
set trimspool on
spool &&_loadpath_./&&_loadlob_..ctl replace
prompt options ()
prompt    load data characterset CL8MSWIN1251
prompt    infile      '&&_loadpath_./&&_loadlob_..dat'
prompt    badfile     '&&_loadpath_./&&_loadlob_..bad' 
prompt    discardfile '&&_loadpath_./&&_loadlob_..dis'
prompt    append
prompt    into table &&_O_OWNER_..file_data
prompt    fields terminated by ';' optionally enclosed by '"'
prompt    TRAILING NULLCOLS
prompt    (  
prompt     id,	
prompt     blob_filename boundfiller,
prompt     blob_data     LOBFILE(blob_filename) TERMINATED BY EOF	
prompt    )
spool off
spool &&_loadpath_./&&_loadlob_..dat replace

select to_char(id)|| ';"&&_loadpath_./'||filename||'"' 
  from &&_O_OWNER_..files f;
  
spool off

spool &&_SPOOL_FILE_. append

Prompt Шаг 4. Вызываем загрузчик SQL*Loader для загрузки файлов

host sqlldr userid=&&_O_OWNER_./&&_O_PASS_.@&&_CONNECT_IDENTIFIER. control=&&_loadpath_./&&_loadlob_..ctl log=&&_loadlob_..log
...
Рейтинг: 0 / 0
04.02.2019, 14:30
    #39769231
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
Необязательно использовать базу. Вариант с поочередной загрузкой каждого файла.

Код: plaintext
L.cmd
Код: sql
1.
2.
rem грузим все найденные CSV
forfiles /S /M *.csv /C "cmd /C LD @file" 



Код: plaintext
LD.cmd
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@echo off
set fl=%1
echo OPTIONS (SKIP=1) > tmp.ctl
echo load data >> tmp.ctl
echo append >> tmp.ctl
echo into table tab1 >> tmp.ctl
echo fields terminated by ';' >> tmp.ctl
echo TRAILING NULLCOLS  >> tmp.ctl
echo ( F1 CHAR(4000)  >> tmp.ctl
echo , F2 CHAR(4000)  >> tmp.ctl
echo , FNAME CONSTANT '%fl' >> tmp.ctl
echo ) >> tmp.ctl

sqlldr user/pass@db control=tmp.ctl data=%1



ps: forfiles и findstr в винде - аналоги find и grep в *nix, их использование порой бывает очень удобно.
...
Рейтинг: 0 / 0
04.02.2019, 14:58
    #39769261
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
MazoHistforfiles и findstr в винде
Во блин я динозавр, до сих пор обычными for и find пользуюсь :)
...
Рейтинг: 0 / 0
04.02.2019, 15:13
    #39769274
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
andrey_anonymousMazoHistforfiles и findstr в винде
Во блин я динозавр, до сих пор обычными for и find пользуюсь :)
Аналогично... :(
Максимум нашел как подстроку вырезать
...
Рейтинг: 0 / 0
05.02.2019, 09:00
    #39769489
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
MazoHist,

Спасибо. Файл L.cmd в *nix как будет выглядеть?
...
Рейтинг: 0 / 0
05.02.2019, 09:43
    #39769500
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
sinerMazoHist,

Спасибо. Файл L.cmd в *nix как будет выглядеть?

Код: sql
1.
 find . -type f -name *.csv -exec ld.sh {} \;
...
Рейтинг: 0 / 0
05.02.2019, 10:23
    #39769527
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
MazoHist,

Был бы очень благодарен, если бы вы изменили и второй скрипт под *nix.
...
Рейтинг: 0 / 0
05.02.2019, 10:32
    #39769530
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
siner,

Код: plaintext
ld.sh
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#!/bin/sh
echo "OPTIONS (SKIP=1)" > tmp.ctl
echo "load data" >> tmp.ctl
echo "append" >> tmp.ctl
echo "into table tab1" >> tmp.ctl
echo "fields terminated by ';'" >> tmp.ctl
echo "TRAILING NULLCOLS"  >> tmp.ctl
echo "( F1 CHAR(4000)"  >> tmp.ctl
echo ", F2 CHAR(4000)"  >> tmp.ctl
echo ", FNAME CONSTANT '$1'" >> tmp.ctl
echo ")" >> tmp.ctl

sqlldr user/pass@db control=tmp.ctl data=$1
...
Рейтинг: 0 / 0
05.02.2019, 10:42
    #39769540
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
MazoHist,

В первом файле нужен аргумент после
find . -type f -name *.csv -exec ld.sh {} \; ?

Дело в том что имя найденного файла не передается во второй скрипт, по крайней мере его нет в ctl-файле
...
Рейтинг: 0 / 0
05.02.2019, 10:46
    #39769543
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
sinerMazoHist,

В первом файле нужен аргумент после
find . -type f -name *.csv -exec ld.sh {} \; ?

Дело в том что имя найденного файла не передается во второй скрипт, по крайней мере его нет в ctl-файле

Проверка что передается:
Код: plsql
1.
find . -type f -name *.csv -exec echo ld.sh {} \;




Для отладки shell

Код: plsql
1.
2.
3.
4.
#!/bin/sh
set -vx
echo "OPTIONS (SKIP=1)" > tmp.ctl
...
...
Рейтинг: 0 / 0
05.02.2019, 11:18
    #39769559
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
siner,
в моем примере ld.sh должен быть исполняемым. Либо chmod +x ld.sh либо поменять строку на -exec sh ld.sh {} \;
...
Рейтинг: 0 / 0
05.02.2019, 13:24
    #39769633
siner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Loader
MazoHist,

Большое спасибо
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL Loader / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]