MySQL 练习:分页的存储过程

写一个分页的存储过程。

参数:当前是第几页(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');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值