mysql 分页存储过程转自于wenlujun 的BLOG(备注如果出现编码格式错误一定要加charset设置编码格式)
2014-03-29 13:42
543 查看
CREATE PROCEDURE `P_viewPage`(
$TableName VARCHAR(200),
$FieldList VARCHAR(2000),
$PrimaryKey VARCHAR(100),
$Where VARCHAR(1000) charset
'gbk',
$Order VARCHAR(1000),
$SortType INT,
$RecorderCount INT,
$PageSize INT,
$PageIndex INT,
OUT $TotalCount INTEGER,
OUT $TotalPageCount INTEGER
)
BEGIN
IF !(($TableName is null OR $TableName='') OR ($FieldList is null OR $FieldList='') OR ($PrimaryKey is null OR $PrimaryKey='') OR $SortType
< 1 OR $SortType >3 OR $RecorderCount
< 0 OR $PageSize < 0 OR $PageIndex
< 0) THEN
IF ($where is null OR $where='') THEN
SET @new_where1
= ' ' ;
SET @new_where2
= ' WHERE ' ;
ELSE
SET @new_where1
=concat(' WHERE ',$where);
SET @new_where2
=concat(' WHERE ',$where,'
AND ');
END IF;
IF $order='' OR $SortType
= 1 OR $SortType = 2 THEN
IF $SortType
= 1 THEN
SET @new_order
=concat(' ORDER BY ',$PrimaryKey,'
ASC' );
END IF;
IF $SortType
= 2 THEN
SET @new_order
=concat(' ORDER BY ',$PrimaryKey,'
DESC');
END IF;
ELSE
SET @new_order
=concat(' ORDER BY ',$Order);
END IF;
SET @SqlCount = concat('SELECT
COUNT(*) into @TotalCount FROM ',$TableName,@new_where1);
SET @SqlCount1 = concat('SELECT
CEILING((COUNT(*)+0.0)/',$PageSize,')
into @TotalPageCount FROM ',$TableName,@new_where1);
IF $RecorderCount = 0 THEN
PREPARE stmt1 FROM @SqlCount;
EXECUTE stmt1;
set $TotalCount=@TotalCount;
PREPARE stmt1 FROM @SqlCount1;
EXECUTE stmt1;
set $TotalPageCount=@TotalPageCount;
ELSE
set $TotalCount
= $RecorderCount;
END IF;
IF $PageIndex > CEILING(($TotalCount+0.0)/$PageSize) THEN
SET $PageIndex
= CEILING(($TotalCount+0.0)/$PageSize);
END IF;
IF $PageIndex = 0 or $PageIndex
= 1 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize);
ELSE
IF $SortType
= 1 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
> (SELECT max(',$PrimaryKey,')
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) AS TMP) ',@new_order,'
limit ',$PageSize);
END IF;
IF $SortType
= 2 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
< (SELECT MIN(',$PrimaryKey,')
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) AS TMP) ',@new_order,'
limit ',$PageSize);
END IF;
IF $SortType
= 3 THEN
IF INSTR($Order,',')
> 0 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
NOT IN (SELECT ',$PrimaryKey,'
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) a)',@new_order,' limit
',$PageSize);
ELSE
SET @new_order
=concat(' ORDER BY ',$PrimaryKey,'
ASC' );
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
> (SELECT max(',$PrimaryKey,')
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) AS TMP) ',@new_order,'
limit ',$PageSize);
END IF;
END IF;
END IF;
Prepare stmt2 from @Sql;
execute stmt2;
END IF;
END ;
$TableName VARCHAR(200),
$FieldList VARCHAR(2000),
$PrimaryKey VARCHAR(100),
$Where VARCHAR(1000) charset
'gbk',
$Order VARCHAR(1000),
$SortType INT,
$RecorderCount INT,
$PageSize INT,
$PageIndex INT,
OUT $TotalCount INTEGER,
OUT $TotalPageCount INTEGER
)
BEGIN
IF !(($TableName is null OR $TableName='') OR ($FieldList is null OR $FieldList='') OR ($PrimaryKey is null OR $PrimaryKey='') OR $SortType
< 1 OR $SortType >3 OR $RecorderCount
< 0 OR $PageSize < 0 OR $PageIndex
< 0) THEN
IF ($where is null OR $where='') THEN
SET @new_where1
= ' ' ;
SET @new_where2
= ' WHERE ' ;
ELSE
SET @new_where1
=concat(' WHERE ',$where);
SET @new_where2
=concat(' WHERE ',$where,'
AND ');
END IF;
IF $order='' OR $SortType
= 1 OR $SortType = 2 THEN
IF $SortType
= 1 THEN
SET @new_order
=concat(' ORDER BY ',$PrimaryKey,'
ASC' );
END IF;
IF $SortType
= 2 THEN
SET @new_order
=concat(' ORDER BY ',$PrimaryKey,'
DESC');
END IF;
ELSE
SET @new_order
=concat(' ORDER BY ',$Order);
END IF;
SET @SqlCount = concat('SELECT
COUNT(*) into @TotalCount FROM ',$TableName,@new_where1);
SET @SqlCount1 = concat('SELECT
CEILING((COUNT(*)+0.0)/',$PageSize,')
into @TotalPageCount FROM ',$TableName,@new_where1);
IF $RecorderCount = 0 THEN
PREPARE stmt1 FROM @SqlCount;
EXECUTE stmt1;
set $TotalCount=@TotalCount;
PREPARE stmt1 FROM @SqlCount1;
EXECUTE stmt1;
set $TotalPageCount=@TotalPageCount;
ELSE
set $TotalCount
= $RecorderCount;
END IF;
IF $PageIndex > CEILING(($TotalCount+0.0)/$PageSize) THEN
SET $PageIndex
= CEILING(($TotalCount+0.0)/$PageSize);
END IF;
IF $PageIndex = 0 or $PageIndex
= 1 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize);
ELSE
IF $SortType
= 1 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
> (SELECT max(',$PrimaryKey,')
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) AS TMP) ',@new_order,'
limit ',$PageSize);
END IF;
IF $SortType
= 2 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
< (SELECT MIN(',$PrimaryKey,')
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) AS TMP) ',@new_order,'
limit ',$PageSize);
END IF;
IF $SortType
= 3 THEN
IF INSTR($Order,',')
> 0 THEN
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
NOT IN (SELECT ',$PrimaryKey,'
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) a)',@new_order,' limit
',$PageSize);
ELSE
SET @new_order
=concat(' ORDER BY ',$PrimaryKey,'
ASC' );
SET @Sql=concat('SELECT
',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,'
> (SELECT max(',$PrimaryKey,')
FROM (SELECT ',$PrimaryKey,'
FROM ',$TableName,@new_where1,@new_order,'
limit ',$PageSize*($PageIndex-1),'
) AS TMP) ',@new_order,'
limit ',$PageSize);
END IF;
END IF;
END IF;
Prepare stmt2 from @Sql;
execute stmt2;
END IF;
END ;
相关文章推荐
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复
- MySQL 优化
- MySQL 数据类型
- Facebook's New Real-time Messaging System: HBase to Store 135+ Billion Messages a Month
- MySQL复制