筆者通過從事數據庫的開發和管理工作數年!前不久剛剛完成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,