MySQL 存储过程中分页

2014-11-20

  MySQL数据库中,自定义存储过程查询表中的数据,带有分页功能。具体实例如下代码:

 1 DROP PROCEDURE IF EXISTS `sampledb`.`proc_GetPagedDataSet`;
 2
 3 CREATE DEFINER=`root`@`%` PROCEDURE `proc_GetPagedDataSet`(
 4     IN tableName VARCHAR (20), /*表名
 5     IN pageIndex INT,  /*当前页*/
 6     IN pageSize INT,  /*每页记录数*/
 7     OUT pageCount INT,/*总记录分页数*/
 8     out totalRecordCount int /*总记录数*/)
 9 BEGIN
10    /*获取表中的记录数*/
11    set @recordCount=0;
12    set @sql=‘‘;
13    set @sql=CONCAT(‘select count(*) into @recordCount from ‘,tableName);
14    prepare stmt from @sql; /*预处理 自定义sql字符串*/
15    execute stmt; /*执行自定义sql语句*/
16    deallocate prepare stmt; /*释放预处理资源*/
17
18    set totalRecordCount = @recordCount; /*总记录数*/
19
20    /*计算返回多少页*/
21    set @tmp=1;
22    set @tmp=@recordCount mod pageSize; /*取余数*/
23    if @tmp=0 then
24      set pageCount=@recordCount div pageSize;
25    else
26      set pageCount=@recordCount div pageSize + 1;
27    end if;
28
29    /*分页显示数据*/
30    set @sql=CONCAT(‘select * from ‘,tableName,‘ limit ‘,(pageIndex-1)*pageSize,‘,‘,pageSize);
31    prepare stmt from @sql; /*预处理 自定义sql字符串*/
32    execute stmt;/*执行自定义sql语句*/
33    deallocate prepare stmt; /*释放预处理资源*/
34 END
时间: 2024-08-10 07:54:28

MySQL 存储过程中分页的相关文章

Mysql存储过程中使用cursor

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

mysql存储过程中使用事务

1 DROP PROCEDURE IF EXISTS test_sp1 2 CREATE PROCEDURE test_sp1( ) 3 BEGIN 4 DECLARE t_error INTEGER DEFAULT 0; 5 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 6 7 START TRANSACTION; 8 INSERT INTO test VALUES(NULL, 'test sql 001'); 9 INSER

mysql -- 存储过程中 declare 和 set 定义变量的区别

mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如:DECLARE var1  INT DEFAULT 0;  主要用在存储过程中,或者是给存储传参数中. 两者的区别是:在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL.而会话变量(即@开头的变量)则不

MySQL存储过程中的3种循环

在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了. 这几个循环语句的格式如下: WHILE……DO……END WHILE REPEAT……UNTIL END REPEAT LOOP……END LOOP GOTO 下面首先使用第一种循环编写一个例子. mysql> create procedure pro10() -> begin ->

mysql 存储过程中使用游标中使用临时表可以替代数组效果

mysql不支持数组.但有时候需要组合几张表的数据,在存储过程中,经过比较复杂的运算获取结果直接输出给调用方,比如符合条件的几张表的某些字段的组合计算,mysql临时表可以解决这个问题.临时表:只有在当前连接情况下, TEMPORARY 表才是可见的.当连接关闭时, TEMPORARY 表被自动取消.必须拥有 create temporary table 权限,才能创建临时表.可以通过指定 engine = memory; 来指定创建内存临时表. 先建立要用的数据表及数据: drop table

mysql存储过程中in、out、inout参数使用实际案例

1.参数in的使用(代表输入,意思说你的参数要传到存过过程的过程里面去)//为了避免存储过程中分号(";")结束语句,我们使用分隔符告诉mysql解释器,该段命令是否已经结束了./**案例功能:求1-n的和开发者:徐守威时间:2016-08-13*/delimiter $create procedure p1(in n int)begin declare total int default 0; declare num int default 0; while num < n d

mysql 存储过程中limit

1.mysql的高版本(5.5),存储过程中的limit可以使用变量,如下:select * from student limit iStart,iNum; 2.mysql的低版本(5.1),存储过程中的limit不能使用变量,编译报错,如下:You have an error in your SQL syntax, ...near iStart,iNum 3.怎么解决低版本的问题?可以使用执行动态sql语句,把整个sql语句传给存储过程.静态sql语句,编译的时候是sql的语句结构就已经确定下

mysql存储过程中 乱码问题解决办法

中文乱码无论在何时都是一个头疼的问题,mysql的存储过程参数也同样存在这个问题.1.直接使用insert into语句没问题,能够正常插入汉字.2.把insert into语句移到Procedure中后,就无法插入汉字了.在客户端软件中插入的汉字总是为乱码,英文和数字没问题.3.如果在jdbc中调用这个Procedure总是报错: 在查阅了很多相关资料后,发现只需要改动procedure的参数的定义就OK了,改动为:在varchar参数后面加入: character set 指定编码.由于服务

MySQL存储过程中declare和set定义变量的区别

在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅在类中生效.即只在存储过程中的begin和end之间生效. 2.@set定义的变量,叫做会话变量,也叫用户定义变量,在整个会话中都起作用(比如某个应用的一个连接过程中),即这个变量可以在被调用的存储过程或者代码之间共享数据.如何理解呢?可以看下面这个简单例子,很好理解. (1)先执行下面脚本,创建一