2009-05-05 2 views
2

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

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

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

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

+0

+1 Я чувствую вашу боль. –

+0

Не повезло, что нужно учитывать миграцию. Надеюсь, они решают не ради вас.Является ли проблема, что динамический SQL не обрабатывает ошибки в коде Informix, или вы имеете в виду, что OCI (Pro * C) не обрабатывает переменные индикатора с переменными хоста? –

+0

Я имел в виду, что компилятор Pro * C жалуется на нулевые значения в таблице, когда я явно не обрабатываю нулевые значения, используя nvl() или переменные индикатора. Informix все равно, если я выберу нулевые значения (и мне это нравится!) ... – KNewton

ответ

2

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

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

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

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

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

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

Томас благодарит вас за отзыв. Мне очень нравится твоя идея создания просмотров, и я собираюсь изучить это, отлично! Карен – KNewton

+0

следующее выражение возвратит целое число дней с 12/31/1899 СТВОЛА (date_column) - TO_DATE ('1899-12-31', 'YYYY-MM-DD') .... ... ПРИМЕЧАНИЕ. Функция TRUNC требуется только в том случае, если для параметра date_column задана часть времени, отличная от полуночи, и вы хотите убедиться, что возвращаемое значение является целым числом. – spencer7593

3

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

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

3

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

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

Смежные вопросы