Oracle基础学习(四) 游标


CURSOR 游标名 IS 操作语句; --1、定义游标

OPEN 游标名; --2、打开游标
LOOP
FETCH 游标名 INTO 变量名; --3.读取游标
EXIT WHEN 游标名%NOTFOUND;
处理语句;
END LOOP;
CLOSE 游标名;--4.关闭游标



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

  1、声明游标:

       cursor curname is  select.......

    2、打开游标:

       open curname;

    3、提取数据:循环提取数据:游标中的谓词 curname%found 、curname%notfound。

       当结果集中的数据没有提取完时 %found的值true,否则是false.

       %notfound与%found 相反。通过两个谓词可以控制循环

       fetch  curname  into .......

    4、关闭游标

      close curname;

②遍历循环游标

⑴For 循环游标

循环游标隐式打开游标,自动滚动获取一条记录,并自动创建临时记录类型变量存储记录。处理完后自动关闭游标。

For 变量名 In 游标名

Loop

数据处理语句;

End Loop;

⑵Loop循环游标

。。。

Loop

Fatch 游标名InTo 临时记录或属性类型变量;

Exit When 游标名%NotFound;

End Loop;

例子1:

  /* conn scott/tiger */

   Declare

     Cursor myCur is select empno,ename,sal from emp;

     vna varchar2(10);

     vno number(4);

     vsal number(7,2);

  Begin

     open myCur;

     fetch myCur into vno,vna,vsal;

     dbms_output.put_line(vno||'    '||vna||'    '||vsal);

     close myCur;

  End;

  /


 例子2:使用loop遍历游标。

  Declare

     Cursor myCur is select ename,job,sal,empno from emp;

     varE myCur%rowType;

  Begin

     if myCur%isopen = false then

        open myCur;

       dbms_output.put_line('Opening...');

     end if;

     loop

        fetch myCur into varE;

        exit when myCur%notfound;

        dbms_output.put_line(myCur%rowCount||'    '||vare.empno||'    '||vare.ename||'    '||vare.sal);

     end loop;

     if myCur%isopen then

        Close myCur;

        dbms_output.put_line('Closing...');

     end if;

  End;

  /


  例子3:使用For循环遍历游标,

  /* conn scott/tiger */

  Declare

     Cursor myCur is select * from emp;

  Begin

     for varA in myCur

      loop

         dbms_output.put_line(myCur%rowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal);

      end loop;

  End;

  /

  

declare 
       --类型定义
       cursor c_job
       is
       select empno,ename,job,sal
       from emp
       where job='MANAGER';
       --定义一个游标变量
       c_row c_job%rowtype;
begin
       open c_job;
         loop
           --提取一行数据到c_row
           fetch c_job into c_row;
           --判读是否提取到值,没取到值就退出
           --取到值c_job%notfound 是false 
           --取不到值c_job%notfound 是true
           exit when c_job%notfound;
            dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
         end loop;
       --关闭游标
      close c_job;
end;
--5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标)
declare 
       cursor
       c_job(p_job nvarchar2)
       is 
       select * from emp where JOB=p_job;
       r_job emp%rowtype;
begin 
       for r_job in c_job('CLERK') loop
           dbms_output.put_line('员工号'||r_job.EMPNO||' '||'员工姓名'||r_job.ENAME);
        end loop;
end;
SELECT * FROM EMP
原文地址:https://www.cnblogs.com/jeffjoy/p/9209598.html