zoukankan      html  css  js  c++  java
  • oracle基础之游标的理解与使用

    关于游标,首先要知道游标的定义。

      游标,是内存中的一款区域,用来存放select的结果集

      游标用来处理从数据库中检索的多行记录(使用select语句)。利用游标,程序可以逐个的处理和遍历一次索引返回的整个记录集。

    在数据库中,存在两种游标:

    一、显示游标(需要明确定义

        显示游标被用于处理返回多行数据的select语句,游标名通过CURSOR...IS语句显示的赋给select语句。

        在PL/SQL中处理显示游标的四个步骤:

         1)声明游标:CURSOR   IS select语句

         2)为查询打开游标: OPEN 游标名称

         3) 取得结果放入PL/SQL变量中:

             FETCH 游标名称 INTO list_of_variables;

                      FETCH  游标名称     INTO PL/SQL_record;

         4)关闭游标:CLOSE 游标名称

         注意:在声明游标时, select语句不能包含INTO子句。当使用显示游标时,INTO子句是FETCH语句的一部分。

    二、隐式游标 
           所有的隐式游标都被假设为只返回一条记录。
           使用隐式游标时,用户无需进行声明、打开及关闭。PL/SQL隐含地打开、处理,然后关掉游标。
           例如:
           …….

           SELECT studentNo,studentName

           INTO curStudentNo,curStudentName

           FROM StudentRecord

           WHERE name=’gg’;

           上述游标自动打开,并把相关值赋给对应变量,然后关闭。执行完后,PL/SQL变量curStudentNo,curStudentName中已经有了值。
       2、 隐式游标
         单条sql语句所产生的结果集合 
           用关键字SQL表示隐式游标
            4个属性 %rowcount  影响的记录的行数  整数
                    %found     影响到了记录 true
                    %notfound  没有影响到记录 true
                    %isopen    是否打开  布尔值 永远是false
             多条sql语句 隐式游标SQL永远指的是最后一条sql语句的结果
             主要使用在update 和 delete语句上      


    实际操作和例子:

       (1)FOR循环游标 (常用的一种游标)

     --<1>定义游标
     --<2>定义游标变量
     --<3>使用for循环来使用这个游标

      --前向游标 只能往一个方向走
      --效率很高
          declare
            --类型定义
            cursor cc is select empno,ename,job,sal
             from emp where job = 'MANAGER';
            --定义一个游标变量
            ccrec cc%rowtype;
          begin
             --for循环
             for ccrec in cc loop
                dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
             end loop;       
          end;
       (2) fetch游标
         --使用的时候 必须要明确的打开和关闭
          declare
            --类型定义
            cursor cc is select empno,ename,job,sal
             from emp where job = 'MANAGER';
            --定义一个游标变量
            ccrec cc%rowtype;
          begin
            --打开游标
             open cc;
            --loop循环
             loop
                --提取一行数据到ccrec中 
                fetch cc into ccrec;         
                --判断是否提取到值,没取到值就退出
                --取到值cc%notfound 是false
                --取不到值cc%notfound 是true 
                exit when cc%notfound;
                dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);            
             end loop; 
            --关闭游标
             close cc;  
          end;
      游标的属性4种
           %notfound  fetch是否提到数据 没有true 提到false
           %found      fetch是否提到数据 有true 没提到false
           %rowcount  已经取出的记录的条数
           %isopen    布尔值 游标是否打开
       (3)参数游标
     按部门编号的顺序输出部门经理的名字
         declare
           --部门
           cursor c1 is select deptno from dept;
           --参数游标c2,定义参数的时候
           --只能指定类型,不能指定长度  
           --参数只能出现在select语句=号的右侧
           cursor c2(no number,pjob varchar2) is select emp.* from emp
             where deptno = no and job=pjob;
           c1rec c1%rowtype;
           c2rec c2%rowtype;
           --定义变量的时候要指定长度
           v_job varchar2(20);
         begin
           --部门
            for c1rec in c1 loop
              --参数在游标中使用
              for c2rec in c2(c1rec.deptno,'MANAGER') loop
                dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);
              end loop; 
            end loop; 
         end; 
      (4)引用游标/动态游标
           -- select语句是动态的
         declare
           --定义一个类型(ref cursor)弱类型    
           type cur is ref cursor;
             --强类型(返回的结果集有要求)
           type cur1 is ref cursor return emp%rowtype;
           --定义一个ref cursor类型的变量   
           cura cur;
           c1rec emp%rowtype;
           c2rec dept%rowtype;
         begin
      DBMS_output.put_line('输出员工')   ;       
           open cura for select * from emp;
           loop
             fetch cura into c1rec;   
             exit when cura%notfound;
             DBMS_output.put_line(c1rec.ename)   ;
           end loop ;
      DBMS_output.put_line('输出部门')   ;
           open cura for select * from dept;
           loop
             fetch cura into c2rec;   
             exit when cura%notfound;
             DBMS_output.put_line(c2rec.dname)   ;
           end loop;  
           close cura;
        end;

  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/MoreThinking/p/7700295.html
Copyright © 2011-2022 走看看