游标是一个对象,能够提供行级的sql语句控制。PL/SQL用游标来管理sql的select语句,游标是为处理这些语句而分配的一大块内存。
一.游标的基本操作
1.声明游标
包括两部分:游标名称和这个游标所用到的sql语句:
Cursor 游标名称 is 查询语句(select语句);
❤声明游标的这段代码是不执行的,不能将debug时的断点设在这一行上,也不能用if...end if语句来声明两个同名的游标。
实例:
Cursor employer is
Select ename ,job ,sal ,deptno
From emp
Order by sal;
2.打开游标
要使用一个已经声明的游标,必须先打开它,语法:
Open 游标名称;
当打开一个游标时,和该游标相关的sql语句就会传递到oracle平台上,并执行。
实例:
Open employer ;
3.提取数据
使用fetch语句从游标中取出数据,该语句每次返回一行数据;每次取数据时,pl/sql都将指向通过游标查询要返回行的下一行数据。语法:
Fetch 游标名称
Into {变量1[,变量2,......]}
实例:
Fetch employer into Hunter;
将游标employer中的数据存入记录型变量Hunter中
❤注意:
·对游标第一次执行fetch语句时,它将工作区中的第一条记录赋值给变量,并使工作区内的指针指向下一条记录。这样,如果在一个循环内反复使用fetch语句,就可以检查工作区的每一条记录。
·工作区的游标指针只能向下移动,不能回退。如果查询完第二条记录后又想返回到第一条记录,必须关闭游标在重新打开。
·在使用fetch语句前,必须先打开游标,这样才能保证工作区内有数据。
·into子句中的变量个数、顺序和类型必须与工作区中没行记录的字段数、顺序以及数据类型一一对应。
4.关闭游标
使用完游标后要关闭游标,以便释放游标所占用的资源,语法:
Close 游标名称;
实例:
Close employer ;
二.游标属性
游标有四个属性,他们的语法格式为:
游标名[属性名]
❤游标名和属性名之间没有空格
属性 | 返回值 | 说明 |
ISOPEN | TRUE/FALSE | 指出游标是否关闭 |
FOUND | TRUE/FALSE | 指出是否发现一条记录 |
NOTFOUND | TRUE/FALSE | 指出是否没有发现一条记录 |
ROWCOUNT | NUMBER | 每次提取记录的序列数(第一,第二,第三,...) |
实例:
关闭游标:if (bookA%isopen) then
closebookA;
end if;
从游标book_list中读取数据到记录bookA中:
...
Loop
Fetch book_list into bookA;
...
Exit when book_list%notfound;
End Loop;
❤只有在游标第一次取回数据时,%found和%notfound才会返回一个有效值。在打开游标和第一次取回数据这两个操作期间这两个属性的值为空。
三.参数化游标和隐式游标
1.参数化游标
参数化游标是需要参数的游标,当声明时,它可以声明一个或者多个游标参数,在运行pl/sql程序用它来定义游标的记录选择标准。
语法:
cursor 游标名称(字段1 [in]数据类型{:=|default} 初始化),…
[return返回值类型] is 查询语句(select 语句);
❤当打开参数化游标是,为其传递参数;
返回类型可有可无,可以是用户定义记录、数据库表记录类型或独立的变量;
Select子句中定义的列必须与用于接收返回值的参数一一对应。
2.隐式游标
在使用隐式游标时,用户无需进行声明、打开及关闭,只要简单地编码select语句并让pl/sql根据需要处理游标即可。
与循环结构结合的显示游标处理返回多于一行的select语句,与循环结合的游标将允许用户每次处理一行,当。
当select语句预计只返回一行时,适于采用隐式游标。
❤注意
·每个隐式游标必须有个一关键字inot
·和显式游标一样,带有关键字into接收数据的变量时数据类型要与表列的一致
·隐式游标一次仅返回一行,使用时必须检查异常。
四.游标变量
在所有的pl/sql中对游标的访问都是通过游标变量实现的,它总是特殊的数据类型refcursor。
1. 创建
方法一,将变量声明为refcursor类型的变量;方法二,使用游标声明语法:
游标变量名 cursor [(参数)] is select 查询语句 ;
实例:
Declare
Curs1refcursor;
Curs2cursor is select * from emp;
Cres3cursor(empNo number(4)) is select * from emp where empno=empNo;
2. 打开
3中形式的open语句
下面前两种open形式,游标未打开,最后一种形式是游标已经打开
·openfor select
语法:open 未绑定的游标变量 for select查询语句;
实例:opencurs1 is select * from emp ;
·open for execute
语法:open 未绑定的游标变量 is execute select 查询语句;
实例:open curs1 is execute select * from emp;
·open一个绑定的查询
语法:open 绑定的游标变量 [(参数值)]
实例:opencurs1;open curs2(’8705’);
3. 使用
游标打开之后就可以使用了;操作游标可以发生在函数里,用户可以从函数中返回一个refcursor数值,然后让调用者操作该游标,语法:
Fetch 游标变量 into 目标;
Fetch从游标中检索下一行到目标中。目标可以是一行变量,一个记录变量,护着一个用逗号分隔的普通变量的列表。
实例:
Fetch curs1 into aaa;
Fetch curs2 into ggg,fff;
4. 关闭
当游标变量不使用时就将其关闭,以释放它所占用的资源;若要使用,可以在下一次使用时将其打开,语法:
Close 游标变量;
--the end--