软件开发

db2存储过程死循环。。。帮忙看看啊,急死!!!

CREATE PROCEDURE PRO_TREND_EXTRACT
 (IN IN_TBNAME VARCHAR(30),          --   目标表名               
  IN IN_FOCUSFIELD VARCHAR(100),        --   关注字段(多字段逗号分隔)
  IN IN_FIELD VARCHAR(2000),         --   显示字段                
  IN IN_WHERE VARCHAR(2000),         --   筛选条件                
  IN IN_ORDERBY VARCHAR(2000),                          --   排序字段(多字段逗号分隔)
  IN IN_GROUPBY VARCHAR(100),                          --   分组字段(多字段逗号分隔)
  IN IN_TREND VARCHAR(5),            --   连续趋势(desc减,asc增)  
  IN IN_TRENDSTEP VARCHAR(20),                         --   连续步长
  IN IN_RESULTTABLE VARCHAR(100),    --   结果表名               
  IN IN_TABLESPACE VARCHAR(100),     --   结果表生成表空间       
  IN IN_INDEXSPACE VARCHAR(100),     --   结果表索引空间         
  OUT OUT_CODE INTEGER, 
  OUT OUT_MSG VARCHAR(8000)
 ) 
  SPECIFIC PRO_TREND_EXTRACT
  LANGUAGE SQL
  NOT DETERMINISTIC
  CALLED ON NULL INPUT
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
  begin
  declare SQLCODE          integer default 0;
  ------------sql 变量
  ------------sql 变量
  
DECLARE sql_select VARCHAR(8000);
DECLARE sql_select1 VARCHAR(8000);


DECLARE sql_insert VARCHAR(8000);
DECLARE sql_create VARCHAR(8000);
DECLARE V_FOCUSFIELD_1 DECIMAL(31,8);
DECLARE V_FOCUSFIELD_2 DECIMAL(31,8);
DECLARE v_groupid int;
DECLARE v_groupid_c char(20);
DECLARE trd_task1 CURSOR
FOR
SQL_CUR1;

------------------创建结果表-------------------------
   SET sql_create = 'create table ' ||IN_RESULTTABLE|| ' as ( select ' ||IN_FIELD|| ' from ' ||IN_TBNAME|| ' )' || 'definition only IN ' ||IN_TABLESPACE|| ' INDEX IN ' ||IN_INDEXSPACE|| ' not logged initially';----
EXECUTE IMMEDIATE sql_create;----        
COMMIT;--

--创建中间表
create table zjb (groupid int);

        SET sql_create = 'insert into zjb ( select groupid from(select '||IN_FOCUSFIELD||',rank() over(order by '||IN_GROUPBY||') as groupid from '||IN_TBNAME||') a group by groupid having max(cast('||IN_FOCUSFIELD||' as int)) - min(cast('||IN_FOCUSFIELD||' as int)) >= cast('||IN_TRENDSTEP||' as int))';
        EXECUTE IMMEDIATE sql_create;----        
COMMIT;--

set sql_select = 'select distinct groupid from zjb'; 
PREPARE SQL_CUR1
FROM sql_select;

OPEN trd_task1;

f_loop1:loop FETCH trd_task1 INTO v_groupid;

set v_groupid_c=char(v_groupid);

   SET sql_insert = 'insert into ' ||IN_RESULTTABLE|| ' (select distinct '||IN_FIELD|| ' from (SELECT '||IN_FIELD||',RANK() OVER(ORDER BY '||IN_GROUPBY||') as groupid from '||IN_TBNAME||' where '||IN_WHERE||' order by '||IN_FOCUSFIELD||','||IN_GROUPBY||','||IN_ORDERBY||' '||IN_TREND||') a where groupid='||v_groupid_c||')';
         
         EXECUTE IMMEDIATE sql_insert;----        


END loop f_loop1;---- 
CLOSE trd_task1;--
--删除中间表
drop table zjb;
COMMIT;

END;

游标中只有3条数据~~~
存储过程附件

附件:

附件图标s.sql (2.7 KB)

参与7

6同行回答

huangxinhuangxin  其它 , 河南拓普计算机网络工程有限公司
可以了吗显示全部
可以了吗收起
IT分销/经销 · 2012-09-28
浏览723
daijiangbodaijiangbo  项目经理 , 山东众阳软件有限公司
回复 5# huangxin     非常感谢~显示全部
回复 5# huangxin


    非常感谢~收起
软件开发 · 2012-09-28
浏览740
daijiangbodaijiangbo  项目经理 , 山东众阳软件有限公司
回复 3# huangxin     看不明白,你能在我的存储过程中填上吗?显示全部
回复 3# huangxin


    看不明白,你能在我的存储过程中填上吗?收起
软件开发 · 2012-09-28
浏览723
huangxinhuangxin  其它 , 河南拓普计算机网络工程有限公司
在open上写declare continue handler for not_found set at_endc3=1;在游标中写if at_endc3=1 then leave f_loop1;显示全部
在open上写declare continue handler for not_found set at_endc3=1;
在游标中写if at_endc3=1 then leave f_loop1;收起
IT分销/经销 · 2012-09-28
浏览720
JerrychanJerrychan  系统架构师 , 思达奇
没有写跳出语句(exit )。显示全部
没有写跳出语句(exit )。收起
IT分销/经销 · 2012-09-28
浏览727
huangxinhuangxin  其它 , 河南拓普计算机网络工程有限公司
CREATE PROCEDURE PRO_TREND_EXTRACT (IN IN_TBNAME VARCHAR(30),          --   目标表名                 IN IN_FOCUSFIELD VARCHAR(100),    ...显示全部
CREATE PROCEDURE PRO_TREND_EXTRACT
(IN IN_TBNAME VARCHAR(30),          --   目标表名               
  IN IN_FOCUSFIELD VARCHAR(100),        --   关注字段(多字段逗号分隔)
  IN IN_FIELD VARCHAR(2000),         --   显示字段               
  IN IN_WHERE VARCHAR(2000),         --   筛选条件               
  IN IN_ORDERBY VARCHAR(2000),                          --   排序字段(多字段逗号分隔)
  IN IN_GROUPBY VARCHAR(100),                          --   分组字段(多字段逗号分隔)
  IN IN_TREND VARCHAR(5),            --   连续趋势(desc减,asc增)  
  IN IN_TRENDSTEP VARCHAR(20),                         --   连续步长
  IN IN_RESULTTABLE VARCHAR(100),    --   结果表名               
  IN IN_TABLESPACE VARCHAR(100),     --   结果表生成表空间      
  IN IN_INDEXSPACE VARCHAR(100),     --   结果表索引空间         
  OUT OUT_CODE INTEGER,
  OUT OUT_MSG VARCHAR(8000)
)
  SPECIFIC PRO_TREND_EXTRACT
  LANGUAGE SQL
  NOT DETERMINISTIC
  CALLED ON NULL INPUT
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
  begin
  declare SQLCODE          integer default 0;
  ------------sql 变量
  ------------sql 变量
  
DECLARE sql_select VARCHAR(8000);
DECLARE sql_select1 VARCHAR(8000);


DECLARE sql_insert VARCHAR(8000);
DECLARE sql_create VARCHAR(8000);
DECLARE V_FOCUSFIELD_1 DECIMAL(31,8);
DECLARE V_FOCUSFIELD_2 DECIMAL(31,8);
DECLARE v_groupid INT;
DECLARE V_TRENDSTEP INT;
DECLARE trd_task1 CURSOR FOR SQL_CUR1;


SET V_TRENDSTEP=BIGINT(IN_TRENDSTEP);

------------------创建结果表-------------------------
   SET sql_create = 'create table ' ||IN_RESULTTABLE|| ' as ( select ' ||IN_FIELD|| ' from ' ||IN_TBNAME|| ' )' || 'definition only IN ' ||IN_TABLESPACE|| ' INDEX IN ' ||IN_INDEXSPACE|| ' not logged initially';----
EXECUTE IMMEDIATE sql_create;----       
COMMIT;--
        SET sql_create = 'create table  zjb as ( select groupid from(select '||IN_FOCUSFIELD||',rank() over(order by '
||IN_GROUPBY||' as groupid from '||IN_TBNAME||' a group by groupid having max(cast('||IN_FOCUSFIELD||'as int)) - min(cast('
||IN_FOCUSFIELD||' as int)) >= '||V_TRENDSTEP||')))' || 'definition only IN ' ||IN_TABLESPACE|| ' INDEX IN ' ||IN_INDEXSPACE|| ' not logged initially';----
EXECUTE IMMEDIATE sql_create;----       
COMMIT;--

set sql_select = 'select distinct groupid from zjb';
PREPARE SQL_CUR1
FROM sql_select;

declare continue handler for not_found set at_endc3=1;
OPEN trd_task1;

f_loop1:loop FETCH trd_task1 INTO v_groupid;

-----------判断增加或减少-----------
if at_endc3=1 then leave f_loop1;
ELSEIF UCASE(IN_TREND) = 'ASC' OR UCASE(IN_TREND) = 'asc' THEN

   SET sql_insert = 'insert into ' ||IN_RESULTTABLE|| ' (select distinct '||IN_FIELD|| ' from (SELECT '||IN_FIELD||',RANK() OVER(ORDER BY '||IN_GROUPBY||') as groupid from '||IN_TBNAME||' where '||IN_WHERE||' order by '||IN_FOCUSFIELD||','||IN_GROUPBY||','||IN_ORDERBY||') a where groupid = '||v_groupid||')';--
EXECUTE IMMEDIATE sql_insert;----       
if SQLCODE <> 0 THEN
   SET Out_Code = SQLCODE;----
   SET Out_Msg = 'sql执行失败:' ||sql_create;----
RETURN-1;----
END IF;
ELSE

   SET sql_insert = 'insert into ' ||IN_RESULTTABLE|| ' (select distinct '||IN_FIELD|| ' from (SELECT '||IN_FIELD||',RANK() OVER(ORDER BY '||IN_GROUPBY||') as groupid from '||IN_TBNAME||' where '||IN_WHERE||' order by '||IN_FOCUSFIELD||','||IN_GROUPBY||','||IN_ORDERBY||' DESC) a where groupid='||v_groupid||')';
EXECUTE IMMEDIATE sql_insert;----       
if SQLCODE <> 0 THEN
   SET Out_Code = SQLCODE;----
   SET Out_Msg = 'sql执行失败:' ||sql_create;----
RETURN -2;----
END IF;
END IF;
END loop f_loop1;----
CLOSE trd_task1;--
commit;
end
@收起
IT分销/经销 · 2012-09-28
浏览753

提问者

daijiangbo
项目经理山东众阳软件有限公司
擅长领域: AIX服务器Unix

问题状态

  • 发布时间:2012-09-28
  • 关注会员:1 人
  • 问题浏览:7576
  • 最近回答:2012-09-28
  • X社区推广