实践Oracle与DB2区别及问题解决

项目进入开发阶段的时候,为了方便,一直使用 Oracle 数据库进行开发, 所以很多 sql 语句都是在 oracle 能正常创建的,后期由于项目中嵌入了 IBM 的产品及其他因素,所以不得不使用 db2 数据库,切换数据库过程中的区别还是有点大,如:创建表、视图、存储过程、 Ibatis 支持等等、、、,下面就总结一下我从 Oracle 数据库切换到 DB2 数据库碰到的一些问题及如何解决。

1.          创建表字段类型的区别


 

Oracle

DB2/400

Oracle 数据类型

注意事项

DB2 UDB 数据类型

注意事项

DATE

DATE
TIME
TIMESTAMP l

如果只使用 MM/DD/YYY, 那么使用 DATE 类型。
l
如果只使用 HH:MM:SS, 那么使用 TIME 类型。
l
如果要使用日期和时间,则使用时间戳类型( TIMESTAMP
l
可以使用 Oracle 中的 TO_CHAR() 函数来取 DATE 的字串来分别与 DB2/400 DATE TIME 相匹配。

VARCHAR2(n)

n<=4000

CHAR(n)
VARCHAR(n) l

n<=32766, 则使用 DB2/400 中的 CHAR 类型、 VARCHAR

LONG

n<=2GB

VARCHAR(n) DL@bitsCN_com 网管软件下载
CLOB(n) l

n<=32K, 则使用 DB2/400 中的 CHAR 类型、 VARCHAR
l
32K=< n <=2GB ,则使用 CLOB

ROW&
LONG ROW

n<=255

CHAR(n) FOR BIT DATA
VARCHAR(n) FOR BIT DATA
BLOB(n) l

n<=32K, 则使用 CHAR(n) FOR BIT DATA
VARCHAR(n) FOR BIT DATA
l
n<=2GB, 则使用 BLOB(n)

BLOB

n<=4GB

BLOB(n)

n<=2GB, 则使用 BLOB(n)

CLOB

n<=4GB

CLOB(n)

n<=2GB, 则使用 CLOB(n)

NCLOB

n<=4GB

DBCLOB(n)

n<=2GB, 则使用 DBCLOB(n/2)

NUMBER

SMALLINT/INTEGER/BIGINT

DECIMAL(p,s)/NUMBER(p,s)

Float(n)/ REAL/DOUBLE l

Oracle 中定义 NUMBER(p) NUMBER(p,s), 则使用 SAMLLINT/INTEGER/BIGINT
l
Oracle 中定义 NUMBER(p,s), 则使用 DECIMAL(p,s)
l
Oracle 中定义 NUMBER, 则使用 FLOAT(n)/REAL/DOUBLE bbs.bitsCN.com

 

 

创建表区别基本上就这些了,创建表时根据区别修改一下字段类型基本上不会大的问题。

 

 

1.          创建视图区别

创建视图的时候不能使用 OR REPLACE ,不能这样使用排序语句

CREATE

    VIEW VIEW_SSC  AS

    SELECT DATE_TIME FROM JBPM4_TASK TB ORDER BY TB. DATE DESC

2.          创建存储过程区别

 

 

a)          参数类型和参数名称的位置不同
db2
CREATE PROCEDURE PRO1 (IN OrgID int)
oracle
CREATE PROCEDURE PRO1 (OrgID IN int)

b)          同时作为输入输出参数的写法不同
db2
CREATE PROCEDURE PRO1 (INOUT OrgID int) INOUT 连着写

oracle
CREATE PROCEDURE PRO1 (OrgID IN OUT int) IN OUT 中间空格隔开,而且必须 IN OUT 之前

c)          没有输入或输出参数时
db2
CREATE PROCEDURE PRO1 ()
oracle
CREATE PROCEDURE PRO1 不能有空的括号

d)          赋值语句写法不一样
db2: set var =..
oracle: var := ..

e)          异常处理不一样

 

 

f)           CREATE PROCEDURE

db2 :

CREATE PROCEDURE SSCDBUSER.INDI_DEL_PRO


( IN IDPARA VARCHAR ( 32 ), OUT RETURNPARA INTEGER )


LANGUAGE SQL


DYNAMIC RESULT SETS 1


DETERMINISTIC


BEGIN


  DECLARE COUNTID INTEGER ;


  DECLARE APPLYNOD VARCHAR ( 20 );


  DECLARE CATEGORYD VARCHAR ( 4 );


  SELECT COUNT ( ID ) INTO COUNTID FROM VIEW_SSC_INDIVIDUALFORMLIST WHERE ID = IDPARA;


  SET RETURNPARA = COUNTID;


  SELECT APPLY_NO, CATEGORY INTO APPLYNOD, CATEGORYD FROM VIEW_SSC_INDIVIDUALFORMLIST WHERE ID = IDPARA;


  IF CATEGORYD= '1001' THEN


        DELETE FROM SSC_EVECT_LOAN_INFO WHERE ID = IDPARA;


  ELSEIF CATEGORYD= '1002' THEN


        DELETE FROM SSC_DAILY_LOAN_INFO WHERE ID = IDPARA;


        DELETE FROM SSC_DAILY_LOAN_DETAIL_INFO WHERE ID = APPLYNOD;


  ELSEIF CATEGORYD= '1003' THEN


        DELETE FROM SSC_EVECT_EXPENSE_INFO WHERE ID = IDPARA;


        DELETE FROM SSC_EVECT_EXPENSE_DETAIL_INFO WHERE ID = APPLYNOD;


  ELSEIF CATEGORYD= '1004' THEN


        DELETE FROM SSC_DAILY_EXPENSE_INFO WHERE ID = IDPARA;


        DELETE FROM SSC_DAILY_EXPENSE_DETAIL_INFO WHERE ID = APPLYNOD;


  END IF ;


END


 

 

oracle :

 

 

CREATE OR REPLACE PROCEDURE "INDI_DEL_PRO" ( IDPARA IN VIEW_SSC_INDIVIDUALFORMLIST.ID% TYPE , RETURNPARA OUT NUMBER )


AS


APPLYNO VIEW_SSC_INDIVIDUALFORMLIST.APPLY_NO% TYPE ;


CATEGORY VIEW_SSC_INDIVIDUALFORMLIST.CATEGORY% TYPE ;


BEGIN


  SELECT COUNT (*) INTO RETURNPARA FROM VIEW_SSC_INDIVIDUALFORMLIST WHERE ID= IDPARA;


  SELECT APPLY_NO, CATEGORY INTO APPLYNO, CATEGORY FROM VIEW_SSC_INDIVIDUALFORMLIST WHERE ID= IDPARA;


  IF     CATEGORY= '1001' THEN


        DELETE FROM SSC_EVECT_LOAN_INFO WHERE ID= IDPARA;


  ELSIF CATEGORY= '1002' THEN


        DELETE FROM SSC_DAILY_LOAN_INFO WHERE ID= IDPARA;


        DELETE FROM SSC_DAILY_LOAN_DETAIL_INFO WHERE ID= APPLYNO;


  ELSIF CATEGORY= '1003' THEN


        DELETE FROM SSC_EVECT_EXPENSE_INFO WHERE ID= IDPARA;


        DELETE FROM SSC_EVECT_EXPENSE_DETAIL_INFO WHERE ID= APPLYNO;


  ELSIF CATEGORY= '1004' THEN


        DELETE FROM SSC_DAILY_EXPENSE_INFO WHERE ID= IDPARA;


        DELETE FROM SSC_DAILY_EXPENSE_DETAIL_INFO WHERE ID= APPLYNO;


  END IF ;


END ;

3.          如果工程是有用到 Ibatis 那么 Ibatis sql 语句写法也有些区别

a)          Ibatis 支持 oracle 数据库 sql 中可以带 * 号查询, db2 不能使用 select * from tablename ;这是最主要的。

b)          Ibatis 支持 oracle 空值插入、更新,但是如果是 db2 映射值传空的话要必须要加上对应的字段类型

如: # remark:VARCHAR#

                                remark 是属性值, VARCHAR 是数据库中对应的字段类型。

 

总结了一下,方便以后查阅,同时也希望对看到这篇博客的朋友一些帮助,因为最近在解决这些问题时也花了不少时间。

猜你喜欢

转载自wuxiangqian.iteye.com/blog/1750325