#静态游标指的是程序执行的时候不需要再去解析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 查询语句返回结果集;
④获取记录,操作记录;
语法:Fetch 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.