CREATE DEFINER=`root`@`%` PROCEDURE `sp_GeneralPaging`(
#輸入參數
_fields VARCHAR(200), #要查詢的字段,用逗號(,)分隔
_tables VARCHAR(200), #要查詢的表
_where VARCHAR(200), #查詢條件
_orderby VARCHAR(200), #排序規則
_pageindex INT, #查詢頁碼
_pagesize INT, #每頁記錄數
_sumfields VARCHAR(200),#求和字段
#輸出參數
OUT _totalcount INT, #總記錄數
OUT _pagecount INT, #總頁數
OUT _sumResult VARCHAR(200)#求和結果
)
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) / _pageSize;
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