游标的简单使用

游标的简单使用

写在前面

游标的属性

  • 无感知
  • 只读:不可更新
  • 不可遍历:只能在一个方面遍历数据,不能跳行

定义游标

declare cursor_name cursor for select_statement;

// 声明一个游标与select 语句相关联。使用select语句检索游标要遍历的行,再使用fetch提取。
// select检索的列数要和fetch中指定输出的列数匹配。
// 其中,select语句能有into子句。

游标的位置:
在定义变量之后,处理程序声明之前。

从游标中取值

FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
当游标读到末尾,继续取值会报错(02000),可以声明declare continue handler来操作一越界标志。
语法格式为:
declare continue handler for NOT FOUND statement;

DECLARE … CONDITION声明
该语句声明一个命名错误的文件,将名称与特定的条件关联,可以在declare ... handler中引用
通过此语句可以看到后端代码意图。
定义格式:

DECLARE no_such_table CONDITION FOR 1051;
DECLARE CONTINUE HANDLER FOR no_such_table
  BEGIN
    -- body of handler
  END;

打开一个游标

open cursor_name;

定义一个简单的游标

  • 准备数据
create table goods(gid int primary key auto_increment,name varchar(30) , num int);
insert into goods(name,num) values ("cat",40);
insert into goods(name,num) values ("dog",63);
insert into goods(name,num) values ("pig",87);
  • 创建游标,将所有数据遍历
delimiter $$
create procedure test_pro1()
begin
    -- 定义变量
    declare row_gid int;
    declare row_name varchar(30);
    declare row_num int;
    -- 创建游标
    declare getcursor cursor for select * from goods;
    
    -- open cursor;
    open getcursor;
    
    -- 从游标中取值
   fetch getcursor into row_gid,row_name,row_num ;
   
   -- 显示操作
   select * from goods;
   
   -- close 
   close getcursor;
end $$ 

delimiter ; 
  • 取多次值
delimiter $$
create procedure test_pro3()
begin 
   -- 定义变量
  declare cnt int default 0;
  declare i int default 0;
  declare row_gid int ;
  declare row_name varchar(20);
  declare row_num int;
  --定义游标,取出goods表的所有字段
  declare getgoods cursor for select gid,name,num  from goods;
  -- 获取表行数
  select count(*) into cnt from goods;
  --打开游标
  open getgoods;
  --fetch取值
  repeat
      fetch getgoods into row_gid,row_name,row_num;
   select row_name,row_num from goods;  
   set i:= i+1;
   until i>=cnt end repeat;
   --关闭游标
  close getgoods;
end $$

delimiter ;
/*
result:
ERROR 1329 (02000): No data - zero rows fetched, selected, or processed
*/
  • 使用越界标志来控制循环
delimiter $$
create procedure test_pro4()
begin 
  declare row_gid int ;
  declare row_name varchar(20);
  declare row_num int;
  declare have int default 1;
  
  declare getgoods cursor for select gid,name,num  from goods;
  // 先将have定为1,表示为true,当找不到行时设置为false并退出
  declare continue handler for NOT FOUND set have:=0;
  open getgoods;
  repeat
      fetch getgoods into row_gid,row_name,row_num;
   select row_name,row_num from goods;  

   until have = 0  end repeat;
  close getgoods;
end $$

delimiter ;

循环语法

  • repeat语法
```sql
delimiter $$
create procedure test_pro4()
begin 
  declare row_gid int ;
  declare row_name varchar(20);
  declare row_num int;
  declare have int default 1;
  
  declare getgoods cursor for select gid,name,num  from goods;
  // 先将have定为1,表示为true,当找不到行时设置为false并退出
  declare continue handler for NOT FOUND set have:=0;
  open getgoods;
  repeat
      fetch getgoods into row_gid,row_name,row_num;
   select row_name,row_num from goods;  

   until have = 0  end repeat;
  close getgoods;
end $$

delimiter ;

  • while 语法
delimiter $$
create procedure test_pro4()
begin 
  declare row_gid int ;
  declare row_name varchar(20);
  declare row_num int;
  declare have int default 1;
  
  declare getgoods cursor for select gid,name,num  from goods;
  // 先将have定为1,表示为true,当找不到行时设置为false并退出
  declare continue handler for NOT FOUND set have:=0;
  open getgoods;
  while have = 1 do
      fetch getgoods into row_gid,row_name,row_num;
   select row_name,row_num from goods;  

  end while;
  close getgoods;
end $$

delimiter ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
游标是一种用于在SQL语句中处理结果集的机制,它允许用户在结果集中逐行处理数据,而不需要一次性将数据全部加载到内存中。下面是游标使用过程: 1. 声明游标使用DECLARE语句声明游标,指定游标的名称和SELECT语句。 2. 打开游标使用OPEN语句打开游标,使其可以开始遍历结果集。 3. 读取数据:使用FETCH语句读取游标当前指向的行的数据,可以使用循环语句遍历整个结果集。 4. 处理数据:对于每一行数据,可以进行相应的处理,例如输出到屏幕或写入另一个表中。 5. 关闭游标使用CLOSE语句关闭游标,释放资源。 6. 销毁游标使用DROP语句销毁游标,释放内存。 下面是一个简单游标使用示例: ``` DECLARE CURSOR cur_employee IS SELECT first_name, last_name, salary FROM employees; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; v_salary employees.salary%TYPE; BEGIN OPEN cur_employee; LOOP FETCH cur_employee INTO v_first_name, v_last_name, v_salary; EXIT WHEN cur_employee%NOTFOUND; -- 处理数据,这里只是输出到屏幕 DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name || ' ' || v_salary); END LOOP; CLOSE cur_employee; END; ``` 在这个示例中,声明了一个名为cur_employee的游标,它的SELECT语句查询了employees表中的员工信息。然后使用OPEN语句打开游标使用FETCH语句逐行读取数据,并使用循环语句遍历整个结果集。在循环体中,对于每一行数据,将其拼接为一个字符串并输出到屏幕上。最后使用CLOSE语句关闭游标,释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值