Informix到Oracle:处理获取空值

Informix到Oracle:处理获取空值,c,oracle,oracle10g,informix,oracle-pro-c,C,Oracle,Oracle10g,Informix,Oracle Pro C,先来点背景知识。我的公司正在评估我们是否将Informix数据库迁移到Oracle 10g。我们有几个ESQL/C程序。我已经在Oracle迁移工作台上运行了一些,并在一些测试中混淆视听。现在我意识到了一些事情 首先,我们有动态sql语句,它们根本不处理空值。根据我所读到的,我要么手动修改查询以利用nvl函数,要么实现指示符变量。有人能确认是否需要手动修改吗?我们对转换后的ESQL/C程序进行的手动更改越少越好 其次,我们有几个查询从各种表等中提取日期,在Informix中,日期被视为long类

先来点背景知识。我的公司正在评估我们是否将Informix数据库迁移到Oracle 10g。我们有几个ESQL/C程序。我已经在Oracle迁移工作台上运行了一些,并在一些测试中混淆视听。现在我意识到了一些事情

首先,我们有动态sql语句,它们根本不处理空值。根据我所读到的,我要么手动修改查询以利用nvl函数,要么实现指示符变量。有人能确认是否需要手动修改吗?我们对转换后的ESQL/C程序进行的手动更改越少越好

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


在Pro*C中,日期选择的格式是什么?我知道它不是数字,因为我尝试在长变量中选择date字段,结果Oracle错误地声明了预期的数字,但得到了一个日期。因此,我假设我们必须修改选择日期字段的方式——要么以转换的方式选择一个日期字段,使其成为一个长ie,从1899年12月31日起的天数,要么更改主机变量以匹配Oracle返回的是什么,string?

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


朗把你绊倒了。long在甲骨文中有不同的含义。有一个特定的日期类型。通常,在选择一个时,使用带有格式的TO_DATE函数,以VARCHAR2的形式获得结果,格式与您想要的格式完全相同。

可能您还没有意识到这一点,但请注意,在Oracle中,空VARCHAR2字段为空。我看不出这背后有什么逻辑,可能是因为我来自Informix,请记住这一点。我认为这是愚蠢的-IMHO空字符串是有意义的,不同于NULL


将所有VARCHAR2字段修改为非空默认值“-”或任何其他任意值,或在所有返回VARCHAR2字段的查询中使用指示符,或始终使用NVL。

为了将以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日以来的天数。如果你想从一个更晚的日期开始计算,你需要从那个更晚的日期的朱利安日计数中减去

一个建议是:不要改变程序中可能产生问题和引入bug的所有查询,而是在不同的模式中创建一组视图。这些视图的名称与所有表的名称相同,列也相同,但包含如上所述的NVL和日期公式。然后将应用程序指向视图模式,而不是基表模式。少了很多测试,少了遗漏的地方

例如,将所有表放入由用户APPS\u BASE定义的名为APPS\u BASE的模式中。然后创建另一个名为APPS\u VIEWS的架构/用户。在应用程序视图中创建一个视图:

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

不幸的是不得不考虑移民——我希望他们不会为了你的缘故而决定。动态SQL不处理空值的问题是Informix代码中的一个问题,还是说OCI Pro*C不使用主机变量处理指示符变量?我的意思是Pro*C编译器正在抱怨表中的空值,而我没有使用nvl或指示符变量显式处理空值。如果我选择空值,Informix会毫不在意,而且我喜欢这种方式!。。。托马斯:谢谢你的反馈。我真的很喜欢你创建视图的想法,我将对此进行探索,非常好!Karenth以下表达式将返回自1899年12月31日TRUNCdate_列到日期'1899-12-31'、'YYYY-MM-DD'……的整数天。注意:只有当日期列的时间部分设置为午夜以外的时间,并且您希望确保返回的值是整数时,才需要TRUNC函数。