db2通用分页类存储过程

CREATE PROCEDURE SALES.DB2PAGINATION(IN ITBNAME VARCHAR(30),   -- 表名
                                     IN ISHOWFIELD VARCHAR(1000),  -- 显示字段
                                     IN IJOIN VARCHAR(1000),   -- 联接条件(如:内联、外联)
                                     IN IWHERE VARCHAR(1000),   -- 查询条件 (注意: 不要加 WHERE)
                                     IN IORDER VARCHAR(100),   -- 排序条件 (注意: 不要加 ORDER BY)
                                     IN IPAGESIZE INTEGER,    -- 页尺寸 如果为0 默认返回前一百万条数据 可以认为是返回所有数据
                                     INOUT IOCURRENTPAGEIX INTEGER,  -- 输入和输出:当前页
                                     OUT OPAGEENDROW INTEGER,   -- 输出:当前结束行
                                     OUT OTOTALROWS INTEGER,   -- 输出:当前总记录数
                                     OUT OHASPREVIOUSPAGE INTEGER,  -- 输出:是否有上一页
                                     OUT OHASNEXTPAGE INTEGER,   -- 输出:是否有下一页
                                     OUT OTOTALPAGES INTEGER,   -- 输出:总页数
          OUT OERROR VARCHAR(100))   -- 输出:错误信息
    RESULT SETS 1
    MODIFIES SQL DATA
    NOT DETERMINISTIC
    LANGUAGE SQL
BEGIN
/**//*----------------------------------------------------------------
 * Copyright (C) 2006  Huacius
 *    版权所有。
 *
 * 存储过程分页
 *
 * MSN: Huacius@msn.com
//-----------------------------------------------------------------------*/
 DECLARE STRSQL   VARCHAR(6000);   -- 主语句
 DECLARE PAGESTARTROW INTEGER;   -- 开始行

 DECLARE result CURSOR WITH RETURN TO CALLER FOR S2;
 
 DECLARE exit handler FOR sqlexception -- 异常捕获
 BEGIN
  set OERROR = 'error!';
 END;
 
 -- BODY start --
 if(iwhere <> '') then
  set iwhere = ' where ' || iwhere;
 end if;
 if(iorder <> '') then
  set iorder = 'order by ' || iorder;
 end if;
 if(ijoin <> '') then
  set ijoin = ' ' || ijoin;
 end if;
  
 set strsql = 'select count(*) from ' || itbname || ijoin || iwhere;
 prepare s2 from strsql;
 open result;
    fetch result into ototalrows;   -- 总记录数
    close result;

 if(ipagesize = 0) then
  set ipagesize = 1000000;   -- 每页显示数
 end if;

 set ototalpages = (ototalrows - 1) / ipagesize + 1;   -- 总页数

 if(iocurrentpageix < 1) then
  set iocurrentpageix = 1;   -- 当前页
 else
  if(iocurrentpageix > ototalpages) then
   set iocurrentpageix = ototalpages;
  end if;
 end if;

 set pagestartrow = ipagesize * (iocurrentpageix -1) + 1; -- 每页开始数
 if(iocurrentpageix = ototalpages) then
  set opageendrow = ototalrows;       -- 每页结束数
 else
  set opageendrow = ipagesize * iocurrentpageix;
 end if;

 if(iocurrentpageix > 1) then
  set ohaspreviouspage = 1;   -- 是否有上一页
 else
  set ohaspreviouspage = 0;
 end if;

 if(iocurrentpageix < ototalpages) then
  set ohasnextpage = 1;    -- 是否有下一页
 else
  set ohasnextpage = 0;
 end if;

 set strsql = 'select * from (select rownumber() over(' || iorder || ') as rownum,'
    || ishowfield 
    || ' from '
    || itbname
    || ijoin
    || iwhere
    || ') as temp where rownum between ' || rtrim(char(pagestartrow)) || ' and ' || rtrim(char(opageendrow));
 prepare s2 from strsql;
 open result;
 -- BODY end --

END 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值