<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->
游标是一个对象,能够提供行级的 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
close bookA;
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
Curs1 refcursor;
Curs2 cursor is select * from emp;
Cres3 cursor(empNo number(4)) is select * from emp where empno=empNo;
2. 打开
3 中形式的 open 语句
下面前两种 open 形式,游标未打开,最后一种形式是游标已经打开
· open for select
语法: open 未绑定的游标变量 for select 查询语句;
实例: open curs1 is select * from emp ;
· open for execute
语法: open 未绑定的游标变量 is execute select 查询语句;
实例: open curs1 is execute select * from emp;
· open 一个绑定的查询
语法: open 绑定的游标变量 [( 参数值 )]
实例: open curs1 ; open curs2 ( ’8705’ ) ;
3. 使用
游标打开之后就可以使用了;操作游标可以发生在函数里,用户可以从函数中返回一个 refcursor 数值,然后让调用者操作该游标,语法:
Fetch 游标变量 into 目标;
Fetch 从游标中检索下一行到目标中。目标可以是一行变量,一个记录变量,护着一个用逗号分隔的普通变量的列表。
实例:
Fetch curs1 into aaa ;
Fetch curs2 into ggg , fff ;
4. 关闭
当游标变量不使用时就将其关闭,以释放它所占用的资源;若要使用,可以在下一次使用时将其打开,语法:
Close 游标变量;
--the end--