将 DB2 查询转换为 oracle 查询

Posted

技术标签:

【中文标题】将 DB2 查询转换为 oracle 查询【英文标题】:converting a DB2 query into oracle query 【发布时间】:2011-08-05 05:11:36 【问题描述】:

以前我们使用 DB2 作为数据库,但现在我们正在迁移到 Oracle。现在,在我们的项目中,我们广泛使用了特定于 Db2 的 sql。

有什么方法可以将这些 DB2 特定查询转换为 oracle 支持的查询。

谢谢

【问题讨论】:

这个问题很模糊......有任何查询构成问题吗?发布一些带有“想要的结果”描述的查询......没有那个没有人可以构造一个 oracle 查询来帮助 我希望你调查过其他一些数据库。 Oracle 是最不符合标准、最独特的选择……您从 DB2 到其他数据库的迁移路径可能会更容易。 @Daniel,迁移路径可能更容易,但切换数据库还有很多其他原因。 Oracle 拥有一些最丰富的特性,并且对于大型数据库来说速度非常快......这样,它不一定是“特殊的”。你会选择什么数据库,为什么? 我会尝试为这份工作选择合适的人选。甲骨文并非不可能。我只是想知道,因为 DB2 非常有能力。我刚刚将几个内部应用程序从 Oracle 迁移到 PostgreSQL。我们没有使用它的一小部分功能,而是为此付出了很多。我对 Oracle 的特殊性的全部意思是,它的语法通常比大多数其他数据库更偏离 SQL 标准。 (他们都这样做;这是程度问题)。 【参考方案1】:

你还有很多工作要做!

在 DB2 和 Oracle 之间,一些重要的区别是(只是我能想到的任意列举):

数据类型

数字数据类型:DB2 有更多的标准类型,如SMALLINTINTEGERDOUBLE 等。这些在Oracle SQL 中不存在(虽然在PL/SQL 中存在一些)。这对于 DDL 和强制转换以及其他一些用例(例如谓词的正确性)很重要 日期数据类型:Oracle 在DATETIMESTAMP 之间的唯一区别是TIMESTAMP 有微秒。但DATE 也可能包含时间信息。我认为在 DB2 中,DATE 没有时间信息。 字符数据类型:了解 Oracle 中 VARCHARVARCHAR2 之间的区别 NULL。在 Oracle 中,NULL 比在 DB2 中更通用。在 DB2 v9.7 之前,您必须将 NULL 强制转换为任何显式类型,例如cast(null as integer)。这在 Oracle 中不是必需的。

系统对象

SYSIBM.DUAL 简单地变成 DUAL 功能:它们都有点不同。您必须逐案检查。例如,LOCATE 变为 INSTR

语法

TRUNCATE IMMEDIATE 变为 TRUNCATE EXCEPT 变为 MINUS DB2 的FETCH FIRST n ROWS ONLY:Oracle 中没有这样的子句。您必须使用ROWNUMROW_NUMBER() OVER() 过滤(请参阅此example) DB2 的MERGE 语句比Oracle 的更强大,以防你使用它。 DB2 支持INSERT INTO .. (..) VALUES (..), (..), (..)。使用 Oracle,您必须编写 INSERT INTO .. SELECT .. UNION ALL SELECT .. UNION ALL SELECT ..

高级

如果您使用存储过程,它们的工作方式会有所不同,尤其是涉及高级数据类型时,但这超出了这里的范围。

您最有效的方法可能是使用某种 SQL 抽象。如果您使用 Java,我建议您使用 jOOQ 包装您的 SQL 语句(免责声明:我为 jOOQ 背后的公司工作)。 jOOQ 为上述所有事实提供了 API 级别的抽象。大量的 SQL 可以在 DB2 和 Oracle 上执行,无需适应。我们还在开发更独立的翻译产品:https://www.jooq.org/translate

在更高的抽象层次上,Hibernate(或其他 JPA 实现)可以为您做同样的事情

【讨论】:

【参考方案2】:

我发现在字符串的管理上也有一些不同。

DB2 在比较时不关心尾随空格:

/* DB2 */
SELECT CASE WHEN ('A   ' = 'A') THEN 'true' ELSE 'false' END FROM SYSIBM.SYSDUMMY1
--> true

/* Oracle */
SELECT CASE WHEN ('A   ' = 'A') THEN 'true' ELSE 'false' END FROM DUAL
--> false

Oracle 认为'' 等于NULL

/* DB2 */
SELECT CASE WHEN ('' IS NULL) THEN 'true' ELSE 'false' END FROM SYSIBM.SYSDUMMY1
--> false

/* Oracle */
SELECT CASE WHEN ('' IS NULL) THEN 'true' ELSE 'false' END FROM DUAL
--> true

【讨论】:

以上是关于将 DB2 查询转换为 oracle 查询的主要内容,如果未能解决你的问题,请参考以下文章

将ORACLE中查询结果为空字符串的变成null该怎么做

在线等!!如何通过主表及其主键查询到与之关联的表及关联字段?数据库为db2

将 Oracle 查询转换为 MySQL 查询

将 Oracle 合并查询转换为 mysql mySQL 查询

将 Informix 查询转换为 Oracle?

如何将 MySQL 查询转换为等效的 Oracle sql 查询