SYBASE 資料庫遷移到AS 400 db2的FAQ(一) (轉)

amyz發表於2007-08-16
SYBASE 資料庫遷移到AS 400 db2的FAQ(一) (轉)[@more@]

筆者透過從事的開發和管理工作數年!前不久剛剛完成 資料庫向2資料庫的遷移專案工作!

應網友和一些同學朋友的要求!要我介紹一些資料庫遷移的策略和方法!

目前見於網上資料庫遷移的資料較少!我實際工作中的遇到的技術難點和解決的策略和方法,簡單介紹!希望對想要遷移資料庫,又不知道如何下手的朋友有所借鑑!本文列出51個實際中問題和解決的策略和方法!非常注重實際!

1.Sybase資料型別和有那些不同?

答:Datetime  對應 timestamp:namespace prefix = o ns = "urn:schemas--com::office" />

Tinyint ,smallint  對應  smallint

Money 型別對應 numeric(19,4)

 

.db2資料庫是否支援自增加列設定?

答:支援,例如:SYSID  BIGINT GENERATED ALWAYS AS NTITY

將原來sysid 的  numerical(18,0) 改為 BIGINT型別

 

.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’))

.Sybase的isnull(@vc_pici_id,’0’) 如何轉換?

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

 

.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;

.Sybase 下游標控制是非常方便的,使用code,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 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;  --關閉遊標

 

.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

 

.Db2下char()函式用法

答: CHAR(DATE,Key)  , 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;

 

 

.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

 

.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  ;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-962543/,如需轉載,請註明出處,否則將追究法律責任。

相關文章