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

标签: 实践 oracle db2 | 发表时间:2012-12-19 13:53 | 作者:
出处:http://www.iteye.com

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

1.         创建表字段类型的区别<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

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) [email protected]_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是数据库中对应的字段类型。

 

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





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [实践 oracle db2] 推荐:

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

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

Oracle、Db2、SqlServer、MySQL 数据库插入当前系统时间

- - CSDN博客推荐文章
例如有表table,table 中有两个字段:name 、makedate. 插入系统时间应为sysdate:. insert into table (name,makedate) values('测试',sysdate);. 插入系统时间应为current timestamp并且makedate数据类型为timestamp.

DB2监控

- - CSDN博客数据库推荐文章
     收集的一些DB2监控方法.. -- 是到数据库快照,并存入文件.  -- 查找并重新绑定无效包 .  -- 查出 myuser 模式下的所有无效包.  -- 利用查出的 pkgname ,使用 Rebind 重新绑定. -- 查看所有用户定义(tabschema not like 'SYS%' )表的状态.

DB2数据迁移之load

- - IT技术博客大学习
标签:   2数据迁移   DB   load.      一.load原理性知识.      1.为什么要使用LOAD.      load不需要写日志(或很少日志),不做检查约束和参照完整性约束,不触发Trigger,锁的时间比较短,因此特别适合大数据量的导入..      2.load过程分为4个阶段.

常用的DB2命令

- - CSDN博客数据库推荐文章
启动db2服务:db2start. 激活数据库实例:db2 activate database  . 查看激活状态的数据库:db2 list active databases. 失效数据库实例:db2 deactivate database . 关闭数据库服务:db2stop.

Oracle调优总结(经典实践 重要)

- - Oracle - 数据库 - ITeye博客
1.每个表的结构及主键索引情况. 2.每个表的count(*)记录是多少. 3.对于创建索引的列,索引的类型是什么. count(distinct indexcol)的值是多少. 4.最后一次对表进行分析是在什么时间,分析后,是否又对相关表做过大的操作. 5.索引最后一次rebuild,是在什么时间,此后对表的操作类型又是什么状况.

DB2数据库备份还原

- - CSDN博客数据库推荐文章
可以将上面4条命令写在一个bat文件中,每条命令占一行,在装有DB2数据库的机器上运行bat文件即可. 如果DB2的版本是9,备份出来的文件名称如“DBName.0.DB2.NODE0000.CATN0000.20130220171655.001”. 如果DB2的版本是8,备份出来的文件名称如“171655.001”,该文件时存储在目录“DBName.0/DB2/NODE0000/CATN0000/20130220/”下的.

DB2数据库性能优化介绍

- - CSDN博客数据库推荐文章
作者:chszs,转载需注明. 博客主页: http://blog.csdn.net/chszs. 前段时间,我从CSDN得到了这本书《DB2数据库性能调整和优化(第2版)》,这是一本介绍DB2数据库性能调优的书籍,此书覆盖了DB2数据库性能调优所需的全部知识和工具,而且还提供了大量的性能调优的实际案例,颇有一种“一书在手,DB2尽在掌握”的豪情.

DB2 自增长列导入、导出测试

- - CSDN博客推荐文章
1当想将表中一列修改为自动增长时,可用下面命令:. 上面命令是在改一表中列的属性时,在网上找到的很有用. 2当修改表中一列自动增长的开始值时,可用下面的命令:. 注:该列中的以及它本身的 IDENTITY 属性并没有保证所生成的序列值是唯一的. 但是, PRIMARY KEY 约束保证了表中行的唯一性.

DB2如何进行crash recovery原理浅析(转载)

- - 数据库 - ITeye博客
          跟大家一样,我也很好奇DB2是如何做crash recovery的. 最近看了一点 dabase crash recovery的资料,我把我对数据库 recovery的理解贴出来跟大家讨论讨论,这样可以帮助大家更好的理解DB2的行为. 也希望实验室的专家们能够多给我们讲点这方面的知识.