最近项目是用mysql存储过程,琢磨了下通用的mysql 存储过程分页写法,觉得通用度很高,随笔记下分享。
分页信息列表查询
PROCEDURE xx.p_common_findByPage(IN tableName varchar(2000), IN fieldsNames varchar(500), IN pageIndex int, IN pageSize int, IN sortName varchar(200), IN strWhere varchar(500))
BEGIN
-- 通用分页查询存储过程,如果不传入分页参数,则可以查询全部信息
DECLARE fieldlist varchar(200);
IF fieldsNames = '' || fieldsNames IS NULL THEN
SET fieldlist = '*';
ELSE
SET fieldlist = fieldsNames;
END IF;
IF strWhere = '' || strWhere IS NULL THEN
IF sortName = '' || sortName IS NULL THEN
IF pageIndex = '' || pageIndex IS NULL THEN
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName);
ELSE
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName, ' LIMIT ', (pageIndex - 1) * pageSize, ',', pageSize);
END IF ;
ELSE
IF pageIndex = '' || pageIndex IS NULL THEN
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName, ' ORDER BY ', sortName);
ELSE
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName, ' ORDER BY ', sortName, ' LIMIT ', (pageIndex - 1) * pageSize, ',', pageSize);
END IF ;
END IF;
ELSE
IF sortName = '' || sortName IS NULL THEN
IF pageIndex = '' || pageIndex IS NULL THEN
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName, ' WHERE ', strWhere);
ELSE
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName, ' WHERE ', strWhere, ' LIMIT ', (pageIndex - 1) * pageSize, ',', pageSize);
END IF ;
ELSE
IF pageIndex = '' || pageIndex IS NULL THEN
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName, ' WHERE ', strWhere, ' ORDER BY ', sortName);
ELSE
SET @strSQL = CONCAT('SELECT ', fieldlist, ' FROM ', tableName, ' WHERE ', strWhere, ' ORDER BY ', sortName, ' LIMIT ', (pageIndex - 1) * pageSize, ',', pageSize);
END IF ;
END IF;
END IF;
PREPARE stmt1 FROM @strSQL;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
分页信息查询总行数
PROCEDURE xx.p_common_findByPageCnt(IN tableName varchar(2000), IN sortName varchar(200), IN strWhere varchar(500))
BEGIN
-- 通用分页查询存储过程,查询分页信息中行数
IF strWhere = '' || strWhere = NULL THEN
IF sortName = '' || sortName = NULL THEN
SET @strSQL = CONCAT('SELECT count(*) cnt FROM ', tableName);
ELSE
SET @strSQL = CONCAT('SELECT count(*) cnt FROM ', tableName, ' ORDER BY ', sortName);
END IF;
ELSE
IF sortName = '' || sortName = NULL THEN
SET @strSQL = CONCAT('SELECT count(*) cnt FROM ', tableName, ' WHERE ', strWhere);
ELSE
SET @strSQL = CONCAT('SELECT count(*) cnt FROM ', tableName, ' WHERE ', strWhere, ' ORDER BY ', sortName);
END IF;
END IF;
PREPARE stmt1 FROM @strSQL;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END