MySQL 存储过程游标

一、创建游标

游标用declare语句创建。如下面的例子所示:

create procedure test2()
begin
    declare cursorTest cursor for select * from allIntersection;
end;

二、打开、关闭游标

  • 打开游标
    open cursorTest;  
  • 关闭游标
    close cursorTest;  

    close 释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭。在一个游标关闭后,如果没有重新打开,则不能使用它。但是,声明过的游标不需要再次声明,用 open 语句打开它就可以了。

三、使用游标数据

在一个游标被打开后,可以使用 fetch 语句分别访问它的每一行。fetch 语句指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条 fetch 语句检索下一行(不重复读取同一行)。

create procedure test3()
begin
    declare o int;            -- 声明一个局部变量
    declare cursorTest3 cursor for select ID from allintersection; -- 声明一个游标 
    open cursorTest3; -- 打开游标 
    fetch cursorTest3 into o; -- 获取Inter
    sectionName close cursorTest3; -- 关闭游标 
end;

其中 fetch 用来检索当前行的 IntersectionName 列(将自动从第一行开始)到一个名为 o 的局部声明的变量中。对检索出的数据部做任何处理

四、式例

create procedure test4()
begin
    declare done boolean default 0;
    declare o int;            -- 声明一个局部变量
    declare cursorTest4 cursor for select ID from allintersection;-- 声明一个游标 
    declare continue handler for sqlstate '02000' set done=1; 
    open cursorTest4; -- 打开游标  
    repeat   -- 遍历所有的行
      fetch cursorTest4 into o; -- 获取IntersectionName 
    until done end repeat;  -- 结束循环 
    close cursorTest4; -- 关闭游标
 end;

 与 test3 不同的是,这个例子中的 fetch 是在 repeat 内,因此它反复执行到 done 为真( until done end repeat; 规定)。为使它起作用,用一个default 0(假,不结束)定义变量done。那么,done怎样才能在结束时被设置为真呢?答案是用以下语句:

declare continue handler for sqlstate '02000' set done=1;  

这条语句定义了一个 continue handler,它是在条件出现时被执行的代码。这里,它指出 sqlstate '02000'出现时,set done=1。sqlstate '02000'是一个未找到条件,当repeat 由于没有更多的行供循环而不能继续时,出现这个条件。

create procedure `test5` ()
begin
-- 需要定义接收游标数据的变量 
  declare a char(16);
  -- 游标
  declare cursorTest5 cursor for select i from t;
  -- 遍历数据结束标志
  declare done int default false;
  -- 将结束标志绑定到游标
  declare continue handler for not found set done = true;
  -- 打开游标
  open curosrTest5;
  
  -- 开始循环
  read_loop: loop
    -- 提取游标里的数据,这里只有一个,多个的话也一样;
    fetch cursorTest5 into a;
    -- 声明结束的时候
    if done then
      leave read_loop;
    end if;
    -- 这里做你想做的循环的事件

    insert into t values (a);

  end loop;
  -- 关闭游标
  close curosrTest5;

end

注意,变量的定义不要和你的select的列的键同名!不然,fetch into 会失败!

原文地址:https://www.cnblogs.com/tannerBG/p/4079191.html