Mysql分页的存储过程

本文介绍了一种使用Mysql存储过程实现分页查询的方法。其中包括两个存储过程:一个是计算表中的总记录数,另一个是执行分页查询,支持排序功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

        最近在学习Mysql存储过程,写了一个分页的Demo,记录一下。
        该存储过程用于返回表中总记录数,会在分页的存储过程中调用它。
        /*查询表中记录总条目数*/
        DELIMITER $
        DROP PROCEDURE IF EXISTS proc_count;
        CREATE PROCEDURE proc_count(tab_name VARCHAR(100),OUT num FLOAT(10))
        BEGIN
        SET @tabSql = CONCAT('SELECT COUNT(*) INTO @Total FROM ',tab_name);/*此处 @Total为 记录的总条目数*/
        PREPARE tabSql FROM @tabSql;
        EXECUTE tabSql;
        SET num = @Total;/*将Total变量的值赋给num,并在调用该存储过程时OUT*/
        END $ 
        DELIMITER ;

        该存储过程为分页的逻辑,参数说明:
         tab(表的名称),startItem (查询第几页),pageSize (每页查询的条目数),
         sortRule (排序规则“asc”或"desc",若无需排序输入 ‘ ’ ),
         order_field (要排序的字段,若无需排序输入 ‘ ’),totalElements (输出表中总记录数量),
         pageCount (按当前每页查询条目数,所计算出的页码总数)
                
         DELIMITER $
         DROP PROCEDURE IF EXISTS proc_page;
         CREATE PROCEDURE proc_page (
              tab VARCHAR(100),
              startItem INT(10),
              pageSize INT(10),
              sortRule VARCHAR(100),
              order_field VARCHAR(100),
              OUT totalElements INT(10),
              OUT pageCount INT(10))
        BEGIN
        CALL proc_count(tab,@param);/*调用上面的存储过程,得到表中总记录数*/
        SET totalElements = @param;
        SET pageCount = CEIL(totalElements/pageSize);/*页码数=总条目数/每页条目数*/
        IF sortRule <> ' ' THEN /*判断是否需要排序*/
        IF sortRule = 'asc' THEN
        SET @pageSql = CONCAT(
        'SELECT * FROM ',
        tab,
        ' ORDER BY ',
        order_field,
        ' asc ',
        ' LIMIT ',
        (startItem - 1) * pageSize,
        ' , ' ,
        pageSize ) ;
        ELSE
        SET @pageSql = CONCAT(
        'SELECT * FROM ',
        tab,
        ' ORDER BY ',
        order_field,
        ' desc ',
        ' LIMIT ',
        (startItem - 1) * pageSize,
        ' , ' ,
        pageSize ) ;
        END IF;
        ELSE
        SET @pageSql = CONCAT('SELECT * FROM ' ,tab, ' LIMIT ' ,(startItem - 1) * pageSize, ' , ' ,pageSize);
        END IF;

        PREPARE pageSql FROM @pageSql;
        EXECUTE pageSql;
        END $
        DELIMITER ;



        调用该存储过程:
         CALL proc_page('people',4,1000,'asc','id',@totalElements,@pageCount);
        /*表名,起始记录,条目数,排序的方式或空,排序的字段或空,总条目数,总页码数*/
        SELECT @totalElements,@pageCount;

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值