:: Не фоксом единым
Загрузка DBF-файла в Oracle
sphinx
Автор

Сообщений: 31182
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Как правильно ее организовать?
Есть несколько способов загрузки:

1) SQLLoader. Есть примеры, как грузить DBF-файлы напрямую, без перевода в CSV-формат. Но будет ли он понимать memo-поля, спец.символы и пр.? Ну и смущает, что не Oracle загружает, а какой-то внешней командой (которую, можно и из Oracle запустить). Из плюсов - скорость!

2) Загрузка из Oracle при помощи пакетов типа dbase_pkg (кстати, у кого есть нормальноработающий ?) Удобства побольше, но невысокая скорость. Может еще что есть...

3) Через Фокс-клиента (INSERT-SQL, CA). На клиенте сейчас как раз не хочется - кто его знает, может завтра клиентом будет Delphi, поэтому бизнес-логику, и сервисный функционал логичнее (вроде как) отдать СУБД.


Какие будут замечания/предложения?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Грузить из dbf sql loader не умеет. Да, можно путём некоторых нехитрых манипуляций превратить dbf в файл "fixed structure" - отрезать заголовок, составить ctl файл со смещениями к каждому полю. Никаких memo, естественно, в таком случае не загрузить. Новые VFP типы - тоже (поскольку они бинарные и, насколько я помню, не соответствуют "бинарным" типам оракла). Т.е по сути только C, N и D поля можно так забрать. Кодировка настраивается.
Но я бы сказал что проще именно сделать csv файл того или иного рода (заодно можно убрать фоксовую тупость с добиванием символьных полей пробелами до размера поля - меня всегда тянет к унитазу когда я вижу в оракле такие "дополненные пробелами" поля, корректно преобразовать пустые даты, те же L поля перевести в принятый у вас вид - 1 как true или 0).

Ни про какие dbase_pkg я никогда не слышал. Сомневаюсь, точнее даже СИЛЬНО сомневаюсь что это что-то стоящее.

Да, через фоксового клиента загрузить тоже можно - только на сервер его тебе вряд ли позволят поставить - тем более что сервер может должен быть и не виндовым. А вот скрипт для sqlldr и сами csv файлы - вполне могут разрешить там держать - или даже настроить External Tables - чтобы не с консоли сервера запускать "процесс", а прямо из самого оракла - просто положив файл в нужную папку на сервере.
Есть некоторые техники по ускорению загрузки - ручное управление транзакциями, например... Впрочем это в любом случае будет медленнее чем sqlldr.

sphinx
может завтра клиентом будет Delphi, поэтому бизнес-логику, и сервисный функционал логичнее (вроде как) отдать СУБД.
Тогда именно csv (ну точнее текстовый файл того или иного вида) и нужно делать - от вашего ПО потребуется только файл готовить...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
ВладимирС

Сообщений: 1693
Дата регистрации: 03.11.2005
Конечно Игорь классно поясняет.
Внесу своё...
SQLLoader - одно из самых быстрых загрузок данных в оракл.
Если dbf-файлов много, то лучше (по моему) написать прогу, которая парсила бы dbf-файл (рассматривая его на низком уровне) и записывать данные в csv-файл, а так же создание сразу для него: bat-файл, ctl-файл.
Лично я именно так когда-то грузил ФИАС (dbf) в таблицы оракла.



Исправлено 1 раз(а). Последнее : ВладимирС, 07.06.17 06:54
Ratings: 0 negative/1 positive
Re: Загрузка DBF-файла в Oracle
ВладимирС

Сообщений: 1693
Дата регистрации: 03.11.2005
Блин, почему дублируется...
Стер содержимое.



Исправлено 1 раз(а). Последнее : ВладимирС, 07.06.17 06:53
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
sphinx
Автор

Сообщений: 31182
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Igor Korolyov
Грузить из dbf sql loader не умеет.

Умел, точно - до 7-й версии, используя особый формат описания, который начинался с "DB3 <длина_записи>". А сегодняшние версии понимают многосимвольные разделители:

Цитата:
В современных версиях sqlldr понимает много-символьные разделители полей. Например такой - %$#@.
Создавайте из dbf текстовый файлик с такими разделителями, и далее он через sqlldr пулей вольется в оракла.

Кроме того, можно попробовать заливать через гетерогенный сервис. А еще люди заливают DBF через Java, которая родная для Оракла, скорость вроде неплохая.

Я про альтернативные способы надеялся услышать, а не про SQLLoader, которым я грузил в свое время. Вот положат файл в один-единственный каталог, у которого нет прав на запись. Как Лоадером грузить? Ну и создавать на клиенте текстовый файл из DBF - что-то не хочется, т.к. файл может будем считывать каждый час для актуализации данных.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Обычно в оракле поддерживается работа +-2 версии. Т.е. утилиты от 7-й версии максимум с 9-й смогут работать, да и то не факт. В любом случае я бы не советовал.
Гетерогенный сервис - запаришься поднимать, тем более что адекватного драйвера для VFP таблиц нет (максимум - 6-ный).
Java хоть и родная для сервера, но для dbf это... В общем не нужно.

Зачем тебе альтернативы? Есть много способов надеть штаны через голову - только они все примерно одинаковый результат дают. А надеть их "обычным образом" проще всего именно при помощи текстового файла (не нужны там всякие %$#@ - это для альтернативно одарённых варианты - вполне достаточно выбрать один вариант кавычек и просто экранировать его "внутри строк") и sqlldr - при том можно именно на сервере, и 2-мя способами - один через External tables потребует только прав на то чтобы положить файлик в доступное серверу место (на его диск или на примонтированную сетевую шару).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
ВладимирС

Сообщений: 1693
Дата регистрации: 03.11.2005
sphinx
...Вот положат файл в один-единственный каталог, у которого нет прав на запись. Как Лоадером грузить? Ну и создавать на клиенте текстовый файл из DBF - что-то не хочется, т.к. файл может будем считывать каждый час для актуализации данных.
Тогда создавать сервис (java, C#, ...), который парсит dbf-файл в определенные времена и отсылать инфу через соединение в оракл.
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Опять же - ну НЕТ, НЕТ прямых/простых/быстрых способов читать dbf файл ни в java ни в C#. Цеплять ADO провайдер - по мне так извращение, если ЕСТЬ возможность запускать сам фокс.

Если и делать такого рода "сервис", то на том же фоксе с которым и работает система (надеюсь это не FPD). Ну или хотя-бы часть "конвертации в csv" на нём писать - csv универсальный формат, и может создаваться любой системой - равно и разбирать его может любая система, в т.ч. и имеющийся в поставке оракла sqlldr. "Периодическую работу" тоже вполне может делать сам сервер через механизм планировщика (в старых версиях job, в новых dbms_scheduler).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Igor Korolyov
Опять же - ну НЕТ, НЕТ прямых/простых/быстрых способов читать dbf файл ни в java ни в C#.

Среди мегатонн разных либ, нет ни одной, позволяющей распарсить дбф? Неожиданно...
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Хм, первая же строчка в выдаче гугля - джава-либа для работы с дбф dans-dbf-lib.sourceforge.net
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Igor Korolyov
Опять же - ну НЕТ, НЕТ прямых/простых/быстрых способов читать dbf файл ни в java ни в C#.

Г*на, вестимо, хватает с избытком...
Или криво, или медленно, или будут мешать работе основного софта (вряд ли заинтересует библиотека способная читать только из монопольно открываемого файла - тогда смысл во всём этом, если то же даст COPY TO ... TYPE ...)


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Загрузка DBF-файла в Oracle
sphinx
Автор

Сообщений: 31182
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Давай заберу на работе механизм Java, которым коллега импортирует DBF на Oracle. И заодно протоколы работы - чтобы оценить скорость загрузки. Он бы кривыми вещами не стал пользоваться, уж поверь на слово.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну у нас есть "Clipper-oracle порт" - на древнем сибилдере писанная утиль перекачивающая данные между ораклом и dbf-ами. Она не только "тупо dbf" погрузить в таблицу оракла может, она ещё и "командные файлы" обрабатывает - типа запросы произвольные исполняет с выгрузкой результата в dbf клипперного формата. Только когда понадобилось из VFP таблиц данные перебрасывать, я даже не задумывался о том "а не прикрутить ли это к данной утилите"
Сделать можно ВСЁ - вопрос в целесообразности и эффективности. Если "есть способ проще" и тем более "способ лучше"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
sphinx
Автор

Сообщений: 31182
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Igor Korolyov
Если "есть способ проще" и тем более "способ лучше"
Заливать файлов надо будет много, а с СклЛоадером это много увеличится в 3-4 раза (bat + ctl + csv). Это тоже смущает... Я все же гляну на Оракловые пакеты (dbase_pkg, dbase_fox и др.), чтобы иметь представление о их кривизне. А по скорости... Вроде не такие объемы, чтобы скорость роляла, да и мега-монстров можно как раз Лоадером грузить, сделать исключения. Может такой смешанный подход и будет лучшим решением.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если скорость не очень важна, то на VFP утилитка пишется и всё. От "деревянной" где в коде всё тупо напрямую прописано, до "совсем гибкой" - которая хоть бы и сами таблицы в оракле по структуре фоксовых будет делать.

Батник для запуска sqlldr (который в общем то тривиален - по сути одна команда вызова и есть - просто чтобы не вводить каждый раз логин/пароль да имя ctl файла сохраняют команду запуска в командный файл), равно как и ctl файл могут быть заменены external таблицей.

Просто изо всей кучи возможных вариантов для загрузки dbf какие-то левые "пакеты" я бы рассматривал в ПОСЛЕДНЮЮ очередь (они, поди, потребуют прав неслабых и ровно то же самое копирование dbf файлов в папку доступную серверу). А писание утилиты экспорта на java/c#/c++ (особенно при незнании оных) на предпоследнем.
Выбирал бы из комбинации VFP программа "подготовки" и sqlldr (запуск напрямую, или через external tables) или чисто vfp программа загрузки.

P.S.
Цитата:
Заливать файлов надо будет много, а с СклЛоадером это много увеличится в 3-4 раза (bat + ctl + csv). Это тоже смущает
Программиста - ни разу не смущает. Он это универсализирует тем или иным способом - например нарисует на том же фоксе (или на любом другом известном ему языке) тривиальную генерилку ctl файлов.
Кстати, вполне можно объединить и ctl (описательную часть) и сами данные в одном текстовом файле. Если этот файл будет создавать фокс, то и карты в руки - он и заголовок и сами данные в соответствующем виде сгенерирует. Это, правда не сработает с "внешними таблицами" насколько я понимаю, зато процесс запуска sqlldr с клиента или консоли сервера - упростит.


------------------
WBR, Igor




Исправлено 2 раз(а). Последнее : Igor Korolyov, 08.06.17 20:27
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
ВладимирС

Сообщений: 1693
Дата регистрации: 03.11.2005
sphinx
Заливать файлов надо будет много, а с СклЛоадером это много увеличится в 3-4 раза (bat + ctl + csv). Это тоже смущает... Я все же гляну на Оракловые пакеты (dbase_pkg, dbase_fox и др.), чтобы иметь представление о их кривизне. А по скорости... Вроде не такие объемы, чтобы скорость роляла, да и мега-монстров можно как раз Лоадером грузить, сделать исключения. Может такой смешанный подход и будет лучшим решением.
И придешь потом к выводу, что sqlloader быстрее и легче. А то что сформировать файлы csv, bat, ctl это надо просто одну прогу написать и все.
Ratings: 0 negative/1 positive
Re: Загрузка DBF-файла в Oracle
sphinx
Автор

Сообщений: 31182
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
ВладимирС
И придешь потом к выводу, что sqlloader быстрее и легче.

При этом совсем не факт, что подходит для задачи
Дело в том, что нам приходится заливать почти ненормализованные данные (нормализацию как раз в Оракле и проводим), а значит в текстовом поле могут встречаться, к примеру кавычки - эту ситуацию приходится обрабатывать (я просто заменой на апостроф, ибо НЕПРИНЦИПИАЛЬНО, как закавычили название). В МЕМО-поле есть символ перевода строки, есть пустые даты и прочее. И что еще выкинут пользователи - не угадать. SQLLoader все же очень требовательный инструмент. А раз файлы небольшие - их можно грузить каким-нибудь пакетом из самого Оракла (я про это писал), или даже настроить External Tables, у нас вроде такое было, когда в банке работал.

Пока сделал на SQLLoader, ибо пакета по загрузке DBF пока нет. Думаю, можно написать для сравнения программку для заливки с фоксового клиента - там кода вроде нет никакого SQLCONNECT() и INSERT INTO... SELECT... FROM, или через курсор-адаптер (кстати, что быстрее получится?)


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
От "деревянной" где в коде всё тупо напрямую прописано
Эх, золотые девяностые... Когда каждый дятел стремился написать свою версию если не операционки, то хотя бы бухгалтерии... Можно всё успеть - если делать это в коде, а не выносить в какие то там настройки...



Исправлено 1 раз(а). Последнее : S-type, 20.06.17 13:34
Ratings: 0 negative/0 positive
Re: Загрузка DBF-файла в Oracle
Гулин Федор

Сообщений: 4640
Откуда: Минск
Дата регистрации: 24.10.2002
ВладимирС
sphinx
Заливать файлов надо будет много, а с СклЛоадером это много увеличится в 3-4 раза (bat + ctl + csv). Это тоже смущает... Я все же гляну на Оракловые пакеты (dbase_pkg, dbase_fox и др.), чтобы иметь представление о их кривизне. А по скорости... Вроде не такие объемы, чтобы скорость роляла, да и мега-монстров можно как раз Лоадером грузить, сделать исключения. Может такой смешанный подход и будет лучшим решением.
И придешь потом к выводу, что sqlloader быстрее и легче. А то что сформировать файлы csv, bat, ctl это надо просто одну прогу написать и все.

ага тоже когда то писал генератор CTL по дбф - правда еще по досовской версии
csv по моему руками выгружал но export там тоже есть
помню что надо даты фоксовские пустые как то кастить - в нулл по моему проще всего.


зы а новые типы я без понятия если они выгружаются в csv тогда наверно можно
если нет тогда ХЗ

pps А мемо с разделителями это задача - нав. chr(13) как то экранируется в скл-лоадере
на крайняк менять их скажем на ~~ а потом назад в оракле - хотя конечно это НЕ гут - и доп. издержки и доп.время на пост-обработку
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 10 PaulWist  (Гостей: 9)

© 2000-2024 Fox Club 
Яндекс.Метрика