Mysql中游标的使用

最近在使用Mysql时,经常需要用到游标,所以将使用方法做下记录以备日后查看。(这里只是为了说明游标的用法,不会涉及复杂的业务逻辑,所以举的例子可能并不恰当)

首先,创建两张表departmentinfo(部门信息表)和employeeinfo(员工信息表)

表结构如下:

表departmentinfo存储部门名及部门总销售额

表employeeinfo存储员工名、员工所在部门ID及员工个人销售额

表中初始数据如下:

各部门总销售额均为0

员工分别在3个部门下,且都有自己的销售额

然后创建存储过程P_ChangeSales,代码如下

CREATE DEFINER = ‘root‘@‘localhost‘
PROCEDURE test.P_ChangeSales(OUT ExtReturnValue INT)
TOP:
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    ROLLBACK;
    SET ExtReturnValue = 0; -- Failed
  END;

  START TRANSACTION;

  BEGIN
    DECLARE isLeave  INT; -- 是否要跳出循环,0:继续 1:跳转
    DECLARE depId    INT; -- 部门ID变量
    DECLARE salesVal INT; -- 销售额变量
    DECLARE curSales CURSOR FOR SELECT DepartmentID,Sales FROM employeeinfo; -- 声明游标
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET isLeave = 1; -- 出现溢出则赋值为1,作为跳出循环的判断

    OPEN curSales; -- 开启游标
    SET isLeave = 0;

    curSales_loop:LOOP
      FETCH curSales INTO depId, salesVal;
      IF isLeave = 1 THEN -- 循环结束
        LEAVE curSales_loop;
      ELSE
        UPDATE departmentinfo SET Sales = Sales + salesVal WHERE DepartmentID = depId; -- 增加部门总销售额
      END IF;
    END LOOP curSales_loop;

    CLOSE curSales; -- 关闭游标

  END;

  UPDATE employeeinfo SET Sales = 0; -- 员工个人销售额清0

  SET ExtReturnValue = 1; -- Success

  COMMIT;
END

现在我们执行上面的存储过程

存储过程执行成功,得到返回值1。查看表中数据

表departmentinfo中计算出的部门总销售额

表employeeinfo中员工的个人销售额变为0

至此,我们完成了Mysql中游标的简单应用。

还有一点需要注意,存储过程中变量的定义不要和我们表中的字段名相同,不然会有问题。例如,我们将存储过程中的所有”salesVal”全部改为”sales”与字段名”Sales”相同(不区分大小写)。此时保存修改,并不会报错,存储过程也可以执行,但是会得到如下返回值

我们的存储过程执行时出现问题,进行了回滚,才会得到这个返回值。

下面我们对存储过程进行调试发现,执行到”FETCH … INTO …”后,”depId”中得到正确的值,但是”sales”的值为NULL。

所以存储过程在执行到下面的sql语句时,出错回滚,这点大家一定要注意。

Mysql中游标的使用,布布扣,bubuko.com

时间: 2025-01-04 11:21:45

Mysql中游标的使用的相关文章

mysql中游标的使用案例详解(学习笔记)

1.游标是啥玩意?简单的说:游标(cursor)就是游动的标识,啥意思呢,通俗的这么说,一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行.我给大家准备一张图: 2.怎么使用游标?//1.声明/定义一个游标declare 声明;declare 游标名 cursor for select_statement;//2.打开一个游标open 打开;open 游标名//3.取值fetch 取值;fetch 游标名 into var1,var2[,...]//4.关闭一个游标c

SQL中游标的使用(转)

一般情况下,我们用SELECT这些查询语句时,都是针对的一行记录而言,如果要在查询分析器中对多行记录(即记录集)进行读取操作时,则需要使用到游标或WHILE等循环 游标的类型:  1.静态游标(不检测数据行的变化)  2.动态游标(反映所有数据行的改变)  3.仅向前游标(不支持滚动)  4.键集游标(能反映修改,但不能准确反映插入.删除) 游标使用顺序:   1.定义游标   2.打开游标   3.使用游标   4.关闭游标   5.释放游标 Transact-SQL:declare 游标名

SQL Server 中游标的使用

1.游标是行读取,占用资源比sql多2.游标的使用情景:  ->现存的系统中使用的是游标,查询必须通过游标来实现  ->用尽了while.子查询临时表.表变量.自定义函数以及其他方式仍然无法实现的时候,使用游标3.T-SQL 中游标的生命周期由5部分组成   ->定义游标:游标的定义遵循T-Sql的定义方法,赋值有两种方法,定义时赋值,和先定义后赋值,定义游标像定义其他局部变量一样前面要加@,注意如果是全局的游标,只支持定义时直接赋值,并且不能在游标前面加@   --定义时直接赋值   

oracle存储过程中游标的使用

一. 使用for循环游标: 1. 定义游标(游标就是一个小集合) 2. 定义游标变量 3. 使用for循环游标 declare -- 定义游标c_job cursor c_job is select empno, ename, job, sal from emp where job = 'MANAGER'; -- 定义游标变量c_row c_row c_job%rowtype; begin -- 循环游标,用游标变量c_row存循环出的值 for c_row in c_job loop dbms

sql中游标的定义和使用

游标的类型:1.静态游标(不检测数据行的变化)2.动态游标(反映所有数据行的改变)3.仅向前游标(不支持滚动)4.键集游标(能反映修改,但不能准确反映插入.删除) 游标使用顺序:1.定义游标2.打开游标3.使用游标4.关闭游标5.释放游标 语法 declare 游标名 cursor [LOCAL | GLOBAL][FORWARD_ONLY | SCROLL][STATIC | KEYSET | DYNAMIC ] [READ_ONLY | SCROLL_LOCKS] for selet语句 [

plsql编程中游标的使用

游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作. oracle中显示使用游标一般要包含以下5个步骤: 声明一些变量以便存储从游标返回的值. 声明游标,并指定查询. 打开游标. 遍历游标并取得数据. 关闭游标 表结构及数据如下: 1 -- Create table 2 create table EXCHANGETIME 3 ( 4 ID NUMBER(18) default 0 not null, 5 SYSTEM_TYPE

sql中游标的使用一

@@fetch_status declare @id int set @id = 1 DECLARE cur1 CURSOR FORSELECT employeeid FROM #table OPEN cur1 ;FETCH NEXT FROM cur1 ;WHILE @@FETCH_STATUS = 0 and @id = 0   BEGIN      FETCH NEXT FROM cur1 ;   END;CLOSE cur1 ;DEALLOCATE cur1 ;GO 以上例子中字体加粗的

oracle中游标的定义解析

TYPE type_cursor IS REF CURSOR[RETURN return_type];cursor_name type_cursor; TYPE type_cursor:定义类型变量 如int i中i is ref cursor:相当于数据类型,不过是引用游标的数据类型.如int i 中的int类型 这种变量通常用于存储过程和函数返回结果集时使用, 因为PL/SQL不允许存储过程或函数直接返回结果集,但可以返回类型变量, 而游标是系统给用户提高的缓冲区,也就是类似resoutse

SQL中游标的使用--遍历数据逐行更新或删除:相当于for循环

--------------------------------------例子1 单纯的游标-------------------------------- create TABLE Table1 ( a varchar(10), b varchar(10), c varchar(10), CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ( a ASC ) ) ON [PRIMARY] create TABLE Table2 ( a varchar(1