2

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

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

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

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

4

3 回答 3

3

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

长是绊倒你。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.

于 2009-05-05T15:44:52.727 回答
3

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

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

于 2009-05-05T17:41:48.920 回答
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 日以来的天数。如果您想从较晚的日期开始计算,则需要减去该较晚日期的儒略日计数。

一个建议:不要更改程序中的所有查询(这可能会产生问题并引入错误),而是在不同的模式中创建一组视图。这些视图将与所有表命名相同,具有所有相同的列,但包括 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-05T19:36:42.700 回答