oracle与db2.docx
- 文档编号:11297113
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:115
- 大小:70.68KB
oracle与db2.docx
《oracle与db2.docx》由会员分享,可在线阅读,更多相关《oracle与db2.docx(115页珍藏版)》请在冰豆网上搜索。
oracle与db2
1、取前N条记录
Oracle:
Select*fromTableNamewhererownum<=N;
DB2:
Select*fromTableNamefetchfirstNrowsonly;
2、取得系统日期
Oracle:
Selectsysdatefromdual;
DB2:
Selectcurrenttimestampfromsysibm.sysdummy1;
3、空值转换
Oracle:
Selectproductid,loginname,nvl(cur_rate,'0')fromTableName;
DB2:
Selectproductid,loginname,value(cur_rate,'0')fromTableName;
Coalesce(cur_rate,'0')
4、类型转换(8版有了to_char,to_date,9版新增了to_number)
Oracle:
selectto_char(sysdate,'YYYY-MM-DDHH24:
MI:
SS')fromdual;
DB2:
selectvarchar(currenttimestamp)fromsysibm.sysdummy1;
## Oracle数据类型改变函数:
to_char()、to_date()、to_number()等;
如果仅仅取年,月,日等,可以用to_char(sysdate,'YYYY'),to_char('MM'),to_char('DD')取得。
只取年月日TRUNC(SYSDATE),
取时分秒TO_CHAR(SYSDATE,'HH24:
MI:
SS')。
## DB2数据类型改变函数:
char()、varchar()、int()、date()、time()等;
取得年,月,日等的写法:
YEAR(currenttimestamp),MONTH(currenttimestamp),DAY(currenttimestamp),HOUR(currenttimestamp),MINUTE(currenttimestamp),SECOND(currenttimestamp),MICROSECOND(currenttimestamp),
只取年月日可以用DATE(currenttimestamp),取时分秒TIME(currenttimestamp)。
Char()是定长字符串(1-255),varchar()为非定长字符串(1-32672)
日期,时间形态变为字符形态:
char(currentdate),char(currenttime)
将字符串转换成日期或时间形态:
TIMESTAMP('2002-10-2012:
00:
00'),DATE('2002-10-20'),
DATE('10/20/2002'),TIME('12:
00:
00')
## 目前DB2V8也支持to_char和to_date
5、快速清空大表
Oracle:
truncatetableTableName;
DB2:
altertableTableNameactivenotloggedinitiallywithemptytable;
6、关于ROWID
Oracle它是由数据库唯一产生的,在程序里可以获得
DB2 v8也有此功能。
7、To_Number
Oracle:
selectto_number('123')fromdual;
DB2:
selectcast('123'asinteger)fromsysibm.sysdummy1;
SELECTCAST(currenttimeaschar(8))FROMsysibm.sysdummy1
8、创建类似表
Oracle:
createtableaasselect*fromb;
DB2:
createtablealikeb;
CREATETABLEtab_newASselectcol1,col2…FROMtab_oldDEFINITIONONLY(8版有效,9版无效)
9、decode方法
Oracle:
decode方法(DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值))或者case语句
DB2中只有CASE表达式
SELECTid,name,
CASE
WHENinteger(flag)=0THEN‘假’
WHENinteger(flag)=1THEN‘真’
ELSE‘异常’
END
FROMTEST
或者
SELECTid,name,
CASEinteger(flag)
WHEN0THEN‘假’
WHEN1THEN‘真’
ELSE‘异常’
END
FROMTEST
10、子查询(8版,9版也支持子查询)
Oracle:
直接用子查询
Db2:
with语句
WITHa1AS
(selectmax(id)asaa1fromtest)
selectid,aa1fromtest,a1
11、数据类型
比较大的差别:
Oracle:
char2000
DB2:
char254
Oracle:
date datetime
Db2:
DATE:
日期TIME:
时间TIMESTAMP:
日期时间
1、数据类型转换函数
整型转字符型
字符串转整形
字符串转浮点型
浮点型转字符串
字符串转日期
字符串转时间戳
日期转字符串
ORACLE
to_char
(1)
to_number('1')
to_number('1.1')
to_char(1.1)
to_date('2007-04-26','yyyy-mm-dd')
to_date('2007-04-2608:
08:
08','YYYY-MM-DDHH24:
MI:
SS')
to_char(to_date('2007-04-29','yyyy-mm-dd'),'yyyy-mm-dd')
DB2
char
(1)
int('1')
double('1.1')
char(1.1)
date('2007-04-26')
to_date('2007-04-2608:
08:
08','YYYY-MM-DDHH24:
MI:
SS')
char(date('2007-04-29'))
兼容写法
cast(1aschar)
cast('1'asint)
无
无
无
兼容
无
2、Where条件弱类型判断
oracle:
where字符型字段in(整形)是允许,DB2不允许
select'abc'fromdualwhere'1'in
(1)在oracle下可通过
select'abc'fromsysibm.sysdummy1where'1'in
(1)在DB2下报错
oracle:
where字符型字段=数字型字段允许,DB2不允许
select'abc'fromdualwhere'1'=1在oracle下可通过
select'abc'fromsysibm.sysdummy1whre'1'=1在DB2下报错
3、replace关键字
oracle支持,DB2不支持createorreplace语句在DB2下是非法的
4、子查询别名
ORACLE支持select*from(select1fromdual)或者select*from(select1fromdual)t
DB2支持select*from(select1fromsysibm.sysdummy1)t或者select*from(select1fromsysibm.sysdummy1)ast
固兼容的写法是select*from(子查询)t
5、DATE数据类型的区别
ORACLE中DATE型也是带有时分秒的,但DB2下DATE只是年月日,如'2007-04-28',且可作为字符串直接操作,DB2中要记录时分秒必须采用TIMESTAMP型
一个采用hibernate后常见的兼容问题是:
如果在映射文件中定义了某个字段为Date型
则在DB2下,此字段必须定义为timestamp,而不能定义成DATE,不然会报出字符串右截断的错误
对于DB2来说,在查询条件中可以直接用字符串指定日期或时间戳类型字段的值,例如wherecreate_date='2007-04-26'、wherecreate_timestamp='2007-04-2608:
08:
08',无须使用字符串转日期函数
6、分页的处理
如果采用JDBC分页的话,注意rownum在DB2中不受支持,比如从masa_area表中取得area_id最小的10条记录,语句分别如下,注意这里的别名t书写方法
ORACLE:
selectt.*from(selectrownumasr1,masa_area.*frommasa_areaorderbyarea_id)twheret.r1<=10
DB2:
selectt.*from(selectrownumber()over()asr1,masa_area.*frommasa_areaorderbyarea_id)twheret.r1<=10
7、decode函数
decode函数在DB2不被支持,兼容的写法是采用casewhen
8、NVL函数
nvl写法在DB2不被支持,兼容的写法是采用coalesce
ORACLE:
selectNVL(f_areaid,'空')frommasa_user等同于selectcoalesce(f_areaid,'空',f_areaid)frommasa_user
DB2:
selectcoalesce(f_areaid,'空',f_areaid)frommasa_user
9、substr的不同
DB2substr举例如下:
masa_group表的f_groupCode字段定义成VARCHAR(100),所以下面这个语句不会出错,如果是substr(f_groupCode,1,101)就出错了
select*frommasa_groupwheresubstr(f_groupCode,1,50)='001006'orderbyf_groupcode
在DB2下无错,但是
select*frommasa_groupwheresubstr('001006',1,50)='001006'orderbyf_groupcode
就报错,说第三个参数超限
这是因为'001006'已经定义为一个长度为6的charater了
这点和ORACLE有很大不同,请大家注意
如果是要从第一位取到最后一位,稳妥的办法是不要加第三个参数
ORACLE:
selectsubstr('123456',1)fromdual
DB2:
selectsubstr('123456',1)fromsysibm.sysdummy1
都没有问题
因为项目需要,要将Oracle上的东西转移到DB2,于是收集整理了一些需要修改点的注意事项,拿出来大家分享。
ORACLE和DB2实现相同功能的实例(主要以Oracle8I和DB27.X为例,已测试)
取前N条记录
Oracle
Select*fromTableNamewhererownum<=N;
DB2
Select*fromTableNamefetchfirstNrowsonly;
取得系统日期
Oracle
Selectsysdatefromdual;
DB2
Selectcurrenttimestampfromsysibm.sysdummy1;
空值转换
Oracle
Selectproductid,loginname,nvl(cur_rate,'0')fromTableName;
DB2
Selectproductid,loginname,value(cur_rate,'0')fromTableName;
类型转换
Oracle
selectto_char(sysdate,'YYYY-MM-DDHH24:
MI:
SS')fromdual;
DB2
selectvarchar(currenttimestamp)fromsysibm.sysdummy1;
■Oracle数据类型改变函数:
to_char()、to_date()、to_number()等;如果仅仅取年,月,日等,可以用to_char(sysdate,'YYYY'),to_char('MM'),to_char('DD')取得。
只取年月日TRUNC(SYSDATE),取时分秒TO_CHAR(SYSDATE,'HH24:
MI:
SS')。
■DB2数据类型改变函数:
char()、varchar()、int()、date()、time()等;取得年,月,日等的写法:
YEAR(currenttimestamp),MONTH(currenttimestamp),DAY(currenttimestamp),HOUR(currenttimestamp),MINUTE(currenttimestamp),SECOND(currenttimestamp),MICROSECOND(currenttimestamp),只取年月日可以用DATE(currenttimestamp),取时分秒TIME(currenttimestamp)。
Char()是定长字符串(1-255),varchar()为非定长字符串(1-32672)
日期,时间形态变为字符形态:
char(currentdate),char(currenttime)
将字符串转换成日期或时间形态:
TIMESTAMP('2002-10-2012:
00:
00'),DATE('2002-10-20'),DATE('10/20/2002'),TIME('12:
00:
00')
快速清空大表
Oracle
truncatetableTableName;
DB2
altertableTableNameactivenotloggedinitiallywithemptytable;
关于ROWID
Oracle
它是由数据库唯一产生的,在程序里可以获得
DB2
有此概念,但不能被程序获得。
解决方案待定(高人请联系本人caoxicao@)。
To_Number
Oracle
selectto_number('123')fromdual;
DB2
selectcast('123'asinteger)fromsysibm.sysdummy1;
复制创建表
Oracle
createtableaasselect*fromb;
DB2
createtablealikeb;
字符串的截取:
属于DB2,试试看:
SELECT LEFT(STRINGFIELD1, 2), RIGHT(STRINGFIELD2) FROM TABLE1
DB2错误代码/SQL返回码信息对照
--newcoin-->
用COBOL链接DB2时,出现DB2错误信息时,如果你不懂代码是什么意思,可以用这份资料查找,
当然你也可以直接在db2的命令行下输入:
db2?
SQL30081N,系统会给出一些提示信息.
sqlcode
sqlstate
DB2错误信息(按sqlcode排序)
000
00000
SQL语句成功完成
01xxx
SQL语句成功完成,但是有警告
+012
01545
未限定的列名被解释为一个有相互关系的引用
+098
01568
动态SQL语句用分号结束
+100
02000
没有找到满足SQL语句的行
+110
01561
用DATACAPTURE定义的表的更新操作不能发送到原来的子系统
+111
01590
为2型索引设置了SUBPAGES语句
+117
01525
要插入的值的个数不等于被插入表的列数
+162
01514
指定的表空间被置为检查挂起状态
+203
01552
使用非唯一的名字来解决命名的限定列
+204
01532
命名的对象未在DB2中定义
+206
01533
命名的列不在SQL语句中指定的任何表中存在
+218
01537
因为SQL语句引用一个远程对象,不能为该SQL语句执行EXPLAIN
+219
01532
命名的PLANTABLE不存在
+220
01546
不正确定义PLANTABLE,检查命名列的定义
+236
01005
SQLDA中的SQLN的值至少应于所描述的列的个数一样大
+237
01594
至少有一个被描述的列应该是单值类型,因此扩展的SQLVAR条目需要另外的空间
+238
01005
至少应有一个被描述的列是一个LOB,因此扩展的SQLVAR条目需要另外的空间
+239
01005
至少应有一个被描述的列应是单值类型,因此扩展的SQLVAR条目需要另外的空间
+304
01515
该值不能被分配给宿主变量,因为该值不再数据类型的范围之内
+331
01520
不能被翻译的字符串,因此被设置为NULL
+339
01569
由于与DB22.2版本的子系统连接,所以可能存在字符转换问题
+394
01629
使用优化提示来选择访问路径
+395
01628
设置了无效的优化提示,原因代码指定了为什么,忽略优化提示
+402
01521
未知的位置
+403
01522
本地不存在CREATALIAS对象
+434
01608
在DB2未来发布的版本中将不支持指定的特性,IBM建议你停止使用这些特性
+445
01004
值被CAST函数截取
+462
01Hxx
由用户定义的函数或存储过程发出的警告
+464
01609
命名的存储过程超出了它可能返回的查询结果集的个数限制
+466
01610
指定由命名的存储过程返回的查询结果集的个数。
成功完成
+494
01614
由存储过程返回的结果集的个数超过了由ASSOCIATELOCATORS语句指定的结果集定位器的个数
+495
01616
因为倒台SQL的成本估算超出了在ELST中指定的警告阀值,所以发出警告
+535
01591
请求一个主健的定位更新,或请求一个使用自我引出约束的表的删除操作
+541
01543
命名外健是一个重复的引用约束
+551
01548
命名的授权ID缺少在命名的DB2对象上执行命名操作的权限
+552
01542
命名的授权ID缺少执行命名操作的权限
+558
01516
已经被授权该PUBLIC,因此WITHGRANTOPTION不可用
+561
01523
对ALTERREFERENCESINDEX和TRIGGER特权,PUBLICATALLLOCATION无效
+562
01560
因为GRANTEE已经拥有这些特权,所以一个或更多的特权被忽略
+585
01625
模式名指定了不止一次
+599
01596
没有为长字符数据类型(BLOB,CLOB和DBCLOB)建立比较函数
+610
01566
由于建立了一个指定为DEFERYES的索引,指定的对象处于PENDING状态,或者因为使用了ALTERINDEX改变关键值的范围,所以指定的对象处于PENDING状态
+625
01518
因为删除了主健索引,所以表定义被标注为不完整
+626
01529
删除了加强UNIQUE约束的索引,唯一性不在被加强
+645
01528
因为建立的索引中没有包含NULL,所以WHERENOTNULL被忽略
+650
01538
不能更改或者建立已命名的表为从属表
+653
01551
在已指定的分区表空间中尚没有建立指定的分区索引,所以分区索引不可得
+655
01597
为CREATE或ALTERSTOGROUP语句指定特定或者非特定的卷ID,在DB2较新发布的版本中(版本6以后)将不再支持他们
+658
01600
当建立目录索引时,不能指定SUBPAGES语句,SUBPAGES将被忽略,并缺省为1
+664
01540
分区索引的限制关键字超出了最大值
+738
01530
已命名的对象的更改可能像只读系统中对象的改变要求一样
+799
0157
SET语句中引用的特定寄存器不存在,将忽略SET请求
+802
01519
数据溢出或者因除法异常而引起的数据异常错误
+806
01553
ISOLATION(RR)与LOCKSIZEPAGE冲突
+807
01554
由于十进制乘法导致溢出
+863
01539
连接成功,但是只支持SBCS
+2000
56094
SUBPAGES不等于1的1型索引不能成为数据共享环境中的缓冲池组依赖者
+2002
01624
因为指定的缓冲池不允许超高速缓存,GNPCACHE指定被忽略
+2007
01602
因为DB2子系统的参数禁用“提示(hiats)”所以不能指定优化提示
+30100
01558
分布式协议错误被检测到,提供原来的SQLCODE和SQLSTATE
-007
42601
SQL语句中由非法字符
-010
42603
字符串常量非正常终止;检查到有遗漏的引号标志
-029
42601
需要INTO语句
-060
42815
某特定数据类型的长度或者标量规范无效
-084
42612
不能执行SQL语句,因为该语句对动态SQL无效或者对OS/390的DB2无效
-097
42601
在单位类型、用户自定义的函数以及过程中不能使用带有CAST的LONGVARCHAR或LONGVARGRAPHIC
-101
54001
SQL语句超出了已确定的DB2限制:
例如,表的数目太多,语句中的字节太多
-102
54002
字符串常量太长
-103
42604
无效数学文字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle db2
![提示](https://static.bdocx.com/images/bang_tan.gif)