mysql 分頁存儲過程

 1 /*test"
 2 CALL sp_viewPage( 
 3 '*'#查詢字段 
 4 ,'userupdatelog'#表名 
 5 ,'1=1'#條件 
 6 ,'Id desc'#排序 
 7 ,1 #頁碼 
 8 ,20 #每頁記錄數 
 9 ,@totalcount #輸出總記錄數 
10 ,@pagecount #輸出用頁數 
11 ); 
12 SELECT @totalcount,@pagecount; 
13 */
14 
15 DROP PROCEDURE IF EXISTS `sp_viewPage`;
16 
17 CREATE PROCEDURE sp_viewPage(
18 _fields VARCHAR(1000), #要查詢的字段,用逗號(,)分隔 
19 _tables TEXT, #要查詢的表 
20 _where VARCHAR(2000), #查詢條件 
21 _orderby VARCHAR(200), #排序規則 
22 _pageindex INT, #查詢頁碼 
23 _pageSize INT, #每頁記錄數 
24 /*_sumfields VARCHAR(200),#求和字段 */
25 #輸出參數 
26 OUT _totalcount INT, #總記錄數 
27 OUT _pagecount INT #總頁數 
28 /* OUT _sumResult VARCHAR(2000)#求和結果 */
29 )
30 BEGIN
31 #140529-xxj-分頁存儲過程 
32 #計算起始行號 
33 SET @startRow = _pageSize * (_pageIndex - 1); 
34 SET @pageSize = _pageSize; 
35 SET @rowindex = 0; #行號 
36 
37 #合併字符串 
38 SET @strsql = CONCAT( 
39 #'select sql_calc_found_rows @rowindex:=@rowindex+1 as rownumber,' #記錄行號 
40 'select sql_calc_found_rows ' 
41 ,_fields 
42 ,' from ' 
43 ,_tables 
44 ,CASE IFNULL(_where, '') WHEN '' THEN '' ELSE CONCAT(' where ', _where) END 
45 ,CASE IFNULL(_orderby, '') WHEN '' THEN '' ELSE CONCAT(' order by ', _orderby) END 
46 ,' limit ' 
47 ,@startRow 
48 ,',' 
49 ,@pageSize 
50 ); 
51 
52 PREPARE strsql FROM @strsql;#定義預處理語句 
53 EXECUTE strsql; #執行預處理語句 
54 DEALLOCATE PREPARE strsql; #刪除定義 
55 #經過 sql_calc_found_rows 記錄沒有使用 limit 語句的記錄,使用 found_rows() 獲取行數 
56 SET _totalcount = FOUND_ROWS(); 
57 
58 #計算總頁數 
59 IF (_totalcount <= _pageSize) THEN 
60 SET _pagecount = 1; 
61 ELSE IF (_totalcount % _pageSize > 0) THEN 
62 SET _pagecount = _totalcount DIV _pageSize + 1; 
63 ELSE 
64 SET _pagecount = _totalcount DIV _pageSize; 
65 END IF; 
66 END IF;
67 
68 END

 

 

 

SET @PageIndex= 1;
SET @PageSize=10 ;
SET @TableName='item_prop_values' ;
SET @SelectFields='*' ;
SET @ConditionWhere='cid=1101' ;
SET @SortField='id' ;
SET @IsDesc=0 ;
SET @TotalRecords= 0;
SET @TotalPageCount= 0;
SET @ResetOrder= 0;
SET @SQLString= '';
CALL MicrobeORM_GetRecordsByPageSQLString(
@PageIndex,
@PageSize,
@TableName,
@SelectFields,
@ConditionWhere,
@SortField,
@IsDesc,
@TotalRecords,
@TotalPageCount,
@ResetOrder,
@SQLString);
select @TotalRecords;
SELECT @TotalPageCount;
select @SQLString;sql

 

 

 

 

 

CREATE DEFINER = 'root'@'%'
PROCEDURE xyproduct_test.MicrobeORM_GetRecordsByPageSQLString(
PageIndex int,
PageSize int,
TableName varchar(4000),
SelectFields varchar(8000), #查詢字段,默認爲 *
ConditionWhere varchar(4000), #條件例如 DirectoryID=4
SortField varchar(500),
IsDesc bit, #= 1, #是否倒序
OUT TotalRecords int,#總記錄數
OUT TotalPageCount int ,#輸出總頁數
OUT ResetOrder bit ,#####- 1表示讀取數據的時候 排序要反過來
OUT SQLString varchar(4000)
)
BEGINspa

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;#解鎖事務code


#######################################--init paras--begin########################################
IF (SelectFields IS NULL OR SelectFields='') THEN
SET SelectFields='*';
END IF;
IF (IsDesc IS NULL) THEN
SET IsDesc='1';
END IF;
IF (TotalRecords<=0) THEN
SET TotalRecords=-1;
END IF;
#######################################--init paras--end########################################blog

 

#######################################-第一步 :查詢限制條件的組合--begin---#######################################
SET @WhereString1='';
SET @WhereString2='';
IF ConditionWhere IS NULL or LENGTH( ConditionWhere)<=0 THEN
SET @WhereString1 = '';
SET @WhereString2 = ' WHERE ';
ELSE
SET @WhereString1 = CONCAT(' WHERE ' , ConditionWhere);
SET @WhereString2 = CONCAT(' WHERE ' , ConditionWhere , ' AND ');
END IF;
#######################################-第一步 :查詢限制條件的組合--end---#######################################排序


#######################################-設置完畢查詢條件後 查詢本次符合條件的記錄數 頁數--begin#######################################
##########################--------總記錄數-----begin--------##########################
SET @sqlCmd='';

IF ConditionWhere IS NULL OR ConditionWhere = ''
THEN
#沒有查詢條件

SET @sqlCmd= CONCAT('SELECT @TotalRecordsCount:= COUNT(*) FROM ', TableName);

PREPARE strsql FROM @sqlCmd;#定義預處理語句
EXECUTE strsql; #執行預處理語句
DEALLOCATE PREPARE strsql; #刪除定義
#經過 sql_calc_found_rows 記錄沒有使用 limit 語句的記錄,使用 found_rows() 獲取行數
SET TotalRecords = @TotalRecordsCount;

ELSE
SET @sqlCmd= CONCAT('SELECT @TotalRecordsCount:=COUNT(*) FROM ', TableName,' ',@WhereString1);

PREPARE strsql FROM @sqlCmd;#定義預處理語句
EXECUTE strsql; #執行預處理語句
DEALLOCATE PREPARE strsql; #刪除定義
#經過 sql_calc_found_rows 記錄沒有使用 limit 語句的記錄,使用 found_rows() 獲取行數
SET TotalRecords = @TotalRecordsCount;#FOUND_ROWS();
END IF;事務

##########################--------總記錄數-----end--------##########################ci

##########################---------總記錄數有值的時候,計算頁數---begin--##########################
IF(TotalRecords>0)
THEN
SET @modNum =0; #求模運算
SET @modNum=TotalRecords%PageSize;
IF @modNum=0#整除盡
THEN
SET TotalPageCount=TotalRecords/PageSize;
ELSE#有餘數
SET TotalPageCount=CEIL(TotalRecords/PageSize);
END IF;
END IF;
##########################---------總記錄數有值的時候,計算頁數---end--##########################



##########################---------開始查詢,組合SQL語句----------begin##########################
IF PageIndex = 0 THEN
SET SQLString = CONCAT('SELECT '
, SelectFields
, ' FROM '
,TableName
,@WhereString1
,' ORDER BY '
, SortField);
IF IsDesc = 1 THEN
SET SQLString =CONCAT( SQLString , ' DESC ');
END IF;字符串

SET ResetOrder=0;

#######設定取出的記錄數目###########
SET SQLString =CONCAT( SQLString , ' LIMIT ',PageSize);

ELSE ######下面對頁碼 頁數進行了再次確認統計
SET SQLString='';
SET @GetFromLast =0;
IF TotalRecords=-1 THEN
SET @GetFromLast=0;
ELSE
SET @TotalPage=0;

SET @ResidualCount=TotalRecords%PageSize;
#######----------------------------------------------臨時頁總數------------------------------------------------------------------------------------
IF @ResidualCount=0 THEN
SET @TotalPage=TotalRecords/PageSize;
ELSE
SET @TotalPage=CEIL(TotalRecords/PageSize);
END IF;it


#######-----------------------------------------------是否從後面半部分取數據-----------------------------------------------------------------------------------
IF PageIndex>@TotalPage/2 THEN #從最後頁算上來
SET @GetFromLast=1;
ELSE
SET @GetFromLast=0;
END IF;io


IF @GetFromLast=1 THEN
IF PageIndex=@TotalPage-1 THEN

IF @ResidualCount=0 THEN
SET @ResidualCount=PageSize;
END IF;

SET SQLString=CONCAT( 'SELECT '
, SelectFields
, ' FROM '
, TableName
, @WhereString1
, ' ORDER BY '
,SortField);
IF IsDesc = 0 then#反過來
SET SQLString = CONCAT( SQLString , ' DESC ');
END IF;
SET SQLString =CONCAT( SQLString , ' LIMIT ',@ResidualCount);
SET ResetOrder=1;


ELSE IF PageIndex>@TotalPage-1 THEN #已經超過最大頁數
SET SQLString =CONCAT( 'SELECT '
,SelectFields
, ' FROM '
,TableName
, ' WHERE 1=2');
SET ResetOrder=0;

ELSE
SET PageIndex=@TotalPage-(PageIndex+1);#-
IF IsDesc=1 THEN
SET IsDesc=0;
ELSE
SET IsDesc=1;
END IF;
SET ResetOrder=1;
END IF;

END IF;
ELSE
SET ResetOrder=0;
END IF;

END IF;
############--------------------------------設定完畢查詢順序-------------------------------##################
IF SQLString='' THEN
SET @TopCount =0;
IF @GetFromLast=1 THEN
IF @ResidualCount > 0 THEN
SET @TopCount=PageSize * (PageIndex-1)+@ResidualCount;
ELSE
SET @TopCount=PageSize * (PageIndex)+@ResidualCount;
END IF;
IF @TopCount = 0 THEN
SET @TopCount = PageSize;
END IF;

ELSE
SET @TopCount=PageSize * PageIndex;
END IF;

IF IsDesc = 1 THEN
SET SQLString = CONCAT( 'SELECT '
, SelectFields
,' FROM '
,TableName
, @WhereString2
,SortField
,' <
(SELECT Min('
, SortField
,') FROM
(SELECT '
,SortField
,' FROM '
,TableName
, @WhereString1
,' ORDER BY '
,SortField
,' DESC limit '
,@TopCount
,') AS IDX)
ORDER BY '
,SortField
,' DESC '
,'limit '
,PageSize);
ELSE
SET SQLString = CONCAT( 'SELECT '
, SelectFields
,' FROM '
,TableName
, @WhereString2
, SortField
,' >
(SELECT Max('
,SortField
,') FROM
(SELECT '
,SortField
,' FROM '
,TableName
, @WhereString1
, ' ORDER BY '
, SortField
,' ASC limit '
,@TopCount
,') AS IDX)
ORDER BY '
,SortField
,' ASC '
,'limit ',PageSize) ;
END IF;
END IF;


END IF;

############---------------執行SQL查詢---------------------##################
SET @sqlQueryCmd=SQLString;
PREPARE strsql FROM @sqlQueryCmd;#定義預處理語句
EXECUTE strsql; #執行預處理語句
DEALLOCATE PREPARE strsql; #刪除定義

############---------------執行完畢查詢,加鎖---------------------################## SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; END

相關文章
相關標籤/搜索