Интересный сценарий!
Есть несколько вопросов, о которых нужно беспокоиться:
- В каком формате ожидается массовый импорт данных Oracle?
- Какой правильный формат для значений DATE и DATETIME?
Прагматично (и основываясь на опыте с Informix, а не Oracle), вместо того, чтобы усекать таблицы перед массовой загрузкой, я бы массово загружал данные во вновь созданные таблицы (довольно трудоемкий процесс), а затем организовывал замену старых столы с новым. В зависимости от того, что работает быстрее, я бы выполнил последовательность операций:
- Переименование старой таблицы в нежелательную таблицу
- Переименовать новую таблицу в старую таблицу
с последующей последовательностью операций «отбросить нежелательную таблицу», или я бы сделал:
- Оставить старый стол
- Переименовать новую таблицу в старую таблицу
Если операции выполняются таким образом, «время простоя» для таблиц сводится к минимуму по сравнению с «таблицей усечений», за которой следует «таблица загрузки».
Oracle похож на SE - его операторы DDL не транзакционны (в отличие от IDS, где вы можете иметь транзакцию, которая удаляет таблицу, создает новую и затем откатывает весь набор операций).
Как экспортировать данные?
Это зависит от того, насколько гибки загрузчики Oracle. Если они могут адаптироваться к стандартным форматам вывода Informix (например, формат UNLOAD), то операции выгрузки тривиальны. Вам может потребоваться установить переменную среды DBDATE, чтобы гарантировать, что значения даты распознаются Oracle. Я мог бы полагать, что «DBDATE="Y4MD-"
», вероятно, будет принято; это стандартная запись SQL 2009-12-02 для 2 и декабрь 2009 г.
Формат UNLOAD по умолчанию можно суммировать как «разделенные символом поля строки с обратной косой чертой, выходящей за пределы встроенных символов новой строки, обратной косой черты и символов канала»:
abc|123|2009-12-02|a\|b\\c\
d||
Это одна запись с символьной строкой, числом, датой и другой символьной строкой (содержащей «a», «|», «b», «\», «c», перевод строки и «d») и нулевое поле. Конечные пробелы удаляются из строк символов; пустое, но ненулевое символьное поле содержит один пробел в файле выгрузки.
Если Oracle не может быть легко обработан, то подумайте, может ли Perl + DBI + DBD :: Informix + DBD :: Oracle быть набором инструментов для использования - это позволяет вам подключаться как к Oracle, так и к Informix (SE). ) базы данных и передачи данных между ними.
Кроме того, вам нужно исследовать альтернативные разгрузчики для SE. Одной из программ, которую стоит изучить, если вы не используете Windows, является SQLCMD ( честное предупреждение: предвзятость автора в ). Он имеет довольно мощный набор параметров форматирования вывода и, возможно, может создать текстовый формат, который Oracle сочтет приемлемым (например, CSV).
Последним резервным вариантом будет использование инструмента, генерирующего операторы INSERT для выбранных данных. Я думаю, что это может быть полезно в качестве дополнения к SQLCMD, но его пока нет. Итак, вы должны использовать:
SELECT 'INSERT INTO Target(Col1, Col2) VALUES (' ||
Col1 || ', ''' || Col2 || ''');'
FROM Source
Это генерирует простую инструкцию INSERT. Проблема заключается в том, что он не является надежным, если Col2 (символьная строка) сам содержит кавычки (и символы новой строки могут также вызвать проблемы на принимающей стороне). Вы должны оценить, является ли это приемлемым.