移植方案介紹
移植手冊是移植方案的核心,其中移植詳細步驟和移植點詳細解答是關鍵.限於篇幅,我們這裡只是舉例了移植詳細步驟.
注意:該系統採用 CCSID ASCII ,同時為了信息安全,我們把實例中出現的變數名、列名、表名等有含義的名稱統一用 V_n,C_n,T_n (n=1,2,3,4….) 加以替換.
移植準備工作
修改工具: UltraEdit 文本編輯器
方法1:全局替換.查找關鍵詞,用替換詞替換即可.
方法2:全局查找,逐個確認替換.查找關鍵詞,確認情景是否符合,然後用替換詞替換.
方法3:全局查找,逐個確認,手工修改.查找關鍵詞,確認情景是否符合,根據具體情景修改.
說明:示例代碼中「 Sybase 代碼」部分是修改前的代碼,「 DB2 代碼」部分是修改後的代碼.
移植詳細步驟
第一步:常見替換
方法:方法1,全局替換.
查找關鍵詞:SUBSTRING(
替換詞:SUBSTR(
查找關鍵詞:len(
替換詞:length(
查找關鍵詞:char_length(
替換詞:length(
查找關鍵詞:DATALENGTH(
替換詞:length(
查找關鍵詞:ISNULL(
替換詞:IFNULL(
查找關鍵詞: ' //表示兩個字元串的連接
替換詞: '
查找關鍵詞:!=
替換詞:<>
查找關鍵詞: <> NULL
替換詞:IS NOT NULL
第二步: 修改 Stored Procedure 定義的開頭,可以製作成統一的模板.
修改點:
◆把函數說明 『/**/』多行註釋,用『--』進行單行註釋( DB2 不支持多行註釋).
◆去掉 schema name: 『dbo.』
◆傳入參數處添加『( )』
◆傳入參數處添加IN 關鍵詞,並修改IN,OUT的位置
◆去掉關鍵詞『AS』,換成 Stored Procedure 的參數選項
◆以BEGIN作為函數體的開始,把BEGIN移到DECLARE前.
◆變數定義增加初始值及CCSID ASCII關鍵字.
清單1. Stored Procedure 定義的開頭修改示例
|
第三步:賦值語句的修改
方法:方法1,全局替換.
查找關鍵詞:SELECT @
替換詞:SET //注意:SET 後面帶一個空格
清單2 :賦值語句的修改
|
注意:該處使用全局替換可能錯誤地替換一些地方,比如語句
select @aaa=xxxx, @bbb = yyyy from …… where ……
但是情況不多,可以在 Deploy Stored Procedure 的時候發現錯誤並改回來.
第四步:全局變數 @@sqlstatus 和 WHILE 語句的改寫
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:@@sqlstatus = 0 , WHILE
修改點:
◆去掉 BEGIN, 添加 DO;
◆END 改為 END WHILE;
◆@@sqlstatus = 0 替換成 v_sqlcode = 0.//注意:v_sqlcode 的定義見後面HANDLER的定義;
◆在每個『FETCH C1 INTO …』之前添加『SET v_sqlcode =0』.
清單 3 :全局變數 @@sqlstatus 和 WHILE 語句的改寫
|
第五步:全局變數 @@ERROR 的改寫
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:@@ERROR
修改點:
(1)@@ERROR修改
清單4:@@ERROR修改
|
(2) 在前面 DECLARE 部分添加 HANDLER 處理的定義
清單5 :添加 HANDLER 處理的定義
|
第六步:修改 DECLARE 語句
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:DECLARE
修改點:
為所有類型添加 DEFAULT 值,
DEFAULT『』 -- for Char or Varchar
DEFAULT 0; -- for int
DEFAULT 0.0; -- for numeric
◆為 char 和 varchar 添加 CCSID ASCII.
◆如果函數體中間部分也存在 DECLARE 語句(比如 DECLARE CURSOR ),必須把它移到程序開始處.
注意: DB2 中所有 DECLARE 語句必須位於程序開始處.並且必須遵循以下順序:
1. SQL variable and condition declarations
2. Statement declarations
3. Cursor declarations
4. Handler declarations
5. Any valid statements for an SQL procedure body
第七步:多行註釋等價改寫成多個單行
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:/*
修改點:使用『--』進行逐行單行註釋( DB2 不支持多行註釋).
第八步:IF 語句的等價修改
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:IF
修改點:分兩種語句格式:
清單6 :多行註釋等價改寫成多個單行
|
第九步:在句末加上『;』
方法:在每一個完整的語句末尾添加『;』表示語句的分隔.
第十步: 普通 FUNCTION 替換
方法:方法2,全局查找,逐個確認替換.有時 表示數據相加,不能替換.
查找關鍵詞: //這裡表示字元串變數的連接
替換詞:
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:CONVERT
替換詞:CAST
修改點:
清單7 :在句末加上『;』
|
方法:方法2,全局查找,逐個確認替換.
查找關鍵詞:DATEDIFF
替換詞:待定
方法:方法2,全局查找,逐個確認替換.
查找關鍵詞:DATEADD
替換詞:待定
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:"
替換詞:'
注意:若是表示字元串,直接替為'.但是有時兩個單引號表示字元串內部的一個單引號,這是不能替換.
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:SQUARE
修改點: DB2 不支持函數 SQUARE,需要重新改寫.
清單8 :改寫對函數 SQUARE 的支持
|
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:SQRT
修改點:進行開平方運算時可能會出現精度不夠,導致數據誤差,需要根據具體情況改寫.
清單9:修改關鍵詞SQRT
|
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:NULL
修改點:分兩種情況:
情況1:表示判斷是否為 NULL 的語句.
清單10:關鍵詞NULL情況1
|
情況2:在如下格式的語句『insert into … select … ,NULL , … from … 』中, select 子句中 NULL 作為插入的值,但 DB2 不支持這種語法,去掉該列,默認插入值即為 NULL 值.
清單11:關鍵詞NULL情況2
|
第十一步:getdate() 函數替換
getdate() 用於獲取不同格式的時間表達.
CONVERT(CHAR, GETDATE(), 112) 時間格式為 YYYYMMDD
CONVERT(CHAR, GETDATE(), 108) 時間格式為 HHMISS
情況1:不在乎時間的格式,可以直接替換.
方法:方法2,全局查找,逐個確認替換.
查找關鍵詞:getdate()
替換詞:CURRENT TIMESTAMP
清單12:getdate()函數替換情況1
|
情況2:在乎時間的格式,需要具體情況具體改寫.
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:getdate()
清單13:getdate() 函數替換情況2
|
注意: DB2 函數 varchar_format 還支持格式 'YYYYMMDDHH24MISS':
varchar_format(CURRENT TIMESTAMP,'YYYYMMDDHH24MISS')
第十二步:游標 CURSOR 處理
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:CURSOR
修改點:
如果需要把 CURSOR 返回調用程序,不能關閉它
如果不需要把 CURSOR 返回調用程序,關閉它
DB2 中關閉CURSOR語句: CLOSE cursor-name,把DEALLOCATE CURSOR cursor-name 全局確認替換為 CLOSE cursor-name.
第十三步:update … set … from … 格式語句的等價修改
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:update
修改點:
清單14 :update … set … from … 語法格式
|
清單15 :update … set … from … 格式語句的等價修改
|
注意:上述例子中必須為 T_1 指定別名 T_1_alias ,不能在後面的WHERE條件中使用『T_1.C_1』.WHERE 條件的如何重寫(拆分)需要根據業務邏輯具體確定.
第十四步:臨時表的等價修改
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:#
修改點:分兩種情況:
情況1,利用 select 語句創建臨時表
清單16:利用 select 語句創建臨時表
|
情況2,利用 create 語句創建的臨時表
清單17:利用 create 語句創建的臨時表
|
注意:
1.所有引用臨時表的地方,必須加上『SESSION.』, 否則會使用當前的 SQLID
2.ON COMMIT DROP TABLE 表示在 COMMIT 的時候把臨時表刪除.
3. 要根據具體業務邏輯決定使用 CREATE GLOBAL TEMPORARY TABLE 還是 DECLARE GLOBAL TEMPORARY TABLE.
第十五步:ORDER BY 中帶有函數運算問題
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:order by
修改點:
DB2 中 order by Y中不支持函數.例如 『order by sum(C_1) desc.根據具體業務邏輯進行等價修改.
第十六步:UNION 問題
方法:方法2,全局查找,逐個確認替換.
查找關鍵詞:union
替換詞:union all
修改點:
為提高性能(視具體應用程序),將 union 統一替換成 union all
清單18:UNION問題
|
第十七步:GROUP BY 中帶有非聚合運算涉及的列
方法:方法3,全局查找,逐個確認,手工修改.
查找關鍵詞:group by
修改點:
在 DB2 中,group by 中的列必須是聚集函數所涉及的, Sybase 中則不然.我們要根據具體業務邏輯進行等價修改.基本上可以直接去掉 group by 中多餘的列.
清單19:GROUP BY 中帶有非聚合運算涉及的列
|
[火星人 ] 實用SQL StoredProcedure移植方案已經有920次圍觀