欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

了解 Oracle 的游标

程序员文章站 2024-02-10 13:39:10
...

了解 Oracle 的游标

一,概念:

游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。

二, 作用:

用于定位结果集的行遍历结果集

三, 使用:

 创建一个游标:

 TYPE ref_cur  定义类型变量        s ref cursor:相当于数据类型,不过是引用游标的数据类型。


TYPE ref_cur IS REF CURSOR

procedure call_del_ls(IN_PCH in varchar2) is
   l_sql varchar2(100);

  --1,创建游标类型
   c_table_name  ref_cur;

   l_table_name varchar2(40);
   l_id number;
  begin
     
    --2 游标是否打开,始终为FALSE;
    if c_table_name%isopen then
       CLOSE c_table_name;
    end if;

    -- 3,打开游标,SQL查询的结果集用 游标接收并且循环游标
    open c_table_name for select table_name,to_number(id) id  from LS_DE_TABLE order by id;
    --4,循环遍历数据
    loop
    fetch c_table_name into l_table_name,l_id;
      exit when c_table_name%notfound;
      l_sql:='DELETE  ls_'||l_table_name||'  where pch = '''||IN_PCH||'''';
      execute immediate l_sql;
      commit;
    end loop;
  end;

 也可以创建 游标 接受   SQL语句的结果集

 cursor 游标名 ( 参数 ) [返回值类型] is select语句;

 --1.声明游标
   cursor vrows is select * from emp;

 

隐式游标:

SQL%ROWCOUNT    整型   返回结果集成功执行的数据行数   
SQL%FOUND       布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功   
SQL%NOTFOUND    布尔型 与SQL%FOUND属性返回值相反   
SQL%ISOPEN      布尔型 DML执行过程中为真,结束后为假 

遍历游标 :

create or replace procedure myprocedure is
      CURSOR CUR_TEST IS --声明显式游标
             SELECT ECODE,ENAME
              FROM EMP;
      CUR CUR_TEST%ROWTYPE; --定义游标变量,该变量的类型为基于游标C_EMP的记录

    BEGIN 
      --For 循环
      FOR CUR IN CUR_TEST LOOP
          --循环体
        DBMS_OUTPUT.PUT_LINE('员工编号:'||CUR.ECODE ||'员工姓名:'|| CUR.ENAME);
      END LOOP;

      --Fetch 循环
      OPEN CUR_TEST;--必须要明确的打开和关闭游标
      LOOP 
        FETCH CUR_TEST INTO CUR;
        EXIT WHEN CUR_TEST%NOTFOUND;
        --循环体
        DBMS_OUTPUT.PUT_LINE('员工编号:'||CUR.ECODE ||'员工姓名:'|| CUR.ENAME);
      END LOOP;
      CLOSE C_EMP;

      --While 循环
      OPEN CUR_TEST;--必须要明确的打开和关闭游标
        FETCH CUR_TEST INTO CUR;
        WHILE CUR_TEST%FOUND LOOP  
          --循环体
          DBMS_OUTPUT.PUT_LINE('员工编号:'||CUR.ECODE ||'员工姓名:'|| CUR.ENAME);

          FETCH CUR_TEST INTO CUR;
        END LOOP;
      CLOSE C_EMP;



    END myprocedure;