:: Visual Foxpro, Foxpro for DOS
Утилита автоматического импорта DBF-файла в БД Oracle
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Добрый день!

В связи со служебной необходимостью наваял за пару дней означенную утилиту. Изначально задумывался вариант с INI-файлом, но задача была поставлена так, чтобы работать с командной строкой. Описание параметров находится в файле README.TXT.

Описание работы программы
-------------------------
Принятый параметром DBF-файл анализируется с точки зрения структуры и по этим данным формируются SQL-скрипт (для создания таблицы аналогичной структуры в БД Oracle) и CTL-файл (для загрузки данных CSV-файла с помощью SQLLOADER), а также 2 BAT-файла: для запуска скрипта SQLPLUS формирования таблицы и для запуска загрузчика SQLLOADER.
Примеры вызова программы с параметрами можно посмотреть в файлах 1.BAT, 3.BAT, 5.BAT

В ходе разработки учтены разные подводные камни:

- в символьных полях удаляются управляющие символы (CHR(1)... CHR(13) ), из-за них строки выпадают в BAD-файл;
- корректируется разделитель целой и дробной части в числовых полях;
- логическое поле преобразуется в NUMERIC(1) - в ORACLE 10 поля с логическим типом еще не было;
- корректно загружаются строки с символом ["], c экранированием я нашел идею бесперспективной, надо вычислять позицию этого символа в строке, сделал по-другому;
- MEMO-поля кастуются к символьному виду (есть идеи, как выгрести все содержимое без обрезки? на низком уровне вычитывать?)
- MEMO-поля поля всегда приводятся к странице 1251 (наверное сделаю это параметром)


Дальнейшие улучшения
--------------------

1) BAT-файлы сделать похитрее - с обработкой кода возврата при выполнении операции.
2) Ввести параметр для выбора режима обновления, дозаписи или полной перезаписи в таблице ORACLE
3) MEMO-поля (?)

В общем, потестируйте, кому не трудно и есть Oracle, если кому сгодится - пользуйте. Если есть вопросы - задавайте. Если есть предложения - озвучивайте и приводите общее описание (и примеры) реализации.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Пробежался бегло по коду. По сути сказать нечего, так как в Оракл ничего не выгружаю.

Поэтому так - по мелочи.

1) раз выгрузку производит Фокс в Оракл, то это скорее экспорт, а не импорт;

2) Последний день месяца от даты можно определять проще, чем в 4 функции
GOMONTH( tdDate - DAY(tdDate), 1)

вместо

GOMONTH( DATE(YEAR(tdDate), MONTH(tdDate), 1), 1)-1

3) Закрывать таблицу можно в одну строку вместо 3 и проверка не требуется:
USE IN SELECT(tcFile)

вместо

IF USED( tcFile )
USE IN ( tcFile )
ENDIF

4) В процедуре errHandler 866-я кодировка текста - не знаю, может это зачем-то нужно.

5) Почему здесь не достаточно одного лишь TRANSFORM'а c шаблоном '99999'? Разве так нагляднее?
padl(TRANSFORM(RECNO()), 5, space(1))

6) Здесь либо у автора, либо у меня какой-то глюк с логикой:
*-- Если в параметре передан алиас, который неактивен - попробуем его открыть
TRY
IF !USED( tcAlias )
lcFile = DBF( ALIAS() )
USE ( lcFile ) IN 0 ALIAS (tcAlias) SHARED
ENDIF
SELECT (tcAlias)
llUsed = .T.
CATCH TO laError
llUsed = .F.
ENDTRY

Непонятна и общая логика, и конкретно как могут вместе работать эти две строки:
lcFile = DBF( ALIAS() )
USE ( lcFile ) IN 0 ALIAS (tcAlias) SHARED

Первая возвращает имя dbf-файла для таблицы, открытой в текущей рабочей области (что в ней - загадка!).
Вторая хочет открыть этот файл в свободной области, то есть, повторно. Что без опции AGAIN получиться не должно, а значит, ошибка "File is in use" обеспечена.

7) Весь миллион одинаковых конструкций, разбросанных по всей программе, подобных этой:
FORCEEXT( STRTRAN(UPPER(JUSTFNAME(tcP1452)), 'SR.', '.'), 'BAT')
так и просятся, чтобы оформить их как UDF.

а
CTOD('01.01.1900')
через #DEFINE или переменную.

8) Зачем здесь 3 функции CHRTRAN()? Ну, если для наглядности, то пусть будет:
CHRTRAN(CHRTRAN(CHRTRAN(CAST(STL as C(254)), ["], ['] ), CHR(13), ''), ';', ',' )
С другой стороны, батарея из вложенных ненужных CHRTRAN() ни наглядности, ни скорости ИМХО не добавляет.

9) В некоторых случаях вместо "OR ... OR ... OR ..." INLIST() был бы уместен.
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Это кусок из рабочей программы, функции писались на скорую руку, что-то подзабылось...
Спасибо, учтем.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
А че q не помогает? Или его тоже нет в 10-ке?

dbms_output.put_line(q'[Д'Артаньян]');
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
Аркадий

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
2) Последний день месяца от даты можно определять проще, чем в 4 функции
GOMONTH( tdDate - DAY(tdDate), 1)
А для даты tddate=date(2017,3,31)?
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Аркадий
2) Последний день месяца от даты можно определять проще, чем в 4 функции
GOMONTH( tdDate - DAY(tdDate), 1)
А для даты tddate=date(2017,3,31)?

Судя по всему akvvohinc писал по памяти и немного ошибся. Конечно же надо вот так:
GOMONTH( tdDate - DAY(tdDate) + 1, 1) - 1
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
leonid
Судя по всему akvvohinc писал по памяти и немного ошибся. Конечно же надо вот так
Да, спасибо!
Я помнил только, что фишка способа была в вычитании DAY().
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Мемо поля через кучу отдельных файлов загружаются.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Проект стихийно развивается..

Пока добавил реализовал в виде отдельного файла пакетную обработку (т.е. в ADIR() складываются файлы по указанной маске, затем в цикле все перебирается и загружается... в одну таблицу - реализация загрузки ФИАС). Видимо надо еще вводить параметр, который не только укажет режим загрузки (APPEND/REPLACE/TRUNCATE), но и параметр, который определит загрузку всех файлов в одну таблицу (пример - загрузка ФИАС), или каждый файл - в свою таблицу (например, разные справочники с разной структурой и разным содержанием). Еще убрал подчеркивание в имени столбцов - Оракл позволяет ведь в кавычках имена создавать, поэтому проблема зарезервированных слов решена красиво.

Итого предстоит:

1) Указывать список загружаемых полей. Тоже не все так однозначно - просто пропускать какие-то при загрузке (NULL TRAILERS), или именно урезанную структуру делать на сервере. Опять параметром?

2) Пакетную обработку перенести в утилиту, там можно разобрать и организовать быстрый и увлекательный процесс загрузки.

3) Кавычки сделать через экранирование. Люди так делают.

4) МЕМО-поля в полном объеме. Пока не горит, будет время - помозгую, как "через кучу файлов" сделать.

5) Надо как-то вести лог, встречались ли в каких-либо строках управляющие символы. Пока есть идея вываливать XML с такой инфой: 1) номер строки 2) имя поля 3) АСКИ-код символа 4) позиция символа в строке.
Не знаю практическое применение, но просили сделать (несрочно, в будущем). А вы что думаете?

6) Прочее (всякие мелочи, типа удалять за собой файлы, или переносить их в отдельный каталог, убрать ДОС-окна и вывести красивый прогресс-бар, и т.д.

Если что забыл - добавлю.

Ну, пожелания те же.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Утилита автоматического импорта DBF-файла в БД Oracle
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
sphinx
Оракл позволяет ведь в кавычках имена создавать, поэтому проблема зарезервированных слов решена красиво.
Не надо так делать. Никогда.
Равно как и русские имена полей/таблиц и прочих объектов БД.
Хорошая схема БД должна работать без надобности в "закавычивании" идентификаторов - имён объектов (кстати, они при этом становятся регистрочувствительными - чего я тоже крайне не советую делать).


------------------
WBR, Igor
Ratings: 0 negative/1 positive


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

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

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