Информикс для Oracle:Работа с получением нулевых значений

StackOverflow https://stackoverflow.com/questions/825072

Вопрос

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

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

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

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

Это было полезно?

Решение

Чтобы преобразовать даты оракула (которые хранятся во внутреннем формате 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;

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top