写一个分页的存储过程。
参数:当前是第几页(nPage int),每页显示多少行(nCount int),查询哪个表(tableName varchar(20))。
要求做参数校验:如果页数小于等于0,就显示第一页数据;如果页数超过最大页数,就显示最后一页的数据。
首先要了解几个知识点
字符串拼接: concat()
set @name = concat("select count(*) into @nSumCount from ",tableName);
变量的值按照sql语句执行:
prepare prod from "select * from student";
execute prod;
deallocate prepare prod;
注意: prepare语句不能接受局部变量
计算要查询页面的起始位置:nOffset:(nPage- 1) * nCount
1.固定查student表
drop procedure if exists limitpro;
delimiter //
create procedure limitpro(nPage int,nCount int)
begin
declare nOffset int default 0;
declare maxPage int default 0;
declare nSumCount int default 0;
#将学生总数输入到nSumCount局部变量中
select count(*) into nSumCount from student;
#如果可以整除最大页数就是除数
if (nSumCount % nCount= 0) then set maxPage = nSumCount / nCount;
#如果不能整除最大页数就是除数向下取整加1
else set maxPage = floor(nSumCount/nCount) + 1;
end if;
#如果页数小于等于0,就显示第一页数据
if(nPage <= 0) then set nPage = 1;
end if;
#如果页数超过最大页数,就显示最后一页的数据
if(nPage > maxPage) then set nPage = maxPage;
end if;
#起始位置等于页数减一乘以每页行数
set nOffset = (nPage - 1) * nCount;
select * from student limit nOffset , nCount;
end //
delimiter ;
call limitpro(10,6);
2.自定义表名查询
drop procedure if exists limitpro;
delimiter //
create procedure limitpro(nPage int,nCount int,tableName varchar(20))
begin
declare nOffset int default 0;
declare maxPage int default 0;
set @nSumCount = 0;
#拼接字符串,因为是自定义表名,所以要先把语句和传入的表名拼接一下
set @name = concat("select count(*) into @nSumCount from ",tableName);
#执行拼接的语句
prepare prod from @name;
execute prod;
deallocate prepare prod;
#如果可以整除最大页数就是除数
if (@nSumCount % nCount= 0) then set maxPage = @nSumCount / nCount;
#如果不能整除最大页数就是除数取整加1
else set maxPage = floor(@nSumCount/nCount) + 1;
end if;
#如果页数小于等于0,就显示第一页数据
if(nPage <= 0) then set nPage = 1;
end if;
#如果页数超过最大页数,就显示最后一页的数据
if(nPage > maxPage) then set nPage = maxPage;
end if;
#起始位置等于页数减一乘以每页行数
set nOffset = (nPage - 1) * nCount;
#把查询语句和输入的表明和定义的变量的值拼接
#变量的值也需要拼接,因为prepare语句不能接受局部变量(不会自动转换为值)
set @sqlstr = concat("select * from ",tableName," limit ",nOffset,",",nCount);
prepare prod from @sqlstr;
execute prod;
deallocate prepare prod;
end //
delimiter ;
call limitpro(2,6,'student');