Oracle数据库中游标的使用

本文详细介绍了游标在Oracle数据库查询中的作用、创建步骤、使用方法以及一些关键属性,包括如何通过普通方法、循环方法和使用参数的游标进行数据提取。此外,还展示了如何使用嵌套循环和游标结合查询特定班级的学生信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游标的定义:

  • 游标的作用
  • 创建步骤:
    • 定义一个游标
      • 语法:CURSOR cursor_name is select _statement;
    • 打开游标
      • 语法:open cursor_name;
    • 提取数据
      • 使用fetch,fetch关键字会抓取当前行的记录,并将记录指针下移一行。就像JdbC中的ResultSet一样。
      • 语法:fetch cursor_name into variable1,variable2.
      • 游标的一些属性
    • 关闭游标
      • 语法:close cursor_name
  • 示例代码如下:
    • 普通的方法:
      ---游标的使用
      declare
        --定义一个游标,将tab_stu所有数据提取出来
       cursor c_tab_stu is
       select * from tab_stu;
       
       r_tab_stu tab_stu%rowtype;--使用rowtype存储游标数据
       
      begin
        --打开游标
        open c_tab_stu;
        --提取数据
        fetch c_tab_stu into r_tab_stu;
        dbms_output.put_line('stu_id:'||r_tab_stu.stu_id);
        dbms_output.put_line('stu_name:'||r_tab_stu.stu_name);
        dbms_output.put_line('stu_age:'||r_tab_stu.stu_age);
        --关闭游标
        close c_tab_stu;
      end;

    • 使用循环的方法
      --使用循环提取所有记录
      declare
        --定义一个游标,将tab_stu所有数据提取出来
       cursor c_tab_stu is
       select * from tab_stu;
       
       r_tab_stu tab_stu%rowtype;--使用rowtype存储游标数据
       
      begin
        --打开游标
        open c_tab_stu;
        --提取数据
        loop 
           fetch c_tab_stu into r_tab_stu;
           --退出条件,也就是上面图片的属性的值
           exit when c_tab_stu%notfound;
           
           dbms_output.put_line('stu_id:'||r_tab_stu.stu_id);
           dbms_output.put_line('stu_name:'||r_tab_stu.stu_name);
           dbms_output.put_line('stu_age:'||r_tab_stu.stu_age);
           
        end loop;
       
        --关闭游标
        close c_tab_stu;
      end;

    • 使用含有参数的游标和嵌套循环:
      --含有条件的游标
      --实现目标是,查询每个班的学生
      declare
      --先要定义两个游标
      --定义tab_class游标
      cursor s_tab_class is
      select * from tab_class;
      --定义tab_stu游标,但是这里需要一个参数,就是班级的id
      cursor s_tab_stu(v_class_id number) is
      select * from tab_stu where class_id=v_class_id;
      
      --定义两个存储变量
      --定义tab_class
      v_tab_class_rowtype tab_class%rowtype;
      
      --定义tab_stu
      v_tab_stu_rowtype tab_stu%rowtype;
      begin
        --打开游标
        open s_tab_class;
        loop
          --提取数据
          fetch s_tab_class into v_tab_class_rowtype;
          exit when s_tab_class%notfound;
          dbms_output.put_line('班级:'||v_tab_class_rowtype.class_name||'含有');
          --嵌套循环,遍历当前班级的学生
          open s_tab_stu(v_tab_class_rowtype.class_id);
          loop
            fetch s_tab_stu into v_tab_stu_rowtype;
            exit when s_tab_stu%notfound;
            dbms_output.put_line(v_tab_stu_rowtype.stu_name);
          end loop;
          close s_tab_stu;
        end loop;
        close s_tab_class;
      end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值