SYBASE 資料庫遷移到AS 400 db2的FAQ(一) (轉)
筆者透過從事的開發和管理工作數年!前不久剛剛完成 資料庫向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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL資料庫遷移到PostgresMySql資料庫
- 你的資料庫真的需要遷移到雲嗎?資料庫
- EAS附件表由資料庫遷移到FTP資料庫FTP
- Sybase資料庫安全資料庫
- 達夢遷移工具之MySQL資料庫遷移到達夢MySql資料庫
- db2匯出資料庫定義及遷移資料DB2資料庫
- sybase資料庫恢復資料庫
- github倉庫遷移到gitlab以及gitlab倉庫遷移到另一個gitlab伺服器GithubGitlab伺服器
- 記一次資料庫遷移到rac11204資料庫連線scan找不到主機資料庫
- 匯豐銀行從65個關聯式資料庫遷移到一個全球MongoDB資料庫 - diginomica資料庫MongoDB
- Oracle資料庫遷移到國產資料庫核心難點解析 | 聯盟釋出Oracle資料庫
- db2 資料庫DB2資料庫
- 某行XX系統DB2資料庫遷移實施方案DB2資料庫
- Sybase ASE資料庫恢復,Sybase資料恢復,資料誤刪除恢復工具READSYBDEVICE資料庫資料恢復dev
- 記一次MySQL資料遷移到SQLServer全過程MySqlServer
- 從本地MySQL遷移到雲資料庫,為什麼是Amazon Aurora?MySql資料庫
- SYBASE資料庫dbcc命令詳解(zt)資料庫
- DB2資料提取轉化的一個指令碼KCDB2指令碼
- Facebook將花費幾年時間將資料庫遷移到MySQL 8.0資料庫MySql
- 教小白搭建sybase資料庫環境資料庫
- Sybase或SQLServer資料庫分批歸檔方案SQLServer資料庫
- 一種SYBASE資料庫錯誤DBSQL_SQL_ERROR的解決方式資料庫SQLError
- OGG資料庫遷移方案(一)資料庫
- 從Hive遷移到SparkSQL,有讚的大資料實踐HiveSparkSQL大資料
- 怎麼把達夢資料庫例項從Windows遷移到Linux系統資料庫WindowsLinux
- 遷移資料庫的檔案到不同路徑(轉)資料庫
- 將檔案轉移到一個資料夾內batBAT
- 將maven、gradle倉庫遷移到d盤MavenGradle
- 七牛資料從一個桶轉移到另一個桶
- Android 資料庫綜述(一) 資料庫片的升級與資料的遷移操作Android資料庫
- 資料庫遷移資料庫
- 記錄從vuecli打包庫遷移到rollup打包Vue
- db2資料庫的啟動和關閉DB2資料庫
- svn 遷移到gitGit
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- redis資料庫遷移Redis資料庫
- 資料庫遷移 :理解資料庫
- laravel資料庫遷移Laravel資料庫
- 伺服器內的資料如何遷移到另一臺不同型號的伺服器上伺服器