达梦数据库存储过程分页

CREATE OR REPLACE PROCEDURE dP_SelPageListOUTList(
    inPageNum IN INT,
    inPageSize IN INT,
    inSQLQuery IN VARCHAR2,
    outTotalCount OUT INT,
    outResultSet OUT CURSOR
)
AS
    vStartIndex INT;  --起始索引
    vEndIndex INT;    --结束索引
    vDynamicSQL VARCHAR2(1000); --最终分页sql
BEGIN
 -- 获取总记录数(只在第一页查询时获取)
   DBMS_OUTPUT.ENABLE();

   EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM (' || inSQLQuery || ')' INTO outTotalCount;
   DBMS_OUTPUT.PUT_LINE(outTotalCount);

    IF inPageNum <= 0
	THEN 
		SET inPageNum=0;
	END IF;
	-- 页面大小超过总记录数
	IF inPageSize>=outTotalCount
	THEN 
		SET inPageNum= 0;
		SET inPageSize =outTotalCount;
	END IF;
	-- 页码超过总记录数
	IF (inPageNum + inPageSize) > outTotalCount
	THEN
		SET inPageNum = 0;
	END IF;
	
    -- 计算起始索引和结束索引
    --如果利用OFFSET 偏移量分页
    vStartIndex := (inPageNum - 1)* inPageSize ;
    --如果用ROWNUM 分页
    -- vStartIndex :=(inPageNum - 1)* inPageSize+1;
    vEndIndex := vStartIndex + inPageSize - 1;
    
   DBMS_OUTPUT.PUT_LINE(vStartIndex);
   DBMS_OUTPUT.PUT_LINE(vEndIndex);
    --1、 使用ROWNUM进行分页,构建动态 SQL 查询语句
   /* vDynamicSQL := 'SELECT * FROM (
                         SELECT ROWNUM AS RowNumIndex, t.* FROM (' || inSQLQuery || ') t
                          ) WHERE RowNumIndex BETWEEN :startIdx AND :endIdx';*/
   --2、使用OFFSET 和 FETCH NEXT 关键字 进行分页查询。 通过合理地设置偏移量和每页显示的记录数,我们可以高效地获取查询结果集的指定页数据。      
     vDynamicSQL := 'SELECT * FROM (
                        ' || inSQLQuery || ') t
                         OFFSET :startIdx ROWS 
                         FETCH NEXT :endIdx ROWS ONLY';                 
    DBMS_OUTPUT.PUT_LINE(vDynamicSQL);
    -- 执行动态 SQL 查询
    --如果利用OFFSET 偏移量分页
    OPEN outResultSet FOR vDynamicSQL USING vStartIndex, inPageSize;
    --如果用ROWNUM 分页
    --OPEN outResultSet FOR vDynamicSQL USING vStartIndex, vEndIndex;
END;

ROWNUM分页测试说明

多表关联sql测试

17384条数据,每页15条,第16页,基本在0.004秒左右。

84521条数据,每页15条,第40页,基本统一到了0.017秒左右。

单表测试8673527,

每页15条,第10000页,耗时:0.008秒

每页15条,第578236页(最后一页);耗时 0.4秒左右。

经测试:从20万页开始(0.1秒)-57万页,每增加10-15万页会增加0.1秒

如果不太好用,请见谅。如果有好的建议,请多多的提。

老师们,我太想进步了!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的炸串拌饼店

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值