数据库存储过程游标异常处理
oracle学习笔记(五)之游标
1.游标:指定私有SQL内存区的引用,这段内存区保存了SQL语句的执行结果。
在PL/SQL程序块中,在不使用游标的情况下,Select语句只能返回一条记录。
Oracle数据库中执行的每个SQL语句都有对应单独的游标。
游标提供了访问SELECT语句执行结果的途径。两种类型:
—隐式游标:所有的DML语句和PL/SQL SELECT语句都有
—显式游标:由开发人员声明和控制。
2.显式游标的使用
用于暂存查询取出的多行结果。
按行处理查询返回的多行结果。
在PL/SQL块中通过循环手动控制游标。
可将游标作为函数的返回值(少见)、也可作为存储过程的传出参数。可实现将查询结果集传给调用环境。
显式游标属性:
%ISOPEN?? Boolean类型? 游标打开返回true
%NOTFOUND Boolean类型? 如果最近抓取没有获得记录,返回true
%FOUND??? Boolean类型? 如果最近抓取获得记录,返回true
%ROWCOUNT Number类型?? 返回到目前为止获取的记录条数。
3.控制显式游标
fetch会抓取当前行的记录,并将记录指针下移一行。
declare(创建一个命名的内存区—游标)→OPEN(打开游标)→FETCH(取当前记录装入变量)→
EMPTY(检测游标中是否还有记录,如果找到记录,继续取记录,否则释放游标)→CLOSE
4.声明游标
语法:
CURSOR cursor_name IS
select_statement;
在游标声明中,SELECT子句不要包含INTO子句,可以选出多行,或者0行。一旦在select子句中使用了into子句
则select子句必须选出一行,且只能选出一行。
5.打开游标=执行查询和取出结果集 OPEN cursor_name
不论查询有无返回记录,都不会引起异常。
5.1从游标中获取数据
打开游标之后,可以多次fetch游标中当前行的数据。
fetch cursor_name into variable1,variable2...
变量个数应该与游标字段个数相同,字段顺序一一对应,类型要匹配。
建议在into后使用record类型变量。
每次抓取操作后,通过使用游标属性测试游标状态,判断游标是否包含更多额记录行。
6.关闭游标
在对查询到的所有记录的处理完成后,关闭游标。
CLOSE cursor_name;
一旦游标关闭,不能再抓取数据了。如果需要,必须重新打开游标。
7.控制多行提取
使用循环从一个显示游标中取出多行数据
每次重复,取出一行数据。
通过使用%NOTFOUND属性,判断上一次的抓取操作是否成功取得数据。
也可以通过%FOUND属性来控制循环抓取操作。
8.带参数的游标
可以在声明游标时指定参数。
一旦在声明游标时指定了参数,就可以在select查询中使用参数。
打开带参数的游标
open cursor_name(parametername);
9.游标for循环
简化了显式游标的控制过程
通过相应的语法隐式的声明record变量、打开、执行抓取操作和关闭游标。
不用声明record类型变量,Oracle会隐式声明。
优点:
无需显式打开游标
无需声明record变量,for循环会自动隐式定义record变量
无需使用fetch抓取数据
循环结束,无需使用close来关闭游标。
10.where current of子句
可以使用游标更新或删除当前行
在游标的查询定义中包含FRO UPDATE子句来锁定行,用作修改。
SELECT...FROM...FOR UPDATE [of column-reference][NOWAIT]
NOWAIT指:当试图修改的记录已经被其他线程加锁,则直接返回,放弃修改。
通过使用where current of子句,从显式的游标中提取当前行。
11.游标引用
游标引用是一种自定义类型,可以作为函数返回值类型、存储过程的参数类型
定义游标引用类型:TYPE xxx_cursor_type IS REF OF CURSOR
定义了游标引用类型后就可以使用它来定义变量。
处理游标引用变量
初始化游标引用变量,初始化后游标引用变量既可以作为返回值,也可作为传出参数。
在java程序中采用如下代码来注册游标引用类型:
registerOutParameter(index,OracleTypes.CURSOR);
如果需要在PL/SQL程序中处理游标数据,则使用游标即可;如果希望把游标作为整体传出PL/SQL程序,则使用游标引用