sql - 将 DB2 查询转换为 Oracle 查询

标签 sql db2 oracle11g

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

有没有办法将这些 DB2 特定查询转换为 Oracle 支持的查询。

谢谢

最佳答案

你还有很多工作要做!

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 转换为任何显式类型,例如强制转换(null 作为整数)。这在 Oracle 中是不必要的。

系统对象

  • SYSIBM.DUAL 简单地变为 DUAL
  • 函数:它们都有点不同。你必须逐案检查。例如,LOCATE 变为 INSTR

语法

  • 立即截断 变为截断
  • 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 实现)可以为您做同样的事情

关于sql - 将 DB2 查询转换为 Oracle 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6951713/

相关文章:

mysql - 任务 + 参与者 : JOIN n. .n 并将结果划分为组(在 1 个查询中)

java - 通过 DB2 Express-C 执行 PreparedStatement 时出错

sql - 用于分配金额的 Oracle 聚合函数

sql - ORACLE 约束允许空值,IF

java - Oracle 数据库 SELECT ... FOR UPDATE 自动提交

mysql - 我的 sql 查询有些奇怪

sql - 在 postgres 中选择时间戳记录

SQL:有什么方法可以在更新语句中使用 Order By 吗?

docker - 如何重新初始化 Docker 容器

java - 如何从 Java 验证 DB2 身份验证