Informix в Oracle: работа с получением нулевых значений

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

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

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

В каком формате выбирается дата в Pro * C? Я знаю, что это не числовое значение, потому что я попытался выбрать поле даты в свою длинную переменную и получил ошибку Oracle, в которой говорилось, что «ожидаемое НОМЕР, но есть ДАТА». Итак, я предполагаю, что нам придется изменить то, как мы выбираем поля даты - либо выберите поле даты преобразованным способом, чтобы оно стало длинным (то есть, количество дней с 31.12.1899), либо измените хост переменная, чтобы соответствовать тому, что возвращает Oracle (что это, строка?).


person KNewton    schedule 05.05.2009    source источник
comment
Не повезло с рассмотрением вопроса о миграции - надеюсь, они решат не делать этого ради вас. Проблема в том, что динамический SQL не обрабатывает значения NULL, является проблемой в коде Informix, или вы имеете в виду, что OCI (Pro * C) не обрабатывает индикаторные переменные с переменными хоста?   -  person Jonathan Leffler    schedule 05.05.2009
comment
Я имел в виду, что компилятор Pro * C жалуется на нулевые значения в таблице, когда я явно не обрабатываю нулевые значения с помощью nvl () или индикаторных переменных. Informix наплевать, выберу ли я нулевые значения (а мне это нравится!) ...   -  person KNewton    schedule 05.05.2009


Ответы (3)


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

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

Формат J системы Oracle (для юлианской даты) - это количество дней, прошедших с 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;
person Thomas Jones-Low    schedule 05.05.2009
comment
Томас спасибо за отзыв. Мне очень нравится ваша идея создания просмотров, и я собираюсь изучить ее, отлично! Карен - person KNewton; 05.05.2009
comment
Следующее выражение вернет целое число дней с 31.12.1899 TRUNC (date_column) - TO_DATE ('1899-12-31', 'YYYY-MM-DD') ....... ПРИМЕЧАНИЕ. Функция TRUNC предназначена только для требуется, если для date_column установлено какое-то время, отличное от полуночи, и вы хотите убедиться, что возвращаемое значение является целым числом. - person spencer7593; 27.05.2009

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

долго сбивает вас с толку. long имеет другое значение в Oracle. Есть конкретный тип ДАТЫ. Обычно при выборе используется функция TO_DATE с форматом, чтобы получить результат в виде VARCHAR2, точно в том формате, который вам нужен.

person EvilTeach    schedule 05.05.2009

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

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

person qrdl    schedule 05.05.2009