以前我们使用DB2作为数据库,但现在我们正在迁移到Oracle。现在,在我们的项目中,我们广泛使用了 Db2 特定的 SQL。
有没有办法将这些 DB2 特定查询转换为 Oracle 支持的查询。
谢谢
最佳答案
你还有很多工作要做!
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
转换为任何显式类型,例如强制转换(null 作为整数)
。这在 Oracle 中是不必要的。
系统对象
SYSIBM.DUAL
简单地变为DUAL
- 函数:它们都有点不同。你必须逐案检查。例如,
LOCATE
变为INSTR
语法
立即截断
变为截断
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 实现)可以为您做同样的事情
关于sql - 将 DB2 查询转换为 Oracle 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6951713/