先来了解一下背景知识。我的公司正在评估是否将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返回的内容(这是什么,字符串?)。
发布于 2009-05-05 19:36:43
为了将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()和date()公式(如上所示)。然后将应用程序指向视图架构,而不是基表架构。更少的测试,更少的地方遗漏一些东西。
因此,例如,将所有表放入名为"APPS_BASE“(由用户"APPS_BASE”定义)的模式中。然后创建另一个名为"APPS_VIEWS“的模式/用户。在APPS_VIEWS中创建一个视图:
CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM APPS_BASE.EMP;发布于 2009-05-05 15:44:53
是啊。您将需要按照您所述修改您的查询。
long正在把你绊倒。long在Oracle中有不同的含义。有一个特定的日期类型。通常,当选择一个时,使用带有格式的TO_DATE函数来获得VARCHAR2格式的结果,格式完全符合您的要求。
发布于 2009-05-05 17:41:49
您可能还没有意识到这一点,但请注意,在Oracle中,空的VARCHAR2字段是NULL。我看不到这背后的逻辑(可能是因为我来自Informix )--请记住这一点。我认为这是愚蠢的-我的空字符串是有意义的,不同于NULL。
或者将所有VARCHAR2字段修改为NOT NULL DEFAULT '-'或任何其他任意值,或者在所有返回VARCHAR2字段的查询中使用指示符,或者始终使用NVL()。
https://stackoverflow.com/questions/825072
复制相似问题