• 技术文章 >数据库 >Oracle

    什么是oracle游标

    青灯夜游青灯夜游2022-02-23 11:35:56原创139

    在Oracle中,游标是一种机制,是通过关键字CURSOR的来定义一组Oracle查询出来的数据集,可以把查询的数据集存储在内存当中,然后通过游标指向其中一条记录,通过循环游标达到循环数据集的目的。

    本教程操作环境:Windows7系统、Oracle 11g版、Dell G3电脑。

    在Oracle中,游标(Cursors)是一种机制,可以通过该机制将名称分配给SELECT语句并处理该SQL语句中的信息。

    Oracle游标是通过关键字CURSOR的来定义一组Oracle查询出来的数据集,类似数组一样,把查询的数据集存储在内存当中,然后通过游标指向其中一条记录,通过循环游标达到循环数据集的目的。

    游标有什么作用?

    ①指定结果集中特定行的位置。

    ②基于当前的结果集位置检索一行或连续的几行。

    ③在结果集的当前位置修改行中的数据。

    ④对其他用户所做的数据更改定义不同的敏感性级别。

    ⑤可以以编程的方式访问数据库。

    Oracle游标的类型?

    1、静态游标:结果集已经确实(静态定义)的游标。分为隐式和显示游标

    2、REF游标:动态关联结果集的临时对象。

    Oracle游标的状态有哪些,怎么使用游标属性?

    ①游标的状态是通过属性来表示。

    ②使用游标的属性。

    例子:

    /* conn scott/tiger */
      Begin
       Update emp Set  SAL = SAL + 0.1  Where JOB = 'CLERK';
       If  SQL%Found  Then
        DBMS_OUTPUT.PUT_LINE('已经更新!');
       Else
        DBMS_OUTPUT.PUT_LINE('更新失败!');
       End  If;
      End;

    如何使用显示游标,?如何遍历循环游标?

    1、使用显示游标

    CURSOR 游标名( 参数 列表)   [返回值类型]   IS   Select 语句;
     Open 游标名( 参数 列表);
    Fetch  游标名InTo  临时记录或属性类型变量;
    Close  游标名;

    2、遍历循环游标

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

         For  变量名  In  游标名 
         Loop
          数据处理语句;
         End 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遍历游标。

     /* conn scott/tiger */
      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;
      /

    怎样更新和删除显示游标中的记录?

    ①UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。

    要使用这个方法,在声明游标时必须使用FOR UPDATE子串,当对话使用FOR UPDATE子串打开一个游标时,

    所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,

    不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。

    在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。

    如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。

    ②使用更新或删除:

    ⑴声明更新或删除显示游标:

       Cursor 游标名IS  SELECT 语句   For Update [ Of  更新列列名];
       Cursor 游标名IS  SELECT 语句   For Delete [ Of  更新列列名];

    ⑵使用显示游标当前记录来更新或删除:

       Update  表名   SET   更新语句  Where   Current  Of   游标名;
       Delete  From  表名   Where   Current  Of   游标名;

    例子1:更新显示游标记录

       /*conn scott/tiger*/
       Declare
         Cursor myCur is select job from emp for update;
           vjob empa.job%type;
           rsal empa.sal%type;
        Begin
           open myCur;
           loop
              fetch myCur into vjob;
              exit when myCur%notFound;
              case  (vjob)
                 when 'ANALYST' then  rsal := 0.1;
                when  'CLERK' then  rsal := 0.2;
                 when  'MANAGER' then  rsal := 0.3;
                 else
                   rsal := 0.5;
              end case;
            update emp set sal = sal + rsal where current of myCur;
           end loop;
        End;
        /

    例子2:删除显示游标记录

        /*conn scott/tiger
        Crate table  empa  Select * from scott.emp;
        */
        Declare
          Cursor MyCursor  Select   JOB  From  empa  For  Update;
          vSal   emp.Sal%TYPE;
        Begin
          Loop
           Fetch  MyCursor  InTo  vSal;
           Exit  When  MyCursor%NotFound;
           If   vSal < 800 Then
            Delete  From empa  Where  Cursor  Of   MyCursor;
           End  If;  
          End    Loop;
        End;/

    什么是带参数的显示游标?

    1、与过程和函数相似,可以将参数传递给游标并在查询中使用。

    参数只定义数据类型,没有大小(所有Oracle中的形参只定义数据类型,不指定大小)。

    与过程不同的是,游标只能接受传递的值,而不能返回值。

      可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。

    游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。

    2、使用带参数的显示游标

       CURSOR 游标名  [(parameter[,parameter],...)]    IS   Select语句;

    参数形式:

    1,参数名 数据类型

    2,参数名 数据类型 DEFAULT 默认值

    例子:

        /*conn scott/tiger
        Crate table  empa  Select * from scott.emp;
        */
        Declare
          Cursor MyCursor(pSal  Number  Default   800)  Select   JOB  From  empa Where  SAL >  pSal ;
          varA  MyCursor%ROWTYPE;
        Begin
          Loop
           Fetch  MyCursor  InTo  varA;
           Exit  When  MyCursor%NotFound;
           DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal); 
          End    Loop;
        End;/

    推荐教程:《Oracle教程

    以上就是什么是oracle游标的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:oracle 游标
    上一篇:oracle中怎么创建存储过程 下一篇:oracle中什么是表空间
    PHP编程就业班

    相关文章推荐

    • 怎么查询oracle有哪些用户• Oracle的实例是什么• oracle怎么将数据转为数字类型• oracle怎么查询数据库的默认表空间• oracle中存储过程与函数的区别是什么• oracle中怎么创建存储过程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网