Mysql分页存储过程

来源:互联网 发布:定制家具生产软件 编辑:程序博客网 时间:2024/05/16 03:28

Create  procedure `proc_pager`(

    _WhereClause VARCHAR(2000),    -- 查找条件
    _OrderBy VARCHAR(2000),  -- 排序条件
    _PageSize  INT ,   -- 每页记录数
    _PageIndex INT ,  -- 当前页码
    _DoCount   BIT   -- 标志:统计数据/输出数据
)
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
 -- 定义key字段临时表
 DROP TABLE IF EXISTS _TempTable_KeyID;  -- 删除临时表,如果存在
 CREATE TEMPORARY  TABLE  _TempTable_KeyID
 (
userid INT
 )TYPE=HEAP;

 -- 构建动态的sql,输出关键字key的id集合
 -- 查找条件

 SET @sql = 'SELECT  userid FROM mysqltestuser';
 IF (_WhereClause is NOT NULL)  AND (_WhereClause <> '') THEN
 SET @sql= concat(@sql, ' WHERE ' ,_WhereClause);
 END if;

 IF (_OrderBy is NOT NULL)  AND  (_OrderBy <>'') THEN
 SET @sql= concat( @sql , ' ORDER BY ' , _OrderBy);
 END IF;

 -- 准备id记录插入到临时表
 set @sql=concat('insert into _TempTable_KeyID(userid)', @sql);
 PREPARE stmt FROM @sql;
 EXECUTE stmt ;
 DEALLOCATE PREPARE stmt;
-- key的id集合  [end]

-- 下面是输出
IF (_DoCount=1) then  -- 统计
     BEGIN
          SELECT COUNT(*) AS RecordCount FROM _TempTable_KeyID;
     END;
ELSE                 -- 输出记录集
     BEGIN
         -- 计算记录的起点位置
 SET @startPoint = ifnull((_PageIndex-1)*_PageSize,0);
         SET @sql='        SELECT     A.*
   FROM    mysqltestuser A
   INNER JOIN _TempTable_KeyID B
   ON  A.userid =B.userid  ';

 SET @sql=CONCAT(@sql,"  LIMIT  ",@startPoint," ,",_PageSize);
         PREPARE stmt FROM @sql;
 EXECUTE stmt ;
 DEALLOCATE PREPARE stmt;
     END;
END IF;

 DROP TABLE _TempTable_KeyID;

END;


--------------------------------   

-- 统计数据
call `proc_pager`(null, null, null, null, 1)
-- 输出数据,没条件限制,10条记录/页,第一页
call `proc_pager`(null, null, 10, 1,0)
-- 输出数据,条件限制,排列, 10条记录/页,第一页
call `proc_pager`('chinesename like ''%飞3%''', 'userid asc', 10, 1, 0)