首页 > 代码库 > MySql 分页存储过程

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;