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

14 篇文章 0 订阅

项目进入开发阶段的时候,为了方便,一直使用 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/400DATETIME 相匹配。

 

 

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 中间空格隔开,而且必须 INOUT 之前

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 , 那么 Ibatissql 语句写法也有些区别

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

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

如: # remark:VARCHAR#

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

 

 

 

 

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值