1. 程式人生 > >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:
[email protected]
+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;