3、显式游标。
1)、声明显式游标:
CURSOR cursor_name [([parameter,....)]--参数列表
[Return return_specification]------可选的Return子句
IS Select_statement -----任意有效的SQL Select语句
[For Update [OF [column_list]]];
如:不带参数的游标:Cursor company_cur is Select Company_id from Company;
带参数的游标:Cursor name_cur (company_id_in In Number)
Is
Select name from company Where company_id = company_id_in;
带有Return子句的游标:Cursor emp_cur Return employees%ROWTYPE---Return子句返回的类型都是%ROWTYPE类型的记录类型或者是自定义的记录类型
Is
Select * from employees where department_id=10;
游标不能赋值,只能Open、Fetch、Close语句中通过名字来引用显式游标。
在包中声明游标:
Package book_info
Is
Cursor books_cur(title_filter_in In books.title%TYPE)
return books%ROWTYPE;
End
Package body book_info
Is
Cursor books_cur(title_filter_in In books.title%TYPE)
return books%ROWTYPE
Is
Select * from books where title like title_filter_in;
End;
建议多把游标定义在包内,两个好处,隐藏游标的实现信息,而是最小化重编译,修改只需要修改包体部分,对于包头部分就不需要更改。
2)、打开显式游标:
Open cursor_name[(argument ...]
如果试图打开一个已经打开过的游标会抛异常,通常可以通过cursor_name%Name来判断是否已经打开,在进行打开操作:
if not company_cur%ISOPEN
Then
Open company_cur;
End;
3)、从显式游标中提取数据:
Fetch cursor_name into record_or_variable_list;
cursor_name游标名称,record_or_variable_list一个数据结构,用于把游标中的每条数据取出来暂时储存的变量。
例子:
Declare
Cursor company_cur Is Select ...;
company_rec company%ROWTYPE;---定义一个游标变量,用于接收游标取出来的值
Begin
Open company_cur;
Fetch company_cur into company_rec;
End;
如果取出来的数据超过了最后一行,Fetch操作也不会抛异常,也不能通过游标变量来判断是否是最后一行, 可以通过%FOUND和%NOTFOUND属性来判断是否是最后一行数据。
4)、显式游标中的列别名:
在Select语句中,有时候像求和(Sum)等函数的时候,不过不给这个列起个别名,在游标中这一列是没有办法使用的,也就是说,在游标的Select语句中,每一列都应该有一个列明。
如:select sum(inv_ant) total_sales from ......
5)、关闭显式游标:
Close cursor_name,
注意:游标打开了,如果没有关闭,就会出现内存泄露的问题,一般在程序块中,在程序结束的时候,PL/SQL会检查打开的游标,并会隐式的关闭这些游标,但是,不是所有的游标都会关闭掉,并且会损耗很多性能,特别注意的是,如果一个游标是定义在包内,一旦在某个程序块中打开了这个游标,如果不关闭,这个游标会一直处于打开状态,当然试图关闭一个已经关闭的游标也会抛出异常。
6)、显式游标属性:

7)、游标参数:
显式游标是可以带参数的,这样可以让游标使用起来比较灵活,不过游标的参数都是In类型的参数,不像过程那样有out和In out函数,因为游标根本就不需要有那样的输出参数,游标传入的参数,可以放在Where后作为查询条件,也可以放在Select后,作为单独的一列,在Open 游标的时候,给游标传入不同值的参数,就会获取到不同的数据,举个例子:
Cursor emp_cur(emp_id_in number :=0)----参数可以有缺省值,如果打开时没传入参数,就用缺省值。也可以不用定义缺省值。
Is
select employee_id ,emp_name,emp_id_in from employee where employ_id=emp_id_in;
Open emp_cur(1001);---打开游标并传入参数
Open emp_cur---打开游标,使用默认的参数。
浙公网安备 33010602011771号