Загрузка 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!"(с) |
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 (ну точнее текстовый файл того или иного вида) и нужно делать - от вашего ПО потребуется только файл готовить... ------------------ WBR, Igor |
Re: Загрузка DBF-файла в Oracle | |
---|---|
ВладимирС Сообщений: 1693 Дата регистрации: 03.11.2005 |
Конечно Игорь классно поясняет.
Внесу своё... SQLLoader - одно из самых быстрых загрузок данных в оракл. Если dbf-файлов много, то лучше (по моему) написать прогу, которая парсила бы dbf-файл (рассматривая его на низком уровне) и записывать данные в csv-файл, а так же создание сразу для него: bat-файл, ctl-файл. Лично я именно так когда-то грузил ФИАС (dbf) в таблицы оракла. Исправлено 1 раз(а). Последнее : ВладимирС, 07.06.17 06:54 |
Re: Загрузка DBF-файла в Oracle | |
---|---|
ВладимирС Сообщений: 1693 Дата регистрации: 03.11.2005 |
Блин, почему дублируется...
Стер содержимое. Исправлено 1 раз(а). Последнее : ВладимирС, 07.06.17 06:53 |
Re: Загрузка DBF-файла в Oracle | |
---|---|
sphinx Автор Сообщений: 31182 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Умел, точно - до 7-й версии, используя особый формат описания, который начинался с "DB3 <длина_записи>". А сегодняшние версии понимают многосимвольные разделители: Цитата: Кроме того, можно попробовать заливать через гетерогенный сервис. А еще люди заливают DBF через Java, которая родная для Оракла, скорость вроде неплохая. Я про альтернативные способы надеялся услышать, а не про SQLLoader, которым я грузил в свое время. Вот положат файл в один-единственный каталог, у которого нет прав на запись. Как Лоадером грузить? Ну и создавать на клиенте текстовый файл из DBF - что-то не хочется, т.к. файл может будем считывать каждый час для актуализации данных. ------------------ "Veni, vidi, vici!"(с) |
Re: Загрузка DBF-файла в Oracle | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Обычно в оракле поддерживается работа +-2 версии. Т.е. утилиты от 7-й версии максимум с 9-й смогут работать, да и то не факт. В любом случае я бы не советовал.
Гетерогенный сервис - запаришься поднимать, тем более что адекватного драйвера для VFP таблиц нет (максимум - 6-ный). Java хоть и родная для сервера, но для dbf это... В общем не нужно. Зачем тебе альтернативы? Есть много способов надеть штаны через голову - только они все примерно одинаковый результат дают. А надеть их "обычным образом" проще всего именно при помощи текстового файла (не нужны там всякие %$#@ - это для альтернативно одарённых варианты - вполне достаточно выбрать один вариант кавычек и просто экранировать его "внутри строк") и sqlldr - при том можно именно на сервере, и 2-мя способами - один через External tables потребует только прав на то чтобы положить файлик в доступное серверу место (на его диск или на примонтированную сетевую шару). ------------------ WBR, Igor |
Re: Загрузка DBF-файла в Oracle | |
---|---|
ВладимирС Сообщений: 1693 Дата регистрации: 03.11.2005 |
Тогда создавать сервис (java, C#, ...), который парсит dbf-файл в определенные времена и отсылать инфу через соединение в оракл. |
Re: Загрузка DBF-файла в Oracle | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Опять же - ну НЕТ, НЕТ прямых/простых/быстрых способов читать dbf файл ни в java ни в C#. Цеплять ADO провайдер - по мне так извращение, если ЕСТЬ возможность запускать сам фокс.
Если и делать такого рода "сервис", то на том же фоксе с которым и работает система (надеюсь это не FPD). Ну или хотя-бы часть "конвертации в csv" на нём писать - csv универсальный формат, и может создаваться любой системой - равно и разбирать его может любая система, в т.ч. и имеющийся в поставке оракла sqlldr. "Периодическую работу" тоже вполне может делать сам сервер через механизм планировщика (в старых версиях job, в новых dbms_scheduler). ------------------ WBR, Igor |
Re: Загрузка DBF-файла в Oracle | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Среди мегатонн разных либ, нет ни одной, позволяющей распарсить дбф? Неожиданно... |
Re: Загрузка DBF-файла в Oracle | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Хм, первая же строчка в выдаче гугля - джава-либа для работы с дбф dans-dbf-lib.sourceforge.net
|
Re: Загрузка DBF-файла в Oracle | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Г*на, вестимо, хватает с избытком... Или криво, или медленно, или будут мешать работе основного софта (вряд ли заинтересует библиотека способная читать только из монопольно открываемого файла - тогда смысл во всём этом, если то же даст COPY TO ... TYPE ...) ------------------ WBR, Igor |
Re: Загрузка DBF-файла в Oracle | |
---|---|
sphinx Автор Сообщений: 31182 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Давай заберу на работе механизм Java, которым коллега импортирует DBF на Oracle. И заодно протоколы работы - чтобы оценить скорость загрузки. Он бы кривыми вещами не стал пользоваться, уж поверь на слово.
------------------ "Veni, vidi, vici!"(с) |
Re: Загрузка DBF-файла в Oracle | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну у нас есть "Clipper-oracle порт" - на древнем сибилдере писанная утиль перекачивающая данные между ораклом и dbf-ами. Она не только "тупо dbf" погрузить в таблицу оракла может, она ещё и "командные файлы" обрабатывает - типа запросы произвольные исполняет с выгрузкой результата в dbf клипперного формата. Только когда понадобилось из VFP таблиц данные перебрасывать, я даже не задумывался о том "а не прикрутить ли это к данной утилите"
Сделать можно ВСЁ - вопрос в целесообразности и эффективности. Если "есть способ проще" и тем более "способ лучше" ------------------ WBR, Igor |
Re: Загрузка DBF-файла в Oracle | |
---|---|
sphinx Автор Сообщений: 31182 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Заливать файлов надо будет много, а с СклЛоадером это много увеличится в 3-4 раза (bat + ctl + csv). Это тоже смущает... Я все же гляну на Оракловые пакеты (dbase_pkg, dbase_fox и др.), чтобы иметь представление о их кривизне. А по скорости... Вроде не такие объемы, чтобы скорость роляла, да и мега-монстров можно как раз Лоадером грузить, сделать исключения. Может такой смешанный подход и будет лучшим решением. ------------------ "Veni, vidi, vici!"(с) |
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. Цитата:Программиста - ни разу не смущает. Он это универсализирует тем или иным способом - например нарисует на том же фоксе (или на любом другом известном ему языке) тривиальную генерилку ctl файлов. Кстати, вполне можно объединить и ctl (описательную часть) и сами данные в одном текстовом файле. Если этот файл будет создавать фокс, то и карты в руки - он и заголовок и сами данные в соответствующем виде сгенерирует. Это, правда не сработает с "внешними таблицами" насколько я понимаю, зато процесс запуска sqlldr с клиента или консоли сервера - упростит. ------------------ WBR, Igor Исправлено 2 раз(а). Последнее : Igor Korolyov, 08.06.17 20:27 |
Re: Загрузка DBF-файла в Oracle | |
---|---|
ВладимирС Сообщений: 1693 Дата регистрации: 03.11.2005 |
И придешь потом к выводу, что sqlloader быстрее и легче. А то что сформировать файлы csv, bat, ctl это надо просто одну прогу написать и все. |
Re: Загрузка DBF-файла в Oracle | |
---|---|
sphinx Автор Сообщений: 31182 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
При этом совсем не факт, что подходит для задачи Дело в том, что нам приходится заливать почти ненормализованные данные (нормализацию как раз в Оракле и проводим), а значит в текстовом поле могут встречаться, к примеру кавычки - эту ситуацию приходится обрабатывать (я просто заменой на апостроф, ибо НЕПРИНЦИПИАЛЬНО, как закавычили название). В МЕМО-поле есть символ перевода строки, есть пустые даты и прочее. И что еще выкинут пользователи - не угадать. SQLLoader все же очень требовательный инструмент. А раз файлы небольшие - их можно грузить каким-нибудь пакетом из самого Оракла (я про это писал), или даже настроить External Tables, у нас вроде такое было, когда в банке работал. Пока сделал на SQLLoader, ибо пакета по загрузке DBF пока нет. Думаю, можно написать для сравнения программку для заливки с фоксового клиента - там кода вроде нет никакого SQLCONNECT() и INSERT INTO... SELECT... FROM, или через курсор-адаптер (кстати, что быстрее получится?) ------------------ "Veni, vidi, vici!"(с) |
Re: Загрузка DBF-файла в Oracle | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Эх, золотые девяностые... Когда каждый дятел стремился написать свою версию если не операционки, то хотя бы бухгалтерии... Можно всё успеть - если делать это в коде, а не выносить в какие то там настройки... Исправлено 1 раз(а). Последнее : S-type, 20.06.17 13:34 |
Re: Загрузка DBF-файла в Oracle | |
---|---|
Гулин Федор Сообщений: 4640 Откуда: Минск Дата регистрации: 24.10.2002 |
ага тоже когда то писал генератор CTL по дбф - правда еще по досовской версии csv по моему руками выгружал но export там тоже есть помню что надо даты фоксовские пустые как то кастить - в нулл по моему проще всего. зы а новые типы я без понятия если они выгружаются в csv тогда наверно можно если нет тогда ХЗ pps А мемо с разделителями это задача - нав. chr(13) как то экранируется в скл-лоадере на крайняк менять их скажем на ~~ а потом назад в оракле - хотя конечно это НЕ гут - и доп. издержки и доп.время на пост-обработку |
© 2000-2024 Fox Club  |