将DB2查询转换为oracle查询

时间:2011-08-05 05:11:36

标签: sql db2 oracle11g

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

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

由于

2 个答案:

答案 0 :(得分:3)

你还有很多工作要做!

在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为所有上述事实提供API级抽象。可以在DB2和Oracle上执行大量SQL,而无需适应。

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

答案 1 :(得分:0)

我发现字符串的管理也存在一些差异。

  • 在比较时,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