数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
SYBASE 数据库迁移到AS 400 db2的FAQ(一)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

笔者通过从事数据库的开发和管理工作数年!前不久刚刚完成SYBASE 数据库向DB2数据库的迁移项目工作!

应网友和一些同学朋友的要求!要我介绍一些数据库迁移的策略和方法!

目前见于网上数据库迁移的资料较少!我实际工作中的遇到的技术难点和解决的策略和方法,简单介绍!希望对想要迁移数据库,又不知道如何下手的朋友有所借鉴!本文列出51个实际中问题和解决的策略和方法!非常注重实际!

1Sybase数据类型和db2有那些不同?

答:Datetime  对应 timestamp

Tinyint ,smallint  对应  smallint

Money 类型对应 numeric(19,4)

 

2db2数据库是否支持自增加列设置?

答:支持,例如:SYSID  BIGINT GENERATED ALWAYS AS IDENTITY

将原来sysid 的  numerical(18,0) 改为 BIGINT类型

 

3Db2是否有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’))

4Sybaseisnull(@vc_pici_id,’0’) 如何转换?

答:DB2下使用value(vc_pici_id,’0’)或者coalesce(vc_pici_id,’0’)

 

5Db2下如何调用存储过程和调用代返回值得存储过程?

答: (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;

6Sybase 下游标控制是非常方便的,使用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 非'01''00''02'则退出并回滚事务

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;  --关闭游标

 

7DB2存储过程的标准格式如何?

答: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

 

8Db2char()函数用法

答: 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;

 

 

9Db2timestamp()函数用法

答: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

 

10db2下如何进行字符串组合拼接?

答:使用‘||’处理,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  ;




相关文章

相关软件