ITPub博客

首页 > 数据库 > Oracle > 【原创】ORACLE静态游标

【原创】ORACLE静态游标

Oracle 作者:zhirkov 时间:2013-12-08 13:24:37 0 删除 编辑

游标(cursor)是系统为用户开设的一个数据缓冲区>,存放SQL语句的实施下场。每个游标区皆有一个名字。用户可以用SQL语句逐一从游标中获与记实,并赋给主变量,交由主语言进一步处置。

游标,从declare、open、fetch、close是一个残缺过程。

以下SQL语句均正在ORACLE中的scott用户下实施并通过测试。

1、定义游标的几种圆式。

1.指向固定下场散的游标
    declare
          cursor c_emp  is  select * from emp;
    begin
          open c_emp;

           --操作语句
          close c_emp;
    end;

/

2.定义用变量控造下场散的游标。
     declare
          v_sal   number(7,2);
          cursor c_emp is select * from emp where sal>v_sal;
    begin
         v_sal:= 3000;
         open c_emp;
         --操作语句
         close c_emp;
    end;
/

3.第三种游标的定义圆式,带参数的游标,用的最多,与2有异直同工之妙。

--指定参数类型时假设是number或varchar2的话不需要定义少度,可则编译不会通过。
      declare
          cursor c_emp(v_sal number) is select * from emp where sal>v_sal;
    begin
          open c_emp(3000);
          --操作语句
          close c_emp;
    end;
/

二、游标的行使

声明游标之后,通过翻开游标便可以与下场散,可以定义一个变量用于保存游标与出的单个记实或数据。

--与单个字段景遇:

set serveroutput on;
    declare
          v_name      emp.ename%type;--定义一个与emp.name相同类型的变量。
          cursor c_name  is  select   ename  from emp;
    begin
          open c_name;
          fetch c_name  into v_name;

              dbms_output.put_line(v_name);

             --输出员工姓名。
          close c_name;
    end;
/

--与整个记实景遇:

set serveroutput on;
    declare
          v_emp      emp%rowtype;--定义一个与emp相同的记实类型的变量。
          cursor c_emp  is  select * from emp;
    begin
          open c_emp;
          fetch c_emp into v_emp;

              dbms_output.put_line(v_emp.empno||v_emp.ename||v_emp.sal);

            -- 输出员工编号,姓名和报酬。
          close c_emp;
    end;

/

注:也可以正在与整个记实的游标中定义一个您要与的字段的相同类型的变量比圆

         v_name   emp.ename%type

         然后令v_name:=v_emp.ename,也达到了与单个字段的方针(当然其他数据便虚耗了)。

        假设要与多个字段(empno,ename),可以定义一个对象类型,包含要与的字段的变量。如:

        type emp_record_type  is record(
        emp_no  emp.empno%type,
        e_name  emp.ename%type
);
        emp_rec  emp_record_type;

        与游标:

        fetch c_emp into emp_rec.emp_no,emp_rec.e_name;

        不克不及采用以下圆式与单个字段:

          fetch c_emp into v_name;--‘列表中值数量呈现弊端’

        fetch c_emp.ename into v_name;--‘子法式或游标 "C_EMP" 援引逾越局限’

三、若何用游标遍历整个下场散

     正在这之前先讲一下游标的四个属性:  %found,%notfound,%isopen,%rowcount。

  %found:若fetch语句返回了一行数据,则%found返回true。

  %notfound:若fetch语句已找到数据,则%notfound返回true。
  %isopen,鉴定游标可可翻开。
  %rowcount:当前游标的指针位移量,到今朝位置游标所检索的记实的行数。

遍历的过程实在类似于循环语句,所以遍历也有for,while,loop等几种圆式:
--loop圆式遍历游标
declare
          v_name  varchar2(10);
          cursor c_name  is  select ename from emp;
    begin
        Open  c_name;
        Loop
            Fetch c_name into v_name;
            exit when c_name%notfound;--已找到数据时退出(即到达记实结尾)。
             dbms_output.put_line(v_name);
        End Loop;
        Close c_name;
    end;
/

--while循环遍历

      declare
          v_name    varchar2(10);
          cursor c_name  is  select ename from emp;
    begin
        Open  c_name;
         Fetch c_name into v_name;
          While c_name%Found--能找到数据则实施循环内语句。
          Loop
                dbms_output.put_line(v_name);
          Fetch  c_name  into v_name;
          End Loop;
        Close c_name;
    end;
/      

--for循环遍历,最简单,用的最多,不需要声明v_student,Open和Close游标和fetch操作(不消翻开游标和启锁游标,实现遍历游标最下效圆式)。详细性能比较请参看我的博客。http://blog.sina.com.cn/s/blog_62defbef0101ogxr.html>
      declare
        cursor c_name is select ename from emp;
    begin
         for cur in c_name--cur是固定自带的。
         loop
         dbms_output.put_line(cur.ename);
         end loop;
    end;
/
备注:以上讲的均是静态游标,动态游标请闭注后尽博文!


<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23359176/viewspace-1116216/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-02-18