以前我们使用DB2作为数据库,但现在我们正在迁移到Oracle。现在,在我们的项目中,我们广泛使用了特定于Db2的sql。
有没有办法将这些特定于DB2的查询转换为支持oracle的查询。
由于
答案 0 :(得分:3)
你还有很多工作要做!
在DB2和Oracle之间,一些重要的区别(只是我能想到的任意枚举):
SMALLINT
,INTEGER
,DOUBLE
等。这些在Oracle SQL中不存在(尽管有些存在于PL中) / SQL)。这对于DDL以及转换和一些其他用例(例如谓词的正确性)非常重要DATE
和TIMESTAMP
之间唯一的区别是TIMESTAMP
具有微秒的事实。但DATE
也可能包含时间信息。在DB2中,我认为DATE
没有时间信息。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
FETCH FIRST n ROWS ONLY
:Oracle中没有这样的子句。您必须使用ROWNUM
或ROW_NUMBER() OVER()
过滤(请参阅此example)MERGE
语句比Oracle的语句更强大。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