MySql 分頁儲存過程
阿新 • • 發佈:2019-01-10
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;