将 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 有更多的标准类型,如SMALLINT
、INTEGER
、DOUBLE
等。这些在Oracle SQL 中不存在(虽然在PL/SQL 中存在一些)。这对于 DDL 和强制转换以及其他一些用例(例如谓词的正确性)很重要
日期数据类型:Oracle 在DATE
和TIMESTAMP
之间的唯一区别是TIMESTAMP
有微秒。但DATE
也可能包含时间信息。我认为在 DB2 中,DATE
没有时间信息。
字符数据类型:了解 Oracle 中 VARCHAR
和 VARCHAR2
之间的区别
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 中没有这样的子句。您必须使用ROWNUM
或ROW_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 查询的主要内容,如果未能解决你的问题,请参考以下文章
在线等!!如何通过主表及其主键查询到与之关联的表及关联字段?数据库为db2