设为首页 加入收藏

TOP

Sybase(sqlanywhere)比较应用版本大小数据库函数(一)
2014-11-23 22:38:08 来源: 作者: 【 】 浏览:18
Tags:Sybase sqlanywhere 比较 应用 版本 大小 数据库函数

Sybase(sqlanywhere)比较应用版本大小 数据库函数
前置条件:版本以"."进行分割。 www.2cto.com
[sql]
ALTER FUNCTION "SMM"."fn_justsy_zh_compare_app_version"(
IN p_original VARCHAR(50)
,IN p_compare VARCHAR(50)
)
RETURNS INTEGER
DETERMINISTIC
-- 比较应用版本、
-- p_original > p_compare return -1
-- p_original = p_compare return 0
-- p_original > p_compare return 1
BEGIN
DECLARE lv_comp INTEGER;
DECLARE lv_ori_index INTEGER;
DECLARE lv_com_index INTEGER;
DECLARE lv_sort_key INTEGER;
DECLARE lv_sort_index INTEGER;
-- DECLARE lv_last_ori VARCHAR(20);
-- DECLARE lv_last_com VARCHAR(20);
-- DECLARE lv_temp_ori VARCHAR(20) ;
-- DECLARE lv_temp_com VARCHAR(20) ;
-- DECLARE lv_temp_sort INTEGER;
DECLARE LOCAL TEMPORARY TABLE SplitTable ( SortKey INTEGER DEFAULT AUTOINCREMENT, OriVal VARCHAR(20), ComVal VARCHAR(20), PRIMARY KEY(SortKey));
-------- Init Value-------
SET lv_comp = -1 ;
SET p_original = TRIM(p_original) ;
SET p_compare = TRIM(p_compare) ;
SET lv_sort_key = 1 ;
-------- Init Value-------
-- 拆分出p_original变量中字符串
SET lv_ori_index = CHARINDEX('.', p_original) ;
WHILE lv_ori_index >= 1 LOOP
INSERT INTO SplitTable( OriVal) VALUES (LEFT(p_original,lv_ori_index -1)) ;
SET p_original = SUBSTR(p_original,lv_ori_index + 1,LENGTH(p_original)-lv_ori_index) ;
SET lv_ori_index = CHARINDEX('.', p_original) ;
END LOOP ;
INSERT INTO SplitTable(OriVal) VALUES (p_original) ;
-- 拆分p_compare变量中字符串
SET lv_com_index = CHARINDEX('.', p_compare) ;
WHILE lv_com_index >= 1 LOOP
INSERT INTO SplitTable(SortKey, ComVal) ON EXISTING UPDATE VALUES(lv_sort_key,LEFT(p_compare,lv_com_index -1)) ;
SET p_compare = SUBSTR(p_compare,lv_com_index + 1,LENGTH(p_compare)-lv_com_index) ;
SET lv_com_index = CHARINDEX('.', p_compare) ;
SET lv_sort_key = 1 + lv_sort_key ;
END LOOP ;
INSERT INTO SplitTable(SortKey, ComVal) ON EXISTING UPDATE VALUES(lv_sort_key, p_compare) ;
-- FOR compare_temp AS compare_temp_cursor NO SCROLL CURSOR FOR
-- SELECT OriVal, ComVal, SortKey FROM SplitTable ORDER BY SortKey FOR READ ONLY
-- DO
-- INSERT INTO dba.ml_temp(PFName,PFXMLValue) VALUES('fn_justsy_zh_compare_app_version',OriVal+'---'+ComVal+'--'+STRING(SortKey)) ;
-- END FOR ;
-- 比较
compare_loop_for:
FOR compare_loop AS compare_loop_cursor NO SCROLL CURSOR FOR
SELECT OriVal, ComVal, SortKey FROM SplitTable ORDER BY SortKey FOR READ ONLY
DO
IF(OriVal IS NOT NULL AND ComVal IS NOT NULL) THEN
IF(OriVal > ComVal) THEN
SET lv_comp = 1 ;
LEAVE compare_loop_for ;
ELSEIF(OriVal < ComVal) THEN
SET lv_comp = -1 ;
LEAVE compare_loop_for ;
ENDIF ;
-- 版本相同的情况
IF(lv_sort_index = SortKey AND OriVal = ComVal) THEN
SET lv_comp = 0 ;
ENDIF ;
ELSEIF(OriVal IS NULL ) THEN
SET lv_comp = -1 ;
LEAVE compare_loop_for ;
ELSEIF(ComVal IS NULL) THEN
SET lv_comp = 1 ;
LEAVE compare_loop_for ;
END IF ;
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Sybase IQ锁表以及解除锁定 下一篇union all的执行顺序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: