plsql基础学习--八、游标

游标(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通常用在:向客户端返回结果集

猜你喜欢

转载自blog.csdn.net/u010999809/article/details/85108540