powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / sql *loader. Commit в конце
13 сообщений из 13, страница 1 из 1
sql *loader. Commit в конце
    #37941838
askkas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. В связи с производственной необходимостью возникла задача грузить при помощи SQL Loader в Oracle текстовый документ с разделителями, содержащий порядка 5 млн. записей. И в случае, если хотя бы в одной из записей имеется ошибка (длина поля не совпадает с заявленной, недопустимые символы и т.д.), в базу Oracle не попала бы ни одна запись из этого файла. Другими словами если в момент импорта 5 млн. встречается ошибочная запись, должен выполняться ROLLBACK, а если после импорта 5 млн. ошибок не было выявлено, то COMMIT ?
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37941973
Фотография Edward Shevtsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
askkas,

эта задача решается предварительной очисткой данных, а не движком СУБД. Perl - идеально.
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37941976
Фотография Изя Кацман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Грузи свой файл в BLOB (STORE AS SECUREFILE в Oracle 11g)
для уверенности можешь считать MD5 этого файла, считать MD5 BLOBа и сравнивать.
Потом из BLOBa растаскивай в нужную таблицу одной транзакцией.
Стартовать проверку MD5 и ратаскивание может триггер на таблицу с BLOBом типа AFTER INSERT

2. Создай внешнюю таблицу (external table ... ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER ...)...), загружай данные через нее одной транзакцией,
анализируй наличие bad-файла, используй PREPROCESSOR

3. Другие варианты думай, камрад
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37941982
Фотография Изя Кацман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
askkas,

А что же это за файл такой у тебя могучий, камрад?
Сам его генегишь или получаешь от кого-то, кто его генерит?
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37942018
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
askkas,

А с DB сервера файл доступен? Если да, то можно external table c reject limit 0.

SY.
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37942523
askkas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, будем пробовать) А файлик - это ежедневный отчет, который формируется другой программой и в другом формате - локально. Результаты вычислений планируется хранить на сервере.
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37942700
Фотография Изя Кацман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYА с DB сервера файл доступен? Если да, то можно external table c reject limit 0 .
Да, точно! Это оно! Спасибо, камрад! :)
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37942725
Фотография Изя Кацман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
askkasА файлик - это ежедневный отчет, который формируется другой программой и в другом формате - локально. Результаты вычислений планируется хранить на сервере.
Загрузку етого одного (?) файла раз в день делать надо? Или как?

Ету программу ты можешь модернизировать так, чтобы в самом конце была строчка вида
Код: plsql
1.
MY_FILE_END 5123456


Тут 5123456 - ето число строк которые нужно загрузить из твоего файла
То есть ты еще как-то должен при формировании их посчитать

Ну, или руками добавлять такую строку сможешь?
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37943270
askkas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, все верно. Файл формируется на локальной машине в виде DBF таблицы VisualFoxpro. Количество записей известно. Загружаем его один раз в сутки. Метод с external table "политика партии" использовать не разрешает. Хотелось бы подробнее узнать про строку MY_FILE_END - для чего и где ее использовать?
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37943363
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изя КацманЕту программу ты можешь модернизировать так, чтобы в самом конце была строчка вида


А что это даст? У SQL*Loader буфер не резиновый, посему как наполнится так и будет commit. Посему все равно нужна staging table. Это типичная ETL задача. Грузи в staging table. Анализируй SQL*Loader лог. Нет ошибок, запускай следующий шаг - insert из staging table в основную.

SY.
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37956554
Фотография Изя Кацман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYИзя КацманЕту программу ты можешь модернизировать так, чтобы в самом конце была строчка вида

А что это даст? У SQL*Loader буфер не резиновый, посему как наполнится так и будет commit. Посему все равно нужна staging table. Это типичная ETL задача. Грузи в staging table. Анализируй SQL*Loader лог. Нет ошибок, запускай следующий шаг - insert из staging table в основную.Ето даст возможность последнюю строчку загружать в другую таблицу,
у которой будет триггер, который выполнит всю необходимую обработку

То есть:
1. Если в позициях 1:11 не содержится MY_FILE_END, грузим данные в staging table 1
2. Если в позициях 1:11 содержится MY_FILE_END, грузим ету строку в staging table 2
3. Запускается триггер AFTER INSERT FOR EACH ROW, имеющийся у staging table 2
Етот триггер проверяет число загруженных строк
- если оно совпадает с указанным в строке MY_FILE_END 5123456,
то данные из staging table 1 переписываются в target table
- если оно НЕ совпадает с указанным в строке MY_FILE_END 5123456,
то данные из staging table 1 НЕ переписываются в target table,
а в таблицу лога загрузки записывается информация о возникшей коллизии
...
Рейтинг: 0 / 0
sql *loader. Commit в конце
    #37956575
Фотография Изя Кацман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изя КацманSYпропущено...

А что это даст? У SQL*Loader буфер не резиновый, посему как наполнится так и будет commit. Посему все равно нужна staging table. Это типичная ETL задача. Грузи в staging table. Анализируй SQL*Loader лог. Нет ошибок, запускай следующий шаг - insert из staging table в основную.Ето даст возможность последнюю строчку загружать в другую таблицу,
у которой будет триггер, который выполнит всю необходимую обработку
Недостаток етого подхода в том, что придется выставить для SQL*Loader параметр ROWS=1
Тогда COMMIT будет после каждой строки и всё сработает штатно
Но COMMIT после каждой строки, выполненный 50 млн. раз может сильно повысить нагрузку на БД
А как иначе сделать, чтобы триггер, имеющийся у staging table 2, получил консистентное состояние staging table 1 я не знаю

Хотя вроде бы оно все равно должно получиться,
даже если COMMIT будет через произвольное число строк.
Нет?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
sql *loader. Commit в конце
    #39322707
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
askkas,
не пробовали поиграться с параметром "commit_discontinued -- фиксировать загруженные строки, когда загрузка прекращена (По умолчанию FALSE)"? вроде как можно загрузить все без коммита, а потом сделать проверку лога, например. Если есть, транк таблички.
правда хд может умереть от коммита на 5 млн строк..

не претендую на самый лучший совет :)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / sql *loader. Commit в конце
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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