plsql基础学习--八、游标
游标(cursor)概述:1.作用:逐行处理查询结果,以编程的方式访问数据2.类型:隐式游标(在plsql程序中执行DML SQL语句时,自动创建隐式游标)、显式游标(用于处理返回多行的查询)、ref游标(用于处理运行时才能确定的动态sql查询的结果)3.定义:是一个指向上下文区的句柄或指针,可以用来控制上下文区和处理语句在上下文区会发生的事情(一)隐式游标说明:1...
游标(cursor)概述:
1.作用:逐行处理查询结果,以编程的方式访问数据
2.类型:隐式游标(在plsql程序中执行DML SQL语句时,自动创建隐式游标)、
显式游标(用于处理返回多行的查询)、
ref游标(用于处理运行时才能确定的动态sql查询的结果)
3.定义:是一个指向上下文区的句柄或指针,可以用来控制上下文区和处理语句在上下文区会发生的事情
(一)隐式游标
说明:
1.在PL/SQL中使用DML语句时,自动创建隐式游标
2.隐式游标自动声明、打开和关闭,其名为SQL
3.通过检查隐式游标的属性可以获得最近执行的DML语句的信息
4.隐式游标的属性有:
%FOUND---SQL语句影响了一行或多行时为TRUE
%NOTFOUND---SQL语句没有影响任何行时为TRUE
%ROWCOUNT---SQL语句影响的行数
%ISOPEN---游标是否打开,始终为FALSE
(1)%NOTFOUND的使用
(2)%FOUND的使用
(3)%ROWCOUNT的使用
(二)显式游标
1)基本用法:使用(用cursor .. is标明):
1.声明游标:cursor .. is select
2.打开游标:open
3.结果集控制:fetch .. into ..
4.关闭游标:close
2)带参数的显式游标:
1.声明显式游标时可以带参数以提高灵活性
2.声明带参数的显式游标的语法如下:
cursor <cursor_name>(<param_name> <param_type>)
is select_statement;
3)使用显式游标更新行
1.允许使用游标删除或更新活动集中的行
2.声明游标时必须使用select ... for update语句
CURSOR <cursor_name> IS
SELECT statement FOR UPDATE;
更新:
UPDATE <table_name>
SET <set_clause>
WHERE CURRENT OF <cursor_name>;
删除:
DELETE FROM <table_name>
WHERE CURRENT OF <cursor_name>;
将所有部门编号大于50的部门删掉
(三)ref游标
1)循环游标
1.循环游标用于简化游标处理代码
2.当用户需要从游标中提取所有记录时使用
3.循环游标的语法如下:
FOR <record_index> IN <cursor_name>
LOOP
<executable statements>
END LOOP;
查询各部门员工工资详情,及工资总额
2)ref游标
1.ref游标和游标变量用于处理运行时动态执行的sql查询
2.创建游标变量需要两个步骤:
声明ref游标类型;声明ref游标类型的变量
3.语法:
TYPE <ref_cursor_name> IS REF CURSOR
[RETURN <return_type>]
打开游标变量的语法:
OPEN cursor_name FOR select_statement;
a.声明强类型的ref游标(指定了返回类型)
TYPE my_curtype IS REF CURSOR
RETURN stud_det%ROWTYPE;
order_cur my_curtype;
b.声明弱类型的ref游标(没有指定返回类型)
TYPE my_ctype IS REF CURSOR;
stud_cur my_ctype;
3)游标变量的优点和限制:
1.游标变量的功能强大,可以简化数据处理
2.优点:
(1)可从不同的select语句中提取结果集
(2)可以作为过程的参数进行传递
(3)可以引用游标的所有属性
可以进行赋值运算
3.限制:
(1)不能在程序包中声明游标变量
(2)for update自居不能与游标变量一起使用
(3)不能使用比较运算符
4)使用游标变量执行动态SQL
1.可以使用游标变量执行动态构造的SQL语句
2.打开执行动态SQL的游标变量
OPEN cursor_name FOR dynamic_sqlstring
[USING bind_argument_list]
使用bulk collect into替代into(批量从游标中取值)
5)cursor与ref cursor区别
从技术底层看,两者是相同的。普通plsql cursor在定义时是“静态”的,而ref cursor可以动态打开
1.ref cursor根据逻辑动态打开,而游标cursor定义好了就无法修改了
2.ref cursor可以返回给客户端,cursor则不行
3.cursor可以是全局的global,ref cursor则必须定义在过程或函数中
4.ref cursor可以在子程序间传递,cursor则不行
5.cursor中定义的静态sql比ref cursor效率高,所以ref cursor通常用在:向客户端返回结果集
更多推荐
所有评论(0)