powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / загрузка файла с разделителями в виде '~'
17 сообщений из 17, страница 1 из 1
загрузка файла с разделителями в виде '~'
    #40086990
Добрый день
пытаюсь грузить файл с помощью sql*loader используя bat и ctl файлов

в ctl файле указываю:

OPTIONS(skip=1)
LOAD DATA
CHARACTERSET 'RU8PC866'
INFILE '<имя файла>'
APPEND INTO TABLE <код таблицы>
fields terminated by '~' TRAILING NULLCOLS

в bat файле
set nls_lang=american_america.al32utf8
sqlldr <подключение к БД> control=acu.ctl DIRECT=TRUE errors=100000

при этом в логе ругается
SQL*Loader-350: Syntax error at line 7.
Illegal combination of non-alphanumeric characters
fields terminated by '~' TRAILING NULLCOLS

т.е ругается именно на разделитель
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087000
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирков,

Попробуйте использовать hex код
Код: plsql
1.
fields terminated by x'7e'
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087002
Vadim Lejnin,

на ваш вариант тоже ругается, попробовал указать

Код: plsql
1.
fields terminated ~



но сейчас начало ругаться на незакрытые кавычки

Код: plsql
1.
SQL*Loader-649: Quoted string missing closing quote
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087009
поменял ctl файл, сделал

Код: plsql
1.
2.
3.
4.
5.
6.
7.
OPTIONS(skip=1)
LOAD DATA
INFILE '<имя файла>'
APPEND INTO <код таблицы>
fields terminated '~'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS



но теперь уже начало ругаться на содержимое файла
Код: plsql
1.
2.
Record 148: Rejected - Error on table EXTR.ACC_NIBBD_ACU, column CLI_NAME.
no terminator found after TERMINATED and ENCLOSED field



в тексте файла вот так
Код: plsql
1.
"Alisher Navoiy nomidagi O"zbekiston Milliy kutubxonasi"  



но есть же опция OPTIONALLY ENCLOSED BY '"'

почему она не срабатывает ?
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087010
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирков
APPEND INTO TABLE <код таблицы>
А не наоборот?
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087012
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирковв тексте файла вот так

Плохо сформированный файл, вложенные кавычки не удвоены.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087017
а еще вопрос как правильно дату из текста обработать?

в тексте дата в формате dd.mm.yyyy
в ctl поле
Код: plsql
1.
reg_date    DATE



вижу в логе идет преобразование в другом формате

Код: plsql
1.
REG_DATE                             NEXT     *   ~  O(") DATE DD-MON-RR
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087018
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирковвижу в логе идет преобразование в другом формате

https://www.google.com/search?q=oracle sqlloader date format
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087022
добавил в ctl формат даты
Код: plsql
1.
reg_date    DATE "dd.mm.yyyy"



но в файле попадаются даты в виде 00.00.0000
их как то можно обработать, чтобы не откидывало строки в bad файл ?
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087028
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогнать предварительно файл через sed. Заодно и некорректные кавычки поправишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087041
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирков,

попробуйте (я не проганял)
Код: plsql
1.
2.
3.
, reg_date "CASE when :reg_date='00.00.0000' then date '0001-01-01'
       else to_date(:reg_date,'dd.mm.yyyy')
       END"



.....
stax
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087045
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирков
д
но в файле попадаются даты в виде 00.00.0000
их как то можно обработать, чтобы не откидывало строки в bad файл ?

Можно. Например 00.00.0000 => 31.12.9999:
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
C:\temp>type zero_date.ctl
load data
  infile 'c:\temp\zero_date.dat'
  append
    into table tbl
    fields terminated by ','
    trailing nullcols
    (
     dt "decode(:dt,'00.00.0000',date '9999-12-31',to_date(:dt,'dd.mm.yyyy'))"
    )

C:\temp>type zero_date.dat
29.07.2021
00.00.0000
C:\temp>sqlldr scott@pdb1sol122/tiger control=zero_date.ctl direct=true

SQL*Loader: Release 12.2.0.1.0 - Production on Thu Jul 29 07:07:13 2021

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

Path used:      Direct

Load completed - logical record count 2.

Table TBL:
  2 Rows successfully loaded.

Check the log file:
  zero_date.log
for more information about the load.

C:\temp>sqlplus scott@pdb1sol122/tiger

SQL*Plus: Release 12.2.0.1.0 Production on Thu Jul 29 07:07:40 2021

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Last Successful login time: Thu Jul 29 2021 07:07:14 -04:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> alter session set nls_date_format='dd.mm.yyyy';

Session altered.

SQL> select * from tbl;

DT
----------
29.07.2021
31.12.9999

SQL>



SY.
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087068
с датами решил пока не заморачиватся гружу в текстовое поле

но возникла еще одна проблема, надо загрузить несколько файлов из директории
причем имя загружаемого файла должно вставляться в поле таблицы

я нашел пример
https://stackoverflow.com/questions/4552947/use-parameters-with-ctl

Код: plsql
1.
2.
3.
4.
5.
set nls_lang=american_america.al32utf8
for /f "tokens=*" %%I in ('dir /b <путь к директории>\*.ACU') do (
	sqlldr <подключение к базе> data=%%I control=acu.ctl DIRECT=TRUE errors=100000
)
pause



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 

INFILE '$datfilename$'

TRAILING NULLCOLS
(
...
file_name   constant '$datfilename$'
)



сделал аналогично, имя файла успешно передается из bat файла в ctl, но почему то при вставке в таблицу
не заменяет $datfilename$ на конкретное имя файла

может кто знает, как правильно сделать ?
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087108
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирков

они в контоле меняют шаблон на имя файла
findandreplace my_loader_temp.ctl "$datafilename$" "%1"

.....
stax
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087110
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

они в контоле меняют шаблон на имя файла
findandreplace my_loader_temp.ctl "$datafilename$" "%1"


Т.е. чукчи ("они")писатели а не читатели SQL*Loader параметры командной строки. Тупо убираем infile из ctl и указываем в командной строке:


Код: 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.
C:\temp>type zero_date.ctl
load data
  append
    into table tbl
    fields terminated by ','
    trailing nullcols
    (
     dt "decode(:dt,'00.00.0000',date '9999-12-31',to_date(:dt,'dd.mm.yyyy'))"
    )

C:\temp>set DATAFILE=c:\temp\zero_date.dat

C:\temp>sqlldr scott@pdb1sol122/tiger control=zero_date.ctl direct=true data=%DATAFILE%

SQL*Loader: Release 12.2.0.1.0 - Production on Thu Jul 29 09:38:53 2021

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

Path used:      Direct

Load completed - logical record count 2.

Table TBL:
  2 Rows successfully loaded.

Check the log file:
  zero_date.log
for more information about the load.

C:\temp>



SY.
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40087122
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY

Т.е. чукчи ("они")писатели а не читатели SQL*Loader параметры командной строки. Тупо убираем infile из ctl и указываем в командной строке:



я тоже чукча
не знаю (вернее не помню) как через лоадер записать имя файла в поле таблицы

напр tbl(f varchar2(100), dt date)

надо в f записать имя файла %DATAFILE%

зы
yfgh посложнее
LOAD DATA
INFILE 'file001.DAT'
INFILE 'file002.DAT'
APPEND
INTO TABLE "TBL"
...

.....
stax
...
Рейтинг: 0 / 0
загрузка файла с разделителями в виде '~'
    #40088001
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Чирков

но возникла еще одна проблема, надо загрузить несколько файлов из директории
причем имя загружаемого файла должно вставляться в поле таблицы


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


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