简单有效的SQL Stored Procedure移植方案 (3)
简单有效的SQL Stored Procedure移植方案 (3)
情况2:在乎时间的格式,需要具体情况具体改写。
方法:方法3,全局查找,逐个确认,手工修改。
查找关键词:getdate()
清单13:getdate() 函数替换情况2
Sybase 代码:
CONVERT(CHAR, GETDATE(), 112)
DB2 代码:
varchar_format(CURRENT TIMESTAMP,'YYYYMMDD')
Sybase 代码:
CONVERT(CHAR, GETDATE(), 108)
DB2 代码:
varchar_format (CURRENT TIMESTAMP,'HH24MISS')
注意: 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 … 语法格式
Sybase 语法:
update … set V_1=C_1, V_2=C_2 … from T_1 … where …,
DB2 不支持上述语法,需要改写成如下语法:
update … set (V_1,V_2 ) =
(select C_1,C_2 From T_1 … Where …) where …
清单15 :update … set … from … 格式语句的等价修改
Sybase代码:
UPDATE T_1
SET V_1 = T_2_alias.C_1, V_2 = T_2_alias.C_2, V_3 = T_2_alias.C_3
FROM T_2 T_2_alias
WHERE T_1.C_1 = T_2_alias.C_1
AND T_1.C_4=V_4
DB2代码:
UPDATE T_1 T_1_alias
SET (V_1, V_2, V_3) =
(Select T_2_alias.C_1, T_2_alias.C_2, T_2_alias.C_3
FROM T_2 T_2_alias
WHERE T_1_alias.C_1 = T_2_alias.C_1 )
Where T_1_alias.C_4 = V_4
注意:上述例子中必须为 T_1 指定别名 T_1_alias ,不能在后面的WHERE条件中使用‘T_1.C_1’。WHERE 条件的如何重写(拆分)需要根据业务逻辑具体确定。
第十四步:临时表的等价修改
方法:方法3,全局查找,逐个确认,手工修改。
查找关键词:#
修改点:分两种情况:
情况1,利用 select 语句创建临时表
清单16:利用 select 语句创建临时表
Sybase 代码:
select… into #T_1 from T_2 where 1=2
DB2 代码:
DECLARE GLOBAL TEMPORARY TABLE
SESSION.#T_1 as (select … from T_2 ) WITH NO DATA
CCSID ASCII ON COMMIT DROP TABLE;
情况2,利用 create 语句创建的临时表
清单17:利用 create 语句创建的临时表
Sybase 代码:
create table #T_1(C_1 type,C_2 type, … )
DB2 代码:
DECLARE GLOBAL TEMPORARY TABLE SESSION.#T_1(C_1 type,C_2 type, … )
CCSID ASCII ON COMMIT DROP TABLE;
注意:
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问题
Sybase 代码:
select C_1 from T_1 union select C_2 from T_2;
DB2 代码:
select C_1 from T_1 union all select C_2 from T_2;
第十七步:GROUP BY 中带有非聚合运算涉及的列
方法:方法3,全局查找,逐个确认,手工修改。
查找关键词:group by
修改点:
在 DB2 中,group by 中的列必须是聚集函数所涉及的, Sybase 中则不然。我们要根据具体业务逻辑进行等价修改。基本上可以直接去掉 group by 中多余的列。
清单19:GROUP BY 中带有非聚合运算涉及的列
Sybase代码:
select sum(C_1), C_2 from T_1 group by C_1, C_2;
select C_1, C_2 from T_1 group by C_1, C_2;
DB2 代码:
select sum (C_1),C_2 from T_1 group by C_2;
select C_1, C_2 from T_1;
本文详细介绍了SQL存储过程在不同数据库系统间的移植方案,重点讨论了时间函数getdate()的替换、CURSOR的处理、update…set…from…式语句的等价修改、临时表的等价修改以及ORDERBY中函数运算问题的解决方法。通过具体的代码对比,展示了如何在Sybase与DB2之间进行高效移植。
——从Sybase 到DB2&spm=1001.2101.3001.5002&articleId=7258510&d=1&t=3&u=1ca02e45ff214cb490fe5aa53ad72fa5)
979

被折叠的 条评论
为什么被折叠?



