mysql分页通用存储过程

  1. DROP PROCEDURE IF EXISTS (数据库名)$$ #分隔符  
  2. CREATE PROCEDURE (存储过程名)(  
  3.     #输入参数  
  4.     _fields VARCHAR(2000), #要查询的字段,用逗号(,)分隔  
  5.     _tables TEXT,  #要查询的表  
  6.     _where VARCHAR(2000),   #查询条件  
  7.     _orderby VARCHAR(200),  #排序规则  
  8.     _pageindex INT,  #查询页码  
  9.     _pageSize INT,   #每页记录数  
  10.     _sumfields VARCHAR(200),#求和字段  
  11.     #输出参数  
  12.     OUT _totalcount INT,  #总记录数  
  13.     OUT _pagecount INT,    #总页数  
  14.     OUT _sumResult VARCHAR(2000)#求和结果  
  15. )  
  16. BEGIN  
  17.     #140529-xxj-分页存储过程  
  18.     #计算起始行号  
  19.     SET @startRow = _pageSize * (_pageIndex - 1);  
  20.     SET @pageSize = _pageSize;  
  21.     SET @rowindex = 0; #行号  
  22.   
  23.     #合并字符串  
  24.     SET @strsql = CONCAT(  
  25.         #'select sql_calc_found_rows  @rowindex:=@rowindex+1 as rownumber,' #记录行号  
  26.         'select sql_calc_found_rows '  
  27.         ,_fields  
  28.         ,' from '  
  29.         ,_tables  
  30.         ,CASE IFNULL(_where, ''WHEN '' THEN '' ELSE CONCAT(' where ', _where) END  
  31.         ,CASE IFNULL(_orderby, ''WHEN '' THEN '' ELSE CONCAT(' order by ', _orderby) END  
  32.       ,' limit '   
  33.         ,@startRow  
  34.         ,','   
  35.         ,@pageSize  
  36.     );  
  37.   
  38.     PREPARE strsql FROM @strsql;#定义预处理语句   
  39.     EXECUTE strsql;                         #执行预处理语句   
  40.     DEALLOCATE PREPARE strsql;  #删除定义   
  41.     #通过 sql_calc_found_rows 记录没有使用 limit 语句的记录,使用 found_rows() 获取行数  
  42.     SET _totalcount = FOUND_ROWS();  
  43.   
  44.     #计算总页数  
  45.     IF (_totalcount <= _pageSize) THEN  
  46.         SET _pagecount = 1;  
  47.     ELSE IF (_totalcount % _pageSize > 0) THEN  
  48.         SET _pagecount = _totalcount / _pageSize + 1;  
  49.     ELSE  
  50.         SET _pagecount = _totalcount / _pageSize;  
  51.     END IF;  
  52.     END IF;  
  53.   
  54.     #计算求和字段  
  55.     IF (IFNULL(_sumfields, '') <> ''THEN  
  56.         #序列sum结果  
  57.         SET @sumCols = CONCAT (  
  58.             'CONCAT_WS(\',\','  
  59.             ,'SUM('  
  60.             ,REPLACE(_sumfields,',','),SUM(')  
  61.             ,'))');  
  62.         #拼接字符串  
  63.         SET @sumsql = CONCAT(  
  64.             'select '  
  65.             ,@sumCols  
  66.             ,' INTO @sumResult from '  
  67.             ,_tables  
  68.             ,CASE IFNULL(_where, ''WHEN '' THEN '' ELSE CONCAT(' where ', _where) END  
  69.             ,';'  
  70.         );  
  71.         #select @sumsql;  
  72.         PREPARE sumsql FROM @sumsql;#定义预处理语句   
  73.         EXECUTE sumsql;   
  74.         SET _sumResult = @sumResult;                        #执行预处理语句   
  75.         DEALLOCATE PREPARE sumsql;  #删除定义   
  76.   
  77.     END IF;  
  78.   
  79. END$$  
  80. DELIMITER ; #修改分隔符为分号(;)  
  81.   
  82.   
  83. ##################################################  
  84. # 测试存储过程  
  85. #select order_no,order_date,order_type from `order`;  
  86.   
  87. CALL (存储过程名)(  
  88. 'order_no,order_date,order_type'#查询字段  
  89. ,'`order`'#表名  
  90. ,'1=1'#条件  
  91. ,'order_no asc'#排序  
  92. ,2 #页码  
  93. ,3 #每页记录数  
  94. ,'order_no,order_no'#求和字段  
  95. ,@totalcount #输出总记录数  
  96. ,@pagecount #输出用页数  
  97. ,@sumResult #求和结果  
  98. );  
  99. SELECT @totalcount,@pagecount,@sumResult;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值