欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

玩转MySQL游标查询:理解游标在MySQL中的作用

最编程 2024-08-05 07:44:18
...


1.1 游标的作用及属性

用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。游标不是某个SELECT语句,但是它是被select语句检索出来的结果集,另外,MySQL游标只能用于存储过程(和函数)

1. 游标是只读的,也就是不能更新它;
2. 游标是不能滚动的,也就是只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录;
3. 避免在已经打开游标的表上更新数据。

1.2 创建游标

使用DECLARE和CURSOR关键字:

DECLARE cursor_name CURSOR FOR select t.name,t.age from user t; 
上面这条语句就对,我们执行的select语句返回的记录指定了一个游标

1.3 如何使用游标

1. 创建游标后,需要使用OPEN语句来打开上面你定义的游标
	OPEN cursor_name;  

2. 接下来你可以用FETCH语句来获得下一行数据,并且游标也将移动到对应的记录上(这个就类似java里面的那个iterator)。
	FETCH cursor_name INTO names,ages; 
	将游标当前的记录的数据赋值给names,ages变量。(注意,这里变量值获取与创建游标的select语句返回的字段一一对应)

3. 游标使用结束后,需要关闭游标
	CLOSE cursor_name;

1.4 NOT FOUND条件

在使用游标时需要注意的是,使用定义一个针对NOT FOUND的条件处理函数(condition handler)来避免出现“no data to fetch”这样的错误,类似于java中的数组下标越界。条件处理函数就是当某种条件产生时所执行的代码,这里但我们游标指到记录的末尾时,便会满足NOT FOUND这样条件,此时我们应该结束游标。

1. 先定义游标遍历数据结束标志变量
	DECLARE done INT DEFAULT FALSE;

2. 将结束标志绑定到游标
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

3.游标每次循环判断标志变量是否为TRUE(为TRUE说明数据已经到末尾)
	 -- 打开游标
    OPEN  cur_account;     
    -- 循环
    read_loop: LOOP
            -- 获取数据
            FETCH from cursor_name INTO names,ages;
			-- 判断游标是否已经到末尾
            IF done THEN
                LEAVE read_loop; -- 结束循环体
             END IF;
    END LOOP;
 	
 	-- 关闭游标
    CLOSE cur_account;

1.5 实例

delimiter $
create PROCEDURE phoneDeal()
BEGIN
    DECLARE  id varchar(64);   -- id
    DECLARE  phone1  varchar(16); -- phone
    DECLARE  password1  varchar(32); -- 密码
    DECLARE  name1 varchar(64);   -- id
    -- 遍历数据结束标志
    DECLARE done INT DEFAULT FALSE;
    -- 定义游标
    DECLARE cur_account CURSOR FOR select phone,password,name from account_temp;
    -- 将结束标志绑定到游标
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    -- 打开游标
    OPEN  cur_account;     
    -- 遍历
    read_loop: LOOP
            -- 取值 取多个字段
            FETCH  NEXT from cur_account INTO phone1,password1,name1;
            IF done THEN
                LEAVE read_loop;
             END IF;
 
        -- 你自己想做的操作
        insert into account(id,phone,password,name) value(UUID(),phone1,password1,CONCAT(name1,'的家长'));
    END LOOP;
	-- 关闭游标
    CLOSE cur_account;
END $