笔者通过从事数据库的开发和管理工作数年!前不久刚刚完成sybase 数据库向db2数据库的迁移项目工作!
应网友和一些同学朋友的要求!要我介绍一些数据库迁移的策略和方法!
目前见于网上数据库迁移的资料较少!我实际工作中的遇到的技术难点和解决的策略和方法,简单介绍!希望对想要迁移数据库,又不知道如何下手的朋友有所借鉴!本文列出51个实际中问题和解决的策略和方法!非常注重实际!
1.sybase数据类型和db2有那些不同?
答:datetime 对应 timestamp
tinyint ,smallint 对应 smallint
money 类型对应 numeric(19,4)
2.db2数据库是否支持自增加列设置?
答:支持,例如:sysid bigint generated always as identity
将原来sysid 的 numerical(18,0) 改为 bigint类型
3.db2是否有convert()函数,sybase 下这样语句如何转换?
答:convert(datetime,convert(char(8),dateadd(day,-1,getdate()),112))
db2下没有convert()函数,关于转换可以使用如下函数
char(),timestamp(),date(),time() …另外可以使用系统内部的系统变量
current timestamp , current date , current time 代表系统当前日期时间
如上语句可以这样转换
timestamp( current date –1 days,time(’00.00.00’))
4.sybase的isnull(@vc_pici_id,’0’) 如何转换?
答:db2下使用value(vc_pici_id,’0’)或者coalesce(vc_pici_id,’0’)
5.db2下如何调用存储过程和调用代返回值得存储过程?
答: (1)无返回参数调用call proc1(v_empno, v_salary)
(2)有返回参数调用
declare ret_var integer default 0;
call proc1(var1,var2) ;
get diagnostics ret_var = return_status;
———
declare err_code integer default 0;
call proc1(var1,err_code);
if err_code = 1 then
xxxx;
end if;
6.sybase 下游标控制是非常方便的,使用sqlcode,sqlstate来控制,不知道db2下游标是如何控制的?
答:db2下游标控制不是非常的轻松和方便的,同样也可以使用sqlcode,sqlstate,或者用户自己控制,db2下sqlcode,sqlstate不能直接使用,必须声明后使用,(也就是说将系统的sqlcode,sqlstate本地实例化一分拷贝)。一般采用用户定义游标开关和sqlcode返回信息一起共同控制的方法.
举例1:(这里说明一个问题,游标开关是和sqlcode捆绑的。‘02000’就是sqlcode号)
//——-
标准使用游标的例子
标准while do 控制游标
//——-
create procedure creditp
(in i_perinc decimal(3,2),
inout o_numrec decimal(5,0))
language sql
begin — 这里是用户管理事务
declare proc_cusnbr char(5);
declare proc_cuscrd decimal(11,2);
declare numrec decimal(5,0);
declare at_end int default 0; — 开关定义
declare not_found condition for 02000; — 没有数据,游标结尾定义
declare c1 cursor for select cusnbr, cuscrd from ordapplib.customer;
declare continue handler for not_found set at_end = 1; –定义continue 条件
declare exit handler for sqlexception rollback ; –sqlcode 非010002则退出并回滚事务
set numrec = 0;
open c1;
fetch c1 into proc_cusnbr, proc_cuscrd;
while at_end = 0 do
set proc_cuscrd = proc_cuscrd +(proc_cuscrd * i_perinc);
set numrec = numrec + 1;
fetch c1 into proc_cusnbr, proc_cuscrd;
end while;
set o_numrec = numrec;
close c1;
commit; –提交事务
end
举例2:
–声明游标c1
declare c1 cursor for
select cusnbr, cuscrd
from ordapplib.customer;
open c1; –打开游标
fetch c1 into proc_cusnbr, proc_cuscrd; –从游标获取数据
if sqlstate = 02000 then –判断游标是否有数据(无)
call data_not_found; –返回调用
else
do while (substr(sqlstate,1,2) = 00 | substr(sqlstate,1,2) = 01);
fetch c1 into proc_cusnbr, proc_cuscrd;
……
end if ;
close c1; –关闭游标
7.db2存储过程的标准格式如何?
答:db2存储过程的编写比较灵活,但是语法格式是非常严格的。基本如下
cteate procedure xhzq_db.procname (
in para_1 type default value ,
out para_2 type default value)
begin ( 用户管理事务)
–用户定义变量
declare var1 type default value;
–用户定义控制临时变量
declare error_code int default 0;
declare at_end int default 0;
— 用户定义条件控制变量
declare not_found condition for 02000;
— 用户定义游标
declare c1 cursor for select col from table_name ;
— 用户定义条件和开关变量关联
declare continue handler for not_found set at_end = 1;
— 用户定义事务回滚处理条件
declare exit handler for sqlexception rollback ;
— 初始化变量直
set var = 0;
— 判断入口参数
if (para_1 is null) then
set para = 100;
end if;
— 存储过程语句体集合
open c1 ;
fetch c1 into xx,xx2,xx3 ;
….
close c1;
— 提交事务
commit work hold;
set para_2 = 0 ;
return para_2 ;
— 返回参数0 成功
end
8.db2下char()函数用法
答: char(date,keyword) , char(time,keyword)
keyword
date format
time format
usa
07/17/2001
01:48pm
iso
2001-07-17
13.48.04
eur
17.07.2001
13.48.04
jis
2001-07-17
13.48.04
select current date,current time from sysibm>sysdummy1;
9.db2下timestamp()函数用法
答:timestampdiff(k,char(ts1 – ts2))
k
date part
k
date part
256
years
128
quarters
64
months
32
weeks
16
days
8
hours
4
minutes
2
seconds
10.db2下如何进行字符串组合拼接?
答:使用‘||’处理,concat()函数
例如:
declare vc_sql_str vchar(100);
declare vc_where vchar(100);
declare vc_from vchar(100);
set vc_from = ‘ from xhzq_db.sys_parameter_tab ‘;
set vc_where = ‘ where vc_id is null ‘;
set vc_sql_str = ‘ select * ‘ || vc_from || vc_where ;