ITPub博客

首页 > 数据库 > 数据库开发技术 > DB2 与ORACLE对比

DB2 与ORACLE对比

原创 数据库开发技术 作者:xsmdel 时间:2011-04-14 21:47:35 0 删除 编辑

DB2 专用寄存器

values(current date)

values(current refresh age)

values(current default transform group)

values(current schema)

values(current degree current server)

values(current explain mode)

values(current time)

values(current explain snapshot)

values(current timestamp)

values(current node)

values(current timezone)

values(current path user)

values(current query optimization)

DB2 临时表定义规则

declare global temporary table session.templ --定义临时表templ

like employee --定义临时表类型与 employee表名类似

on commit preserve rows --定义当数据提交后写入临时表

not logged --不记录历史

in mytempspace --定义表空间

Oracle区别在与create declare

具体语法可以参考官方:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0003272.htm

应用举例:

declare global temporary table session.templ --定义临时表templ

like a --定义临时表类型与 employee表名类似

on commit preserve rows --定义当数据提交后写入临时表;与Oracle一致的

not logged --不记录历史

in test --定义表空间

declare global temporary table session.test --定义临时表templ

like a --定义临时表类型与 employee表名类似

on commit delete rows --数据在 Transaction 期间有效,一旦COMMIT后,数据就被自动 TRUNCATE 掉了;与Oracle一致的

not logged --不记录历史

in test --定义表空间

DB2 访问前10行数据与Oracle区别

DB2 -- select * from test fetch first 10 rows only

Oracle -- select * from test where rownum<=10

DB2 Insert into Oracle区别

DB2 允许有类似这样多行插入 insert into staff values(1212,'cemy',20,'sales',3,90000,30000),

(1212,'cemy',20,'sales',3,90000,30000);

举例:

SQL> insert into staff values(1212,'cemy',20,'sales',3,90000,30000);

已创建 1 行。

SQL> insert into staff values(1212,'cemy',20,'sales',3,90000,30000),(1212,'cemy'

,20,'sales',3,90000,30000);

insert into staff values(1212,'cemy',20,'sales',3,90000,30000),(1212,'cemy',20,'

sales',3,90000,30000) *

1 行出现错误:

ORA-00933: SQL 命令未正确结束

DB2 Update Oracle区别

DB2 update staff set (salary,comm)=(80000,50000);

DB2 update staff set salary=80000,comm=50000;

举例:

SQL> update staff set (salary,comm)=(80000,50000);

update staff set (salary,comm)=(80000,50000) *

1 行出现错误:

ORA-01767: UPDATE ...SET 表达式必须是子查询

SQL> update staff set salary=80000,comm=50000;

已更新 1 行。

DB2 合并查询 Oracle区别

DB2 INTERSECTEXCEPTUNION集合操作测试

说明:DB2支持三种集合操作INTERSECT(交集)、EXCEPT(差集)、UNION(合集),在ORACLE等数据库里面也有类似的操作,但是细微的地方可能有些差别,现在专门测试一下,以求准确!玩数据千万要细心啊,否则会带来难以意料的结果,呵呵!

测试环境:

DROP TABLE AA_WEEK;

CREATE TABLE AA_WEEK(

CODE SMALLINT NOT NULL,

EN_NAME VARCHAR(20) NOT NULL,

ABB VARCHAR(20),

CONSTRAINT P_AA_WEEK_CODE PRIMARY KEY (CODE)

);

COMMENT ON TABLE AA_WEEK IS

'星期';

COMMENT ON AA_WEEK

(CODE IS '星期代码',

EN_NAME IS '英文星期名',

ABB IS '英文缩写'

);

INSERT INTO AA_WEEK VALUES

(1,'Monday','Mon'),

(2,'Tuesday','Tues'),

(3,'Wednesday','Wed'),

(4,'Thursday','Thurs'),

(5,'Friday','Friday'),

(6,'Saturday','Sat'),

(7,'Sunday','Sun');

COMMIT;

查询一把,看看所有数据:

SELECT * FROM AA_WEEK;

+------+-----------+--------+

| CODE | EN_NAME | ABB |

+------+-----------+--------+

| 1 | Monday | Mon |

| 2 | Tuesday | Tues |

| 3 | Wednesday | Wed |

| 4 | Thursday | Thurs |

| 5 | Friday | Friday |

| 6 | Saturday | Sat |

| 7 | Sunday | Sun |

+------+-----------+--------+

一、交集运算:INTERSECTINTERSECT ALL

-- 求交集:AB 貌似Oracle没有求交集,项目暂时还没有留意到

SELECT * FROM AA_WEEK X WHERE X.CODE IN (1,2,3) -- 集合A

INTERSECT -- 集合B

SELECT * FROM AA_WEEK X WHERE X.CODE IN (2,3,4);

---------------------------------

2 'Tuesday' 'Tues'

3 'Wednesday' 'Wed'

说明:INTERSECTINTERSECT ALL是等效的。

二、差集运算:EXCEPTEXCEPT ALL Oracle minus 一致

-- 求差集:AB

SELECT * FROM AA_WEEK X WHERE X.CODE IN (1,2,3) -- 集合A

EXCEPT -- 集合B

SELECT * FROM AA_WEEK w WHERE w.CODE IN (2,3,4);

说明:EXCEPTEXCEPT ALL是等效的。

---------------------------------

1 'Monday' 'Mon'

三、合集运算 UNION UNION ALL Oracle时等效的

DB2 Oracle 类似语法

如:existscase when in

DB2 With as语法 Oracle区别

DB2 WITH TMP_MON(MON) --(MON) 必须加上否则会有错误

AS (VALUES 1,2,3,4,5,6,7,8,9,10,11,12) SELECT * FROM TMP_MON

如: WITH TMP_MON AS (VALUES 1,2,3,4,5,6,7,8,9,10,11,12)

SELECT * FROM TMP_MON

DB2 Database Error: ERROR [42908] [IBM][DB2/NT64] SQL0153N The statement does not include a required column list. SQLSTATE=42908

Oracle with a as (select * from test)

select * from a;

Oracle其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它

这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了

DB2 截断 Oracle truncate区别

DB2: ALTER TABLE TEST ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE

Oracle: truncate table

Truncate语法:TRUNCATE TABLE name [DROP/REUSE STORAGE]   

DROP STORAGE:显式指明释放数据表和索引的空间   

REUSE STORAGE:显式指明不释放数据表和索引的空间

[@more@]

据说 DB2 V9.7 开始与ORACLE语法兼容。ITPUB 上也有人开始研究。

我这里是项目用的DB2V9.5版本还是有很多不同,简单记录在这里备忘

http://www.itpub.net/thread-1353451-1-1.html 这里有相关讨论

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13159425/viewspace-1048678/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-03-29

  • 博文量
    52
  • 访问量
    149173