zoukankan      html  css  js  c++  java
  • MySql 分页存储过程

    DELIMITER $$ #改动分隔符为 $$
    DROP PROCEDURE IF EXISTS sp_MvcCommonDataSource$$ #分隔符
    CREATE PROCEDURE sp_MvcCommonDataSource (
    	#输入參数
    	_fields VARCHAR(2000), #要查询的字段,用逗号(,)分隔
    	_tables TEXT,  #要查询的表
    	_where VARCHAR(2000),   #查询条件
    	_orderby VARCHAR(200),  #排序规则
    	_pageindex INT,  #查询页码
    	_pageSize INT,   #每页记录数
    	_sumfields VARCHAR(200),#求和字段
    	#输出參数
    	OUT _totalcount INT,  #总记录数
    	OUT _pagecount INT,    #总页数
    	OUT _sumResult VARCHAR(2000)#求和结果
    )
    BEGIN
    	#140529-xxj-分页存储过程
    	#计算起始行号
    	SET @startRow = _pageSize * (_pageIndex - 1);
    	SET @pageSize = _pageSize;
    	SET @rowindex = 0; #行号
    
    	#合并字符串
    	SET @strsql = CONCAT(
    		#'select sql_calc_found_rows  @rowindex:=@rowindex+1 as rownumber,' #记录行号
    		'select sql_calc_found_rows '
    		,_fields
    		,' from '
    		,_tables
    		,CASE IFNULL(_where, '') WHEN '' THEN '' ELSE CONCAT(' where ', _where) END
    		,CASE IFNULL(_orderby, '') WHEN '' THEN '' ELSE CONCAT(' order by ', _orderby) END
    	  ,' limit ' 
    		,@startRow
    		,',' 
    		,@pageSize
    	);
    
    	PREPARE strsql FROM @strsql;#定义预处理语句 
    	EXECUTE strsql;							#运行预处理语句 
    	DEALLOCATE PREPARE strsql;	#删除定义 
    	#通过 sql_calc_found_rows 记录没有使用 limit 语句的记录,使用 found_rows() 获取行数
    	SET _totalcount = FOUND_ROWS();
    
    	#计算总页数
    	IF (_totalcount <= _pageSize) THEN
    		SET _pagecount = 1;
    	ELSE IF (_totalcount % _pageSize > 0) THEN
    		SET _pagecount = _totalcount / _pageSize + 1;
    	ELSE
    		SET _pagecount = _totalcount / _pageSize;
    	END IF;
    	END IF;
    
    	#计算求和字段
    	IF (IFNULL(_sumfields, '') <> '') THEN
    		#序列sum结果
    		SET @sumCols = CONCAT (
    			'CONCAT_WS(',','
    			,'SUM('
    			,REPLACE(_sumfields,',','),SUM(')
    			,'))');
    		#拼接字符串
    		SET @sumsql = CONCAT(
    			'select '
    			,@sumCols
    			,' INTO @sumResult from '
    			,_tables
    			,CASE IFNULL(_where, '') WHEN '' THEN '' ELSE CONCAT(' where ', _where) END
    			,';'
    		);
    		#select @sumsql;
    		PREPARE sumsql FROM @sumsql;#定义预处理语句 
    		EXECUTE sumsql;	
    		SET _sumResult = @sumResult;						#运行预处理语句 
    		DEALLOCATE PREPARE sumsql;	#删除定义 
    
    	END IF;
    
    END$$
    DELIMITER ; #改动分隔符为分号(;)
    
    
    ##################################################
    # 測试存储过程
    #select order_no,order_date,order_type from `order`;
    
    CALL sp_MvcCommonDataSource(
    'order_no,order_date,order_type'#查询字段
    ,'`order`'#表名
    ,'1=1'#条件
    ,'order_no asc'#排序
    ,2 #页码
    ,3 #每页记录数
    ,'order_no,order_no'#求和字段
    ,@totalcount #输出总记录数
    ,@pagecount #输出用页数
    ,@sumResult #求和结果
    );
    SELECT @totalcount,@pagecount,@sumResult;


  • 相关阅读:
    菜鸟记录:如何获取LOGINVIEW控件状态模板中的子控件
    无法安装dotnetFramework35sp1的解决方法
    MOSS2007小技巧:不用SPD轻松删除错误页面上的问题Webpart
    在动态页面里象静态页面一样控制整个网页的缓存和更新
    烦人的网页iframe去除
    经典sql注入教程
    自己写的后台静态权限验证类
    Asp.net项目从Vs2003转换到Vs2005的常见问题大全及解决方法
    C# 相当于ASP里Eval中的计算公式的方法(超简单的方法)
    1 UNIX与Linux的发展
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3807640.html
Copyright © 2011-2022 走看看