首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Informix to Oracle:处理获取空值

Informix to Oracle:处理获取空值
EN

Stack Overflow用户
提问于 2009-05-05 14:16:35
回答 3查看 1.4K关注 0票数 2

先来了解一下背景知识。我的公司正在评估是否将Informix数据库迁移到Oracle10g。我们有几个ESQL/C程序。我已经在Oracle迁移工作台上运行了一些,并且一直在摸索一些测试。现在我开始意识到一些事情。

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

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

在Pro*C中,选择的日期格式是什么?我知道它不是数字,因为我尝试在我的长变量中选择日期字段,但得到Oracle错误"expected但get a DATE“。因此,我假设我们必须修改选择日期字段的方式-要么以转换的方式选择一个日期字段,使其成为一个长字段(即,自1899年12月31日以来的天数),要么更改主机变量以匹配Oracle返回的内容(这是什么,字符串?)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-05 19:36:43

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

代码语言:javascript
复制
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()和date()公式(如上所示)。然后将应用程序指向视图架构,而不是基表架构。更少的测试,更少的地方遗漏一些东西。

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

代码语言:javascript
复制
CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM   APPS_BASE.EMP;
票数 2
EN

Stack Overflow用户

发布于 2009-05-05 15:44:53

是啊。您将需要按照您所述修改您的查询。

long正在把你绊倒。long在Oracle中有不同的含义。有一个特定的日期类型。通常,当选择一个时,使用带有格式的TO_DATE函数来获得VARCHAR2格式的结果,格式完全符合您的要求。

票数 3
EN

Stack Overflow用户

发布于 2009-05-05 17:41:49

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/825072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档