Informix to Oracle:处理获取空值

时间:2009-05-05 14:16:35

标签: c oracle oracle10g informix oracle-pro-c

首先是一些背景知识。我的公司正在评估我们是否会将Informix数据库迁移到Oracle 10g。我们有几个ESQL / C程序。我通过Oracle Migration工作台运行了一些,并且一直在进行一些测试。现在我已经意识到了一些事情。

首先,我们有动态sql语句,根本不处理空值。根据我的阅读,我要么必须手动修改查询以使用nvl()函数或实现指标变量。有人可以确认是否需要手动修改?我们必须对转换后的ESQL / C程序进行的手动更改量越少越好。

其次,我们有几个查询从各种表等中提取日期,并且Informix日期被视为类型long,即1899年12月31日以来的天数。

在Pro * C中,选择日期的格式是什么?我知道它不是数字,因为我尝试在我的长变量中选择日期字段并得到Oracle错误,说明“预期的NUMBER但是有一个DATE”。所以我假设我们必须修改我们选择日期字段的方式 - 以转换的方式选择日期字段,使其变为长(即自18/31/18/18以来的天数),或者更改主机变量以匹配Oracle返回的内容(这是什么,字符串?)。

3 个答案:

答案 0 :(得分:3)

雅。您需要按照描述修改查询。

很长时间绊倒了你。 long在Oracle中有不同的含义。有一个特定的DATE类型。通常,当选择一个使用带有格式的TO_DATE函数时,以完全以您想要的格式获得结果作为VARCHAR2。

答案 1 :(得分:3)

可能它还没有打到你但要注意在Oracle中,空VARCHAR2字段是NULL。我认为这背后没有逻辑(可能是因为我来自Informix的土地) - 请记住它。我认为这是愚蠢的 - 恕我直言空字符串是有意义的,与NULL不同。

将所有VARCHAR2字段修改为NOT NULL DEFAULT '-'或任何其他任意值,或在所有返回VARCHAR2字段的查询中使用指示符,或始终使用NVL()

答案 2 :(得分:2)

为了将oracle日期(以Oracle内部格式存储)转换为长整数,您需要更改查询。使用以下公式表示您的日期:

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

Oracle系统'J'(朱利安日期)格式是自公元4712年12月31日以来的天数。如果您想从以后开始计算,则需要减去该日期的Julian日计数。

一个建议:不是在程序中更改所有查询(可能会产生问题并引入错误),而是在不同的模式中创建一组视图。这些视图的名称与所有表的名称相同,所有列都相同,但包括NVL()和date()公式(如上所示)。然后将应用程序指向视图模式而不是基表模式。更少的测试和更少的地方丢失的东西。

例如,将所有表放入名为“APPS_BASE”的模式中(由用户“APPS_BASE”定义。然后创建另一个名为“APPS_VIEWS”的模式/用户。在APPS_VIEWS中创建一个视图:

CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM   APPS_BASE.EMP;
相关问题