简单有效的SQL 存储过程移植方案(3)——从Sybase 到DB2

本文详细介绍了SQL存储过程在不同数据库系统间的移植方案,重点讨论了时间函数getdate()的替换、CURSOR的处理、update…set…from…式语句的等价修改、临时表的等价修改以及ORDERBY中函数运算问题的解决方法。通过具体的代码对比,展示了如何在Sybase与DB2之间进行高效移植。

简单有效的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;

 

 

 

转自:http://www.vstcn.net/JiShuWenZhangShow.asp?ID=743

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值