Informix 到 Oracle:处理获取空值

Posted

技术标签:

【中文标题】Informix 到 Oracle:处理获取空值【英文标题】:Informix to Oracle: Dealing with Fetching Null Values 【发布时间】:2009-05-05 14:16:34 【问题描述】:

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

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

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

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

【问题讨论】:

不幸的是不得不考虑迁移 - 我希望他们决定不考虑,为了你。动态 SQL 不处理空值的问题是 Informix 代码中的问题,还是您的意思是 OCI (Pro*C) 不处理带有主机变量的指示变量? 我的意思是 Pro*C 编译器抱怨表中的空值,而我没有通过使用 nvl() 或指示变量显式处理空值。如果我选择空值,Informix 不在乎(我喜欢这样!)... 【参考方案1】:

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

long 会绊倒你。 long 在 Oracle 中有不同的含义。有一个特定的 DATE 类型。 Generally when selecting one uses the TO_DATE function with a format, to get the result as a VARCHAR2, in exactly the format you want.

【讨论】:

【参考方案2】:

可能它还没有击中您,但请注意,在 Oracle 中,空的 VARCHAR2 字段是 NULL。我看不出这背后的逻辑(可能是因为我来自 Informix 领域)——请记住这一点。我认为这很愚蠢 - 恕我直言,空字符串是有意义的,并且与 NULL 不同。

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

【讨论】:

【参考方案3】:

为了将 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 日以来的天数。如果您想从较晚的日期开始计算,则需要减去该较晚日期的儒略日计数。

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

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

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

【讨论】:

Thomas 感谢您的反馈。我真的很喜欢您创建视图的想法,并且将对此进行探索,太好了!凯伦 以下表达式将返回自 12/31/1899 以来的整数天 TRUNC(date_column) - TO_DATE('1899-12-31','YYYY-MM-DD') ...... .注意:仅当 date_column 的时间部分设置为午夜以外的时间,并且您要确保返回的值是整数时,才需要 TRUNC 函数。

以上是关于Informix 到 Oracle:处理获取空值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle迁移到瀚高之后,空值问题处理

Oracle迁移到瀚高之后,空值问题处理

informix 在选择中用 0 替换空值

Informix 存储过程通用异常处理

Hive--对空值和NULL的处理

将 Informix ESQLC 迁移到 Oracle Pro*C