最近在学习Mysql存储过程,写了一个分页的Demo,记录一下。
该存储过程用于返回表中总记录数,会在分页的存储过程中调用它。
/*查询表中记录总条目数*/
DELIMITER $
DROP PROCEDURE IF EXISTS proc_count;
CREATE PROCEDURE proc_count(tab_name VARCHAR(100),OUT num FLOAT(10))
BEGIN
SET @tabSql = CONCAT('SELECT COUNT(*) INTO @Total FROM ',tab_name);/*此处 @Total为 记录的总条目数*/
PREPARE tabSql FROM @tabSql;
EXECUTE tabSql;
SET num = @Total;/*将Total变量的值赋给num,并在调用该存储过程时OUT*/
END $
DELIMITER ;
该存储过程为分页的逻辑,参数说明:
tab(表的名称),startItem (查询第几页),pageSize (每页查询的条目数),
sortRule (排序规则“asc”或"desc",若无需排序输入 ‘ ’ ),
order_field (要排序的字段,若无需排序输入 ‘ ’),totalElements (输出表中总记录数量),
pageCount (按当前每页查询条目数,所计算出的页码总数)
DELIMITER $
DROP PROCEDURE IF EXISTS proc_page;
CREATE PROCEDURE proc_page (
tab VARCHAR(100),
startItem INT(10),
pageSize INT(10),
sortRule VARCHAR(100),
order_field VARCHAR(100),
OUT totalElements INT(10),
OUT pageCount INT(10))
BEGIN
CALL proc_count(tab,@param);/*调用上面的存储过程,得到表中总记录数*/
SET totalElements = @param;
SET pageCount = CEIL(totalElements/pageSize);/*页码数=总条目数/每页条目数*/
IF sortRule <> ' ' THEN /*判断是否需要排序*/
IF sortRule = 'asc' THEN
SET @pageSql = CONCAT(
'SELECT * FROM ',
tab,
' ORDER BY ',
order_field,
' asc ',
' LIMIT ',
(startItem - 1) * pageSize,
' , ' ,
pageSize ) ;
ELSE
SET @pageSql = CONCAT(
'SELECT * FROM ',
tab,
' ORDER BY ',
order_field,
' desc ',
' LIMIT ',
(startItem - 1) * pageSize,
' , ' ,
pageSize ) ;
END IF;
ELSE
SET @pageSql = CONCAT('SELECT * FROM ' ,tab, ' LIMIT ' ,(startItem - 1) * pageSize, ' , ' ,pageSize);
END IF;
PREPARE pageSql FROM @pageSql;
EXECUTE pageSql;
END $
DELIMITER ;
调用该存储过程:
CALL proc_page('people',4,1000,'asc','id',@totalElements,@pageCount);
/*表名,起始记录,条目数,排序的方式或空,排序的字段或空,总条目数,总页码数*/
SELECT @totalElements,@pageCount;