• oracle学习笔记10:游标


    1.什么是游标

    在oracle中执行select、update、insert、delete等操作时,oracle会在内存中为其分配上下文,即开辟一小块数据缓冲区,用于将查询到的结果集缓存起来。游标就是指向这个缓冲区的指针,便于进行逐行定位处理。游标使用完成后要及时关闭。

    2.游标的分类

      显式游标:显示游标指定游标的名字,调用方式:游标名+属性

      隐式游标:没有名字,执行select、update、delete、insert操作时,会自动触发隐士游标,调用方式:sql+属性

    3.游标的属性

      游标名%found     判断游标中是否读到数据

      游标名%notfound  判断游标中是否没有读到数据

      游标名%isopen   判断游标是否打开

      游标名%rowcount  获取游标中实际读取的行的数量

    游标处理数据的效率较低,非必要情况,不建议使用

    显示游标:

    1.创建游标

    declare
      --1. 定义游标
      -- cursor 游标名 is 查询命令
      cursor cur_emp is select empno,ename,job
                        from emp
                        where empno=7369;
      row1 emp.empno%type;
      row2 emp.ename%type;
      row3 emp.job%type;
    begin
      --2. 打开游标   open 游标名
      open cur_emp;
      --3. 提取数据   fetch 游标名 into 变量1,变量2,...
      fetch cur_emp into row1,row2,row3;
      dbms_output.put_line(row1);
      dbms_output.put_line(row2);
      dbms_output.put_line(row3);
      --4. 关闭游标 close 游标名
      close cur_emp;
    end;
    declare
      cursor emp_cur is select *
                        from emp;
      row1 emp%rowtype;
    begin
      --   当游标中有多个数据时,使用循环来提取数据
      open emp_cur;
        loop
          fetch emp_cur into row1;
          exit when emp_cur%notfound;
          dbms_output.put_line(emp_cur%rowcount||'--'||row1.empno||':'||row1.ename);
        end loop;
      close emp_cur;
    end;

    2.带参数的游标

    -- 带参数的游标
    declare
    --   定义带参数的游标,在命令中使用参数
      cursor cur_emp(no emp.empno%type) is select * from emp where empno=no;
      row1 emp%rowtype;
      begin
    --   打开游标传参
      open cur_emp(7369);
    --   提取数据
      fetch cur_emp into row1;
      dbms_output.put_line(row1.ename||row1.job);
    --   关闭游标
      close cur_emp;
    end;

    3.读取数据到表格中

    -- 将数据读到表格中
    declare
    --   定义表格类型
      type emp_table is table of emp%rowtype index by binary_integer ;
    --   声明表格变量
      v_emp emp_table;
    --   声明游标
      cursor cur_emp is select * from emp;
      begin
    --   打开游标
      open cur_emp;
    --   提取游标内数据到表格,使用bulk collect into 关键字,批量插入到表格中
      fetch cur_emp bulk collect into v_emp;
    --   使用循环来读取表中数据
      for i in v_emp.first..v_emp.LAST loop
        dbms_output.put_line(v_emp(i).ename||':'||v_emp(i).job);
      end loop;
    end;

    4.游标类型的变量

    -- 游标类型的变量,存储过程中当作参数使用
    create or replace procedure pro4(
    cur sys_refcursor
    )as
      row1 emp%rowtype;
    begin
      loop
        fetch cur into row1;
        exit when cur%notfound;
        dbms_output.put_line(row1.ename);
      end loop;
    end;
    declare
      type cur_type is ref cursor ;
      emp_cur cur_type;
      begin
      open emp_cur for select * from emp;
      pro4(emp_cur);
      close emp_cur;
    end;

    5.使用for简化游标的操作

    declare
      cursor emp_cur is select * from emp;
      begin
      for i in emp_cur loop
        dbms_output.put_line(i.ename);
      end loop;
    end;

    隐式游标(sql+属性名):

    declare
      begin
      update emp set ename = 'lisi' where empno=7369;
      if sql%found then
        dbms_output.put_line('更新了数据');
      end if;
    end;

    系统游标类型

    -- sys refcursor 系统游标变量
    create or replace procedure pro5(cur out sys_refcursor)
    as
    begin
      open cur for select * from emp;
    end;
    
    declare
      cur  sys_refcursor;
      row1 emp%rowtype;
    begin
      pro5(cur);
      loop
    --     在存储过程中,给系统游标赋值,在这里直接就可以调用不用再次赋值
        fetch cur into row1;
        exit when cur%notfound;
        dbms_output.put_line(row1.ename);
      end loop;
      close cur;
    end;
  • 相关阅读:
    POJ1296
    BZOJ1003
    POJ1160
    中国剩余定理(转)
    组合数公式
    网络操作系统*习题
    网络操作系统*习题
    网络操作系统习题
    网络操作系统习题
    Access总结
  • 原文地址:https://www.cnblogs.com/Zs-book1/p/11234204.html
Copyright © 2020-2023  润新知