Informix to Oracle: работа с извлечением нулевых значений - PullRequest
2 голосов
/ 05 мая 2009

Сначала немного фона. Моя компания оценивает, будем ли мы переносить нашу базу данных Informix в Oracle 10g. У нас есть несколько программ ESQL / C. Я пробежал некоторые из них через инструментальные средства Oracle Migration и несколько раз пытался их протестировать. Теперь я пришел к пониманию нескольких вещей.

Во-первых, у нас есть динамические операторы sql, которые вообще не обрабатывают нулевые значения. Из того, что я прочитал, я должен либо вручную изменить запросы, чтобы использовать функцию nvl (), либо реализовать переменные индикатора. Может ли кто-нибудь подтвердить необходимость ручных модификаций? Наименьшее количество ручных изменений, которые мы должны внести в наши конвертированные программы ESQL / C, тем лучше.

Во-вторых, у нас есть несколько запросов, которые извлекают даты из различных таблиц и т. Д., И в Informix даты обрабатываются как тип long, количество дней с 31 декабря 1899 г.

В Pro * C, в каком формате выбирается дата? Я знаю, что это не числовое значение, потому что я попытался выбрать поле даты в длинной переменной и получить сообщение об ошибке Oracle, в котором указано «ожидаемое число, но есть дата». Поэтому я предполагаю, что нам нужно изменить способ выбора полей даты - либо выбрать поле даты преобразованным образом, чтобы оно стало длинным (т. Е. Количество дней с 31.12.1999), либо изменить хост переменная, соответствующая тому, что возвращает Oracle (что это, строка?).

Ответы [ 3 ]

3 голосов
/ 05 мая 2009

Возможно, вас это еще не поразило, но имейте в виду, что в Oracle пустые поля VARCHAR2 имеют значение NULL. Я не вижу никакой логики за этим (вероятно, потому что я приехал из страны Informix) - просто имейте это в виду. Я думаю, что это глупо - ИМХО пустая строка имеет смысл и отличается от NULL.

Либо измените все поля VARCHAR2 на NOT NULL DEFAULT '-' или любое другое произвольное значение, либо используйте показатели во ВСЕХ ваших запросах, которые возвращают поля VARCHAR2, или всегда используйте NVL().

3 голосов
/ 05 мая 2009

Ya. Вам нужно будет изменить ваши запросы, как вы описали.

долго сбивает вас с толку. Лонг имеет другое значение в Oracle. Существует определенный тип DATE. Обычно при выборе используется функция TO_DATE с форматом, чтобы получить результат в виде VARCHAR2 именно в том формате, который вы хотите.

2 голосов
/ 05 мая 2009

Чтобы преобразовать даты оракула (которые хранятся во внутреннем формате Oracle) в длинное целое число, вам нужно будет изменить ваши запросы. Используйте следующую формулу для ваших дат:

to_number (to_char (date_column, 'J')) - to_number(to_char(to_date('12/31/1899', 'MM/DD/YYYY'), 'J'))

Формат системы Oracle «J» (для юлианской даты) - это число дней с 31 декабря 4712 г. до н.э. Если вы хотите считать с более поздней даты, вам нужно вычесть из подсчета юлианских дней этой более поздней даты.

Одно предложение: вместо изменения всех ваших запросов в ваших программах (которые могут создавать проблемы и вносить ошибки), создайте набор представлений в другой схеме. Эти представления будут называться так же, как и все таблицы, со всеми одинаковыми столбцами, но включают формулы NVL () и date () (как указано выше). Затем наведите ваше приложение на схему представления, а не на схему базовой таблицы. Гораздо меньше испытаний и меньше мест, чтобы что-то упустить.

Так, например, поместите все ваши таблицы в схему с именем «APPS_BASE» (определенную пользователем «APPS_BASE». Затем создайте другую схему / пользователя с именем «APPS_VIEWS». В APPS_VIEWS создайте представление:

CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM   APPS_BASE.EMP;
...