使用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 $