『ORACLE』 PLSQL动态游标的使用(11g)

#静态游标指的是程序执行的时候不需要再去解析sql语言,对于sql语句的解析在编译的时候就可以完成的。

动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。

从这个角度来说,静态游标的效率也比动态游标更高一些。

#游标的相关概念:

  定义:

   游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里

  存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中

  的指针 来提取游标中的数据,然后来进行操作。

  实质:

   是用户在远程客户端上对服务器内存区域的操作,由数据库为用户提供这样的

  一个指针,使得用户能够去检索服务器内存区的数据。

#游标具有的属性:

1、%ISOPEN(确定游标是否已经打开 true or false)

2、%FOUND(返回是否从结果集提取到了数据 true or false)

3、%NOTFOUND(返回是否从结果集没有提取到数据 true or false)

4、%ROWCOUNT(返回到当前为止已经提取到的实际行数)

#游标分类

一、静态游标

1、隐式游标:

      对于select..into...语句,一次只能从数据库中获取到一条数据,对于这种类型的DML SQL语句,就是隐式cursor

      select update/insert/delete操作

2、显示游标:

      由程序员定义和管理,对于从数据库中提取多行数据,就需要使用显式cursor

      1)定义游标---cursor  [cursor name]  is

      2)打开游标---open    [cursor name]

      3)操作数据---fetch    [cursor name]

      4)关闭游标---close    [cursor name]

二、REF游标

1、REF 游标:动态关联结果集的临时对象。即在运行的时候动态决定执行查询。
2、REF 游标作用:实现在程序间传递结果集的功能,利用REF CURSOR也可以实现BULK SQL,从而提高SQL性能。
3、静态游标和REF 游标的区别:

①静态游标是静态定义,REF 游标是动态关联;
②使用REF 游标需REF 游标变量。
③REF 游标能做为参数进行传递,而静态游标是不可能的。

4、REF 游标变量:是一种引用REF游标类型的变量,指向动态关联的结果集。
5、怎么使用REF游标:
①声明REF 游标类型,确定REF 游标类型;
⑴强类型REF游标:指定retrun type,REF 游标变量的类型必须和return type一致。
语法:Type   REF游标名   IS   Ref Cursor Return  结果集返回记录类型;
⑵弱类型REF游标:不指定return type,能和任何类型的CURSOR变量匹配,用于获取任何结果集。
语法:Type   REF游标名   IS   Ref Cursor;
②声明Ref 游标类型变量;
语法:变量名  已声明Ref 游标类型;
③打开REF游标,关联结果集 ;
语法:Open  Ref 游标类型变量 For 查询语句返回结果集;
④获取记录,操作记录;
语法:Fatch  REF游标名 InTo 临时记录类型变量或属性类型变量列表;
⑤关闭游标,完全释放资源;
语法:Close  REF游标名;

例:

SQL> declare
2 type emp_cursor is ref cursor;
3 my_cursor emp_cursor;
4 v_ename emp.ename%type;
5 v_sal emp.sal%type;
6 v_deptno dept.deptno%type := &p_deptno;
7 v_dname dept.dname%type;
8 begin
9 select dname into v_dname from dept where deptno = v_deptno;
10 dbms_output.put_line('Department:' || v_dname);
11 open my_cursor for
12 select ename, sal from emp where deptno = v_deptno;
13 loop
14 fetch my_cursor
15 into v_ename, v_sal;
16 exit when my_cursor%notfound;
17 dbms_output.put_line('--name:' || v_ename || 'salary:' || v_sal);
18 end loop;
19 close my_cursor;
20 end;
21 /
Enter value for p_deptno: 30
old 6: v_deptno dept.deptno%type := &p_deptno;
new 6: v_deptno dept.deptno%type := 30;
Department:SALES
--name:ALLENsalary:1600
--name:WARDsalary:1250
--name:MARTINsalary:1250
--name:BLAKEsalary:2850
--name:TURNERsalary:1500
--name:JAMESsalary:950

PL/SQL procedure successfully completed.

posted @ 2017-05-14 22:01  九號栈長  阅读(3213)  评论(0编辑  收藏  举报