powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL Loader
20 сообщений из 20, страница 1 из 1
SQL Loader
    #39768828
siner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Мне надо с помощью 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
SQL Loader
    #39768833
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sinerЕсли поставить INFILE *, то что нужно …, чтобы имя файла, из которого происходит загрузка, записывалось в таблицу?Такое не поддерживается. CTL придётся генерировать. STFF
...
Рейтинг: 0 / 0
SQL Loader
    #39768906
siner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, подскажите, пожалуйста, как реализовать считывание имени файла и его запись в таблицу.
...
Рейтинг: 0 / 0
SQL Loader
    #39768942
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL Loader
    #39768992
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL Loader
    #39768998
siner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661, Спасибо, данный способ подходит только для случая когда в директории находится один файл с данными?
...
Рейтинг: 0 / 0
SQL Loader
    #39768999
siner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin, спасибо
...
Рейтинг: 0 / 0
SQL Loader
    #39769005
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sinerданный способ подходит только для случая когда в директории находится один файл с данными?

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

а) генерировать много .ctl файлов
б) запускать с помощью perl SQLLDR для каждого обработанного файла
...
Рейтинг: 0 / 0
SQL Loader
    #39769214
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL Loader
    #39769231
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необязательно использовать базу. Вариант с поочередной загрузкой каждого файла.

Код: 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
SQL Loader
    #39769261
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistforfiles и findstr в винде
Во блин я динозавр, до сих пор обычными for и find пользуюсь :)
...
Рейтинг: 0 / 0
SQL Loader
    #39769274
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousMazoHistforfiles и findstr в винде
Во блин я динозавр, до сих пор обычными for и find пользуюсь :)
Аналогично... :(
Максимум нашел как подстроку вырезать
...
Рейтинг: 0 / 0
SQL Loader
    #39769489
siner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MazoHist,

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

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

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

Был бы очень благодарен, если бы вы изменили и второй скрипт под *nix.
...
Рейтинг: 0 / 0
SQL Loader
    #39769530
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL Loader
    #39769540
siner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MazoHist,

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

Дело в том что имя найденного файла не передается во второй скрипт, по крайней мере его нет в ctl-файле
...
Рейтинг: 0 / 0
SQL Loader
    #39769543
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL Loader
    #39769559
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
siner,
в моем примере ld.sh должен быть исполняемым. Либо chmod +x ld.sh либо поменять строку на -exec sh ld.sh {} \;
...
Рейтинг: 0 / 0
SQL Loader
    #39769633
siner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MazoHist,

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


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