游标

<!-- [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 用游标来管理 sqlselect 语句,游标是为处理这些语句而分配的一大块内存。

一.游标的基本操作

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 curs1open curs2’8705’;

3. 使用

游标打开之后就可以使用了;操作游标可以发生在函数里,用户可以从函数中返回一个 refcursor 数值,然后让调用者操作该游标,语法:

Fetch 游标变量 into 目标;

Fetch 从游标中检索下一行到目标中。目标可以是一行变量,一个记录变量,护着一个用逗号分隔的普通变量的列表。

实例:

Fetch curs1 into aaa

Fetch curs2 into gggfff

4. 关闭

当游标变量不使用时就将其关闭,以释放它所占用的资源;若要使用,可以在下一次使用时将其打开,语法:

Close 游标变量;

--the end--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值