首页 > 代码库 > Oracle 游标的使用

Oracle 游标的使用

1.什么是游标?

答:游标是系统给用户开设的一个数据缓冲区,存放SQL语句的执行结果,

  每个游标都有一个一个名字,用户可以用SQL语句从游标中提取数据,然后赋给变量。

2.游标分类

  答:游标分为隐式游标(游标属性)、显示游标(游标技巧)和REF游标(游标变量);

3.隐式游标如何使用?

  答:使用DML时自动创建隐式游标,它是自动声明、自动打开、自动关闭的,名字为SQL.

    属性有:%found,%notfound,%rowcount,%isopen.

    

4.如何使用显式游标?

    答:显式游标在PL/SQL块中声明部分定义查询,该查询可以返回一行或多行记录。

      使用显式游标分为四步:

      (1)、声明游标

        declare 

          cursor mycursor is

          select ename,sal from emp where deptno=10;

          v_name emp.ename*type;

          v_sal emp.sal%type;

        begin

      (2)、打开游标

        open mycursor ;

      (3)、使用游标

        loop

        fetch mycursor into v_name,v_sal ;

        exit when mycursor%notfound;

        dbms_output.put_line(v_name||‘->‘||v_sal);

        end loop;

      (4)、关闭游标

        close mycursor;

    end;

5、使用带参数的显式游标。

  declare cursor emp_cursor(dno number) is

    select ename,sal from emp

    where deptno=dno

    emp_record emp_cursor%rowtype;

  begin

    IF not emp_cursor%isopen then

    open emp_cursor(20);

    END IF;

  loop

    fetch emp_cursor into emp_record

    exit when emp_cursor%notfound

    dbms_output.put_line(emp_record.ename||‘->‘||emp_record.sal);

  end loop;

  close emp_cursor;

  end;

 

6、循环游标(不用打开和关闭游标但需要声明一个与游标相同类型的游标变量)

  declare cursor emp_cursor(dno number) is

    select ename,sal from emp

    where deptno=dno;

    emp_record emp_cursor%rowtype;

  begin

   for emp_record in emp_cursor(10) loop

    dbms_output.putline(v_name||‘->‘||v_sal);

    end loop;

  end;

7、使用游标更新行

  declare

    cursor emp_cursor is

      select ename,sal,deptno from emp for update;--锁定emp表,执行完后不提交或者回滚将会把当前表锁定

    emp_record emp_cursor%rowtype;

    begin

      if not emp_cursor%isopen then

        open emp_cursor;

      end if;

    loop

      fetch emp_cursor into emp_record;

      exit when emp_cursor%notfound;

      if emp_record.deptno = 30 then

        update emp set sal=sal+100 where current of emp_cursor;

      end if;

     dbms_output.put_line(emp_record.sal);

    end loop;

    close emp_cursor;

  end;

 

8、ref游标(游标变量)

  declare

    type my_type is ref cursor;

    cv my_type;

    --cv sys_refcursor;

    v_lastname employee.ename%type;

    query_2 varchar2(200):=‘select * from dept‘;

    v_emp emp%rowtype;

    v_dept dept%rowtype;

  begin

    open cv for

      select ename from emp

      where job=‘MANAGER‘

      order by ename;

    loop

      fetch cv into v_lastname;

      exit when cv%notfound;

      dbms_output.put_line(v_lastname);

    end loop;

    dbms_output.put_line(‘----------------‘);

    open cv for query_2;

    loop

      fetch cv into v_dept;

      exit when cv%notfound;

      dbms_output.put_line(v_dept.dname);

    end loop;

    close cv;

  end;

Oracle 游标的使用