DROP PROCEDURE IF EXISTS `PageList`;
DELIMITER ;;
CREATE DEFINER=`shihuan`@`localhost` PROCEDURE `PageList`(IN `p_tablename` varchar(2000),IN
`p_fieldname` varchar(4000),IN `p_sumfieldname` varchar(4000),IN
`p_pagesize` bigint,IN `p_orderstring` varchar(1000),IN
`p_sorttype` bit,IN `p_wherestring` varchar(4000),IN `p_distinct`
int,INOUT `p_currpage` bigint,OUT `p_totalpagecount` bigint,OUT
`p_totalrecord` bigint,OUT `p_sqlstr` varchar(20000),OUT
`p_subsumresult` varchar(4000),OUT `p_sumresult`
varchar(4000))
BEGIN
DECLARE v_sql
VARCHAR(20000); -- 存储sql语句
DECLARE
v_countsql VARCHAR(4000);
--
存储统计总数的sql语句
DECLARE v_limit
VARCHAR(100); -- 存储拼接的分页子句
DECLARE
v_startline BIGINT DEFAULT 0; -- 存储分页起始行
DECLARE
v_wherestring VARCHAR(4000) DEFAULT ' where 1=1 and
'; --
拼接where条件子句
DECLARE v_orderstring
VARCHAR(1000) DEFAULT ' order by
'; --
拼接排序条件子句
DECLARE v_sorttype
VARCHAR(10) DEFAULT ' asc';
-- 排序类型, 默认为升序
DECLARE v_pageindex BIGINT DEFAULT
1; --
存储总页数
DECLARE v_lastcount BIGINT
DEFAULT p_pagesize;
-- 存储最后一页记录数
DECLARE v_fieldname VARCHAR(4000) DEFAULT
p_fieldname; -- 存储查询字段
DECLARE
v_distinct VARCHAR(20) DEFAULT 'distinct ';
--
拼接distinct子句
DECLARE v_sumsql
VARCHAR(20000); --
存储所有记录SUM形式的sql语句
DECLARE
v_sumfieldname VARCHAR(4000) DEFAULT
p_sumfieldname; -- 存储需要SUM的字段
DECLARE
v_tmpsumfieldname VARCHAR(500);
--
存储截取下来的字段名
DECLARE v_sumflag INT
DEFAULT 0; --
存储标识位
DECLARE v_regulateflag INT
DEFAULT 0; -- 存储是否是最后一个SUM的字段标识
DECLARE v_nolimit_distinctsql
VARCHAR(20000); --
存储没有limit子句的distinct语句
DECLARE
v_subsumsql VARCHAR(20000); --
存储当前页记录SUM形式的sql语句
DECLARE
v_limit_distinctsql
VARCHAR(20000); -- 存储有limit子句的distinct语句
DECLARE v_subsumresult VARCHAR(4000);
--
存储分页后SUM返回的字符串
DECLARE v_sumresult
VARCHAR(4000); -- 存储SUM返回的字符串
SET v_startline =
(p_currpage-1)*p_pagesize; -- 计算起始行数
SET v_limit =
concat(' limit ', v_startline, ',', p_pagesize);
-- 拼接的分页子句
-- p_sorttype为0是升序,
p_sorttype为1是降序
IF (p_sorttype = 1)
THEN
SET v_sorttype = '
desc'; --
设置升序还是降序,默认是升序
END IF;
--
处理排序条件为空的情况
IF (p_orderstring='')
THEN
SET v_orderstring = '';
SET
v_sorttype = '';
END IF;
--
处理查询条件为空的情况
IF (p_wherestring='')
THEN
SET v_wherestring = '';
END IF;
--
处理查询字段为空的情况
IF (p_fieldname='')
THEN
SET v_fieldname = '*';
SET
v_distinct = '';
END IF;
IF
(p_wherestring<>'') THEN
IF (p_distinct=0) THEN
-- set v_sql
= concat('select SQL_CALC_FOUND_ROWS ', v_fieldname, ' from ',
p_tablename, v_wherestring, p_wherestring, v_orderstring,
p_orderstring, v_sorttype, v_limit);
-- set
v_countsql = concat('select FOUND_ROWS() into @rowstotal from dual');
set v_sql =
concat('select ', v_fieldname, ' from ', p_tablename,
v_wherestring, p_wherestring, v_orderstring, p_orderstring,
v_sorttype, v_limit);
set
v_countsql = concat('select count(1) into @rowstotal from (select ', v_fieldname, ' from ',
p_tablename, v_wherestring, p_wherestring, v_orderstring,
p_orderstring, v_sorttype, ') tmpcountld');
IF
(v_sumfieldname<>'') THEN
IF
((INSTR(v_sumfieldname, ',')) = 0) THEN
SET
v_sumsql = concat('select concat(sum(',v_sumfieldname,')');
ELSE
REPEAT
IF
(v_regulateflag=1) THEN
SET
v_tmpsumfieldname = v_sumfieldname;
ELSE
SET
v_tmpsumfieldname = SUBSTRING(v_sumfieldname FROM 1 FOR
INSTR(v_sumfieldname, ',')-1);
END
IF;
IF
(v_sumflag=0) THEN
SET
v_sumsql = concat('select
concat(sum(',v_tmpsumfieldname,')');
SET
v_sumflag=-1;
ELSE
SET
v_sumsql = concat(v_sumsql, ', ''|''', ', sum(',
v_tmpsumfieldname,')');
END
IF;
SET
v_sumfieldname = SUBSTRING(v_sumfieldname FROM
INSTR(v_sumfieldname, ',')+1 FOR LENGTH(v_sumfieldname));
IF
(v_regulateflag=1) THEN
SET
v_sumfieldname = '';
END
IF;
IF
(INSTR(v_sumfieldname, ',')=0 AND
v_sumfieldname<>'') THEN
SET
v_regulateflag = 1;
END
IF;
UNTIL
(v_sumfieldname='') END REPEAT;