DECLARE CURSOR 语句
DECLARE CURSOR 语句用于定义游标。
调用 DECLARE CURSOR
此语句只能嵌入在应用程序中。 这不是一个可执行语句。 Java™中不能指定。
授权 DECLARE CURSOR
对于游标SELECT语句中确定的每个表或视图,权限集必须至少包含以下一项:
- SELECT权限
- 对象的所有权
- DBADM 对应数据库(仅限表格)的权限
- SYSADM 权限
- SYSCTRL权限(仅限目录表)
- DATAACCESS 权限
如果 select语句包含SQL数据更改语句,则该语句的授权要求也适用于DECLARE CURSOR语句。
游标的 SELECT 语句为以下之一:
- 由语句名称标识的已准备好的选择语句
- 指定的选择语句
如果声明名称已指定:
- 特权集由动态规则的行为(运行、绑定、定义或调用)决定,并在表1 中进行了总结。 (如需了解这些行为的更多信息,包括确定这些行为的DYNAMICRULES绑定选项值列表,请参阅授权ID和动态SQL。)
- 在准备SELECT语句时,会执行授权检查。
- 除非成功准备SELECT语句,否则无法打开光标。
如果指定了select语句:
- 特权集由计划或套餐所有者的授权ID所持有的特权组成。
- 如果计划或包与 VALIDATE(BIND) 绑定,则在绑定时执行授权检查,如果所需的权限不存在,则绑定不成功。
- 如果计划或包与 VALIDATE(RUN) 绑定,则在绑定时执行授权检查,但此时不需要所有必需的权限。 如果在绑定时所有权限都存在,则光标打开时不会进行授权检查。 如果在绑定时不存在任何特权,则在第一次打开工作单元中的光标时执行授权检查。 如果所需的权限不存在,则OPEN操作将失败。
语法 DECLARE CURSOR
可容纳性:
可退货:
行集定位:
描述 DECLARE CURSOR
- 光标名称
- 命名光标。 名称不得与源程序中已声明的游标同名。 名称通常为VARCHAR(128);然而,如果游标定义为WITH RETURN,则名称限制为VARCHAR(30)。
- 无滚动或滚动
- 指定光标是否可以滚动。
- 无需滚动
- 指定光标不可滚动。 这是缺省值。
- SCROLL
- 指定光标可滚动。 对于可滚动光标,光标对插入、更新或删除的敏感度取决于光标所使用的敏感度选项。 如果未指定灵敏度选项,则默认值为“ASENSITIVE”。
- ASENSITIVE
- 指定光标应尽可能灵敏。 这是缺省值。
定义为“灵敏”的光标将要么不灵敏,要么动态灵敏;它不会静态灵敏。 有关如何使用GET DIAGNOSTICS语句或SQLCA将光标的有效灵敏度返回到应用程序的信息,请参阅 OPEN语句。
光标的灵敏度是选择访问路径的一个因素。 请明确说明您需要的灵敏度级别,而不是使用“ASENSITIVE”(无灵敏度)。
- INSENSITIVE
- 指定光标对结果表下方行的插入、更新或删除操作不敏感。 因此,结果表的大小、行的顺序以及每行的值在打开游标后都保持不变。 此外,光标为只读。 SELECT语句或PREPARE语句的属性字符串不能包含FOR UPDATE子句,光标不能用于定位更新或删除。
- SENSITIVE
- 指定光标对结果表具体化后数据库所做的更改具有敏感性。 光标始终对使用光标进行的更新和删除(即使用同一光标定位更新和删除)敏感。 当某行的当前值不再满足选择语句或语句名称时,该行将不再通过光标显示。 当从基础表中删除结果表中的一行时,通过光标将无法再看到该行。
如果 Db2 无法使光标看到更改,则在绑定OPEN CURSOR时会出现错误。 Db2 当光标隐式变为只读时,无法使光标可见的更改。 例如,当结果表必须具体化时,如SELECT语句的FROM子句包含多个表或视图。 当前导致隐式只读光标的条件列表可在只读光标中找到。
默认值为“动态”。
- 动态
- 指定游标的查询结果表是动态的,这意味着当基础表中插入或删除行时,查询结果表的大小可能会发生变化,行的顺序也可能发生变化。 与光标执行相同的语句插入、删除或更新的行,光标可以立即看到。 由其他应用程序进程执行的语句插入、删除或更新的行,只有在提交语句后才能看到。 如果通过游标或流程外的任何方式更新了ORDER BY子句的列,则FETCH语句的下一个行为就像更新后的行被删除并重新插入到结果表的正确位置一样。 在定位更新时,光标位于原始位置的下一行之前,且当前没有行,因此该行看起来像是移动了。
如果无法使用敏感动态光标,则返回错误。 例如,如果需要临时表,则会返回错误。 定义为“敏感动态”的游标的 SELECT 语句不能包含 SQL 数据更改语句。
对于敏感的动态游标,最外层的fullselect不能指定 offset子句和 fetch子句。
- 静态
- 指定光标打开后结果表的大小和行顺序不变。 插入基础表的行不会添加到结果表中,无论插入方式如何。 如果更新了已实现的行中的 ORDER BY 子句中的列,则结果表中的行不会移动。 如果结果表可以更新,则允许定位更新和删除。 定义为“敏感静态”的游标的 SELECT 语句不能包含 SQL 数据更改语句。
静态光标可以看到该光标通过定位更新或删除所做的更改。 使用FETCH语句的SENSITIVE选项,可以查看光标外所做的更改。 FETCH SENSITIVE可能会导致结果表出现一个洞 (即结果表与其基础表之间的差异)。 如果游标基础表中的更新行不再满足其SELECT语句的谓词,则结果表中会出现更新漏洞。 如果在基础表中删除了一行光标,结果表中就会出现一个删除洞。 当“敏感抓取”检测到更新漏洞时,不会返回任何数据(会发出警告),光标会停留在更新漏洞上。 当“敏感抓取”检测到删除孔时,不会返回任何数据(会发出警告),光标会停留在删除孔上。
通过光标进行更新会导致自动重新获取该行。 这种重新获取意味着更新本身可能会造成漏洞。 重新获取的行也反映了由于触发器更新同一行而发生的变化。 重要的是要反映这些变化,以保持行中数据的一致性。
在select语句的WHERE子句中使用非确定性函数(内置或用户定义)或敏感静态游标的语句名称可能会导致误导性结果。 出现这种情况是因为 Db2 构建了一个临时结果表,并为FETCH INSENSITIVE语句从该表中检索行。 当 Db2 处理FETCH SENSITIVE语句时,将从基础表中提取行并重新评估谓词。 使用非确定性函数可能会导致同一行中每个FETCH SENSITIVE产生不同的结果,这可能会导致该行不再被视为匹配。
敏感静态滚动光标上的“不敏感”FETCH对光标外部的更改不敏感,除非之前的“敏感”FETCH已经刷新了该行;然而,使用光标定位的更新和删除更改是可见的。
静态光标对插入不敏感。
- 无暂停或暂停
- 指定是否应阻止光标因提交操作而关闭。
- WITHOUT HOLD
- 不会阻止游标因落实操作而关闭。 这是缺省值。
- WITH HOLD
- 防止游标因落实操作而关闭。 如果满足以下条件之一,则在提交时关闭使用 WITH HOLD 声明的游标:
- 与光标相关的连接处于发布待定状态。
- 绑定选项“断开(自动)”已启用。
- 在环境中,忽略“保留”选项。
当指定了“WITH HOLD”时,提交操作将提交当前工作单元中的所有更改。 例如,在光标不可滚动的情况下,在提交操作后,需要先执行FETCH语句,将光标定位到提交操作前光标所在行的下一行。
HOLD对SELECT语句中的SQL数据更改语句没有影响。 当提交(COMMIT)命令发出时,SQL数据更改语句所导致的更改将被提交,无论游标是否声明为“保持”(HOLD)。
所有游标都会通过连接(类型1)或回滚操作隐式关闭。 如果忽略或未指定 WITH HOLD,提交操作也会隐式关闭光标。
在 CICS® 或 IMS 非消息驱动程序中,如果光标是在上一个工作单元中打开的,且当前工作单元中的数据库没有发生任何更改,则使用“保持”声明的光标不会因回滚操作而关闭。 无法关闭光标,因为 CICS 和 IMS 不会将回滚请求广播给 Db2 ,以处理无效的工作单元。
如果在提交操作前关闭光标,效果与不带 WITH HOLD 选项时相同。
在 IMS 消息驱动程序(MPP、IFP和消息驱动BMP)中,HOLD被忽略。 WITH HOLD 功能可在 CICS 伪对话程序中保持光标位置,直到任务结束(EOT)。
有关使用 WITH HOLD 声明游标的限制的详细信息,请参阅 “已锁定和非锁定游标 ”。
- WITHOUT RETURN 或者 WITH RETURN
- 指定游标的输出表是否用作存储过程返回的结果集。 如果指定了语句名称 ,则默认值为语句的对应准备属性。 否则,默认值为 WITHOUT RETURN。
- WITHOUT RETURN
- 指定游标的查询结果表不打算用作将从过程返回的结果集。
- WITH RETURN
- 指定游标的结果表将用作存储过程返回的结果集。 只有在存储过程的源代码中包含DECLARE CURSOR语句时,WITH RETURN才有效。 在其他情况下,预编译器可能会接受该条款,但该条款无效。
当使用 WITH RETURN TO CALLER 子句声明的游标在程序或例程结束时保持打开状态时,该游标定义了程序或例程的结果集。 使用CLOSE语句关闭游标,游标并非程序或例程的结果集。 虽然 Db2 会自动关闭任何未使用WITH RETURN子句声明的游标,但建议使用CLOSE语句来提高应用程序的可移植性。
对于不可滚动的游标,结果集包括从当前游标位置到结果表末尾的所有行。 对于可滚动光标,结果集由结果表的所有行组成。
- TO CALLER
- 指定光标可以将结果集返回给过程调用方。 调用者是执行SQL CALL语句的程序或例程,该语句调用包含DECLARE CURSOR语句的过程。 例如,如果调用者是一个过程,则结果集将返回给该过程。 如果调用方是客户端应用程序,则结果集将返回给客户端应用程序。
如果语句包含在过程的源代码中,则 WITH RETURN TO CALLER 指定游标可用作结果集游标。 当要从存储过程返回游标的查询结果表时,可以使用结果集游标。 指定“呼叫者”是可选的。
在其他情况下,该条款会被忽略,光标不能用作结果集光标。
- TO CLIENT
- 指定光标可以将结果集返回给客户端应用程序。 任何中间嵌套过程都看不到这个光标。 如果函数或触发器调用过程(直接或间接),则结果集无法返回给客户端,游标将在过程结束后关闭。
- 排定位置
- 指定在游标的单个FETCH语句中,是否可以将多行数据作为行集进行访问。 默认值为“无行集定位”。
- 无行距定位
- 指定光标只能用于行定位的FETCH语句。 游标将在每个FETCH语句中返回一行,且不能在此游标的FETCH语句中指定 FOR n ROWS子句。 无行集定位或单行访问是指从数据库引擎中获取数据的方式。 对于远程访问,数据可能会被阻止,并以块的形式返回给客户端。
- 行位置
- 指定光标可用于行定位或行集定位FETCH语句。 该游标可用于通过FETCH语句返回单行或多行(作为行集)。 行集定位是指从数据库引擎中获取数据的方式。 对于远程访问,如果有符合条件的行,则至少返回1行作为行集。 行集的大小取决于FETCH语句中指定的行数和符合条件的行数。 数据可能会被封锁,并以区块的形式返回给客户。
Db2 REXX应用程序不支持声明为“WITH ROWSET POSITIONING”的游标。 为了使 Db2 REXX应用程序中的SELECT语句的游标能够与行定位或行集定位FETCH语句一起使用,请在SELECT语句的PREPARE语句的属性字符串中指定WITH ROWSET POSITIONING。
- select-statement
- 指定游标的显示结果表。 参见 select语句以了解 select语句的解释。
选择语句不能包含参数标记(REXX除外),但可以包含对宿主变量的引用。 在REXX以外的其他主机语言中,主机变量的声明必须在源程序中的DECLARE CURSOR语句之前。 在REXX中,必须使用参数标记代替主机变量,并且必须准备好语句。
OPEN语句的USING子句可用于指定主机变量,这些变量将覆盖DECLARE CURSOR语句中作为语句的一部分指定的主机变量或参数标记的值。
如果游标被定义为“敏感动态”或“敏感静态”,则选择语句中不能包含SQL数据更改语句。
select语句中不能包含一个以VALUES子句为前缀的全select语句。
滚动光标select语句的外部选择列表不能是数组值。
- statement-name
- 标识准备好的选择语句 ,该语句在游标打开时指定游标的结果表。 声明名称不能与源程序中其他DECLARE CURSOR语句中指定的声明名称相同。 有关预编译 SELECT 语句的说明,请参阅 PREPARE 语句。
如果游标被定义为“敏感动态”或“敏感静态”,则准备好的选择语句不得包含SQL数据更改语句。
备注 DECLARE CURSOR
光标处于打开状态时,表示结果表以及相对于该表行的位置。 该表是游标SELECT语句指定的结果表。
- 只读光标:
- 如果结果表是只读的 ,则光标也是只读的。 使用而不是触发器的引用视图的光标是只读的,因为不允许使用这些光标进行定位UPDATE和定位DELETE语句。 如果光标的select语句符合以下一个或多个条件,则结果表为只读状态 :
- 第一个FROM子句标识或包含以下任何内容:
- 多个表或视图
- 没有可更新列的目录表
- 只读视图
- 嵌套表表达式
- 表函数
- 系统维护的实体化查询表
- 一个系统周期临时表,使用SYSTEM_TIME的周期说明
- 在视图定义的外部全选(fullselect)的FROM子句中,直接或间接引用系统周期时间表的单一视图,并使用SYSTEM_TIME的周期说明
- 第一个SELECT子句指定了关键字DISTINCT,包含一个聚合函数,或同时使用了这两个功能
- 它包含一个SQL数据更改语句
- 外部子选择包含一个GROUP BY子句、一个HAVING子句或两个子句
- 它包含一个子查询,使得外部子选择和子查询的基础对象是同一个表
- 以下任何运营商或条款均被指定:
- 集合运算符
- ORDER BY子句(光标被声明为SENSITIVE STATIC可滚动时除外)
- A FOR READ ONLY 条款
- 它以隔离级别UR执行,且未指定FOR UPDATE子句。
- 这是一个VALUES条款。
如果结果表不是只读的,则可以使用光标更新或删除结果表中的基础行。
- 第一个FROM子句标识或包含以下任何内容:
参考更新后的列:
如果游标使用FETCH语句来检索稍后更新的列,则在选择列时指定FOR UPDATE OF。 然后在后续的UPDATE或DELETE语句中指定WHERE CURRENT OF。 这些条款阻止了 Db2 通过更新列的索引进行访问,否则可能导致 Db2 多次读取同一行。更多信息,请参阅更新之前检索的数据。

- 对行或列访问控制实行限制的表格:
- 游标的select语句可以引用一个表,对该表的行或列访问进行控制。 行或列访问控制不影响光标是否为只读状态,也不影响光标的灵敏度。
- 静态滚动光标的工作文件数据库要求:
- 要使用静态可滚动光标,您必须首先创建一个工作文件数据库,并至少在该数据库中创建一个 32KB 页面大小的表空间,因为静态可滚动光标在打开时需要一个临时表作为其结果表。 Db2 选择临时结果表的表空间。 动态可滚动光标不需要声明临时表。
对于包含空字符串的静态可滚动光标声明, Db2 会在临时表空间中为每个空字符串分配一个字节。 以下示例显示了一个带有空字符串的可滚动光标声明:
EXEC SQL DECLARE CSROWSTAT SENSITIVE STATIC SCROLL CURSOR WITH ROWSET POSITIONING WITH HOLD FOR SELECT ID1,'' FROM TB; - COBOL 和 Fortran 程序中的光标:
- 在 COBOL 和 Fortran 源程序中,DECLARE CURSOR 语句必须位于所有显式引用游标名称的语句之前。 这条规则不一定适用于其他主机语言,因为预编译器为这些语言提供了双通道选项。 如果未使用双遍选项,则此规则适用于其他主机语言。
- REXX中的游标:
- 如果在REXX程序中的DECLARE CURSOR语句中使用宿主变量,则DECLARE CURSOR语句必须是PREPARE和EXECUTE的对象。
- 光标范围:
- 游标名称的范围是指定义它的源程序,即提交给预编译器的应用程序。 因此,您只能通过预先编译的带有游标声明的语句来引用游标。 例如,从另一个程序调用的 COBOL 程序无法使用调用程序打开的光标。 此外,在 Fortran 子程序中定义的光标只能在该子程序中被引用。 在存储过程中指定 WITH RETURN 且未关闭的游标将作为结果集返回。虽然游标的范围是声明它的程序,但由该程序创建的每个包(或计划的DBRM)都包含游标的单独实例,并且可以在同一程序执行中使用多个游标实例。 例如,假设一个程序使用CONNECT(2)选项进行了预编译,其DBRM用于在X位置创建一个包,在Y位置创建一个包。 该程序包含以下SQL语句:
DECLARE C CURSOR FOR ... CONNECT TO X OPEN C FETCH C INTO ... CONNECT TO Y OPEN C FETCH C INTO ...第二个OPEN C语句不会导致错误,因为它引用的是游标C的不同实例。 如果包裹属于不同的收藏,则同一概念适用于单个地点。
SELECT语句在光标打开时进行评估。 如果同一个光标被打开、关闭,然后再打开,结果可能会有所不同。 如果游标的 SELECT 语句包含 CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP,则每次 FETCH 操作中,对这些特殊寄存器的所有引用都将产生相同的日期时间值。 当光标打开时,价值确定。 可以使用同一个SELECT语句同时打开多个光标。 它们各自被视为独立的活动。
- 数据封锁:
- 为了更有效地处理数据, Db2 可能会阻止只读游标的访问。 如果游标不用于已定位的UPDATE或已定位的DELETE语句,请将游标定义为只读。
- 删除和隔离级别UR:
- 如果您想使用光标进行定位删除,并且由于绑定选项而隔离级别为UR,请指定FOR UPDATE。 在这种情况下,隔离等级为CS。
- 从存储过程返回结果集:
- 当以下所有条件都满足时,在存储过程中声明的游标将返回结果集:
- 光标使用 WITH RETURN 选项进行声明。 在分布式环境中,光标数据每个结果集的块与CALL语句的回复一起返回。
- 退出存储过程后,光标保持打开状态。 使用 SCROLL 选项声明的游标在退出存储过程之前必须保留在第一行之前。
- 如果存储过程定义为返回时提交,则使用“保留”选项声明光标。
结果集是退出存储过程后光标当前位置之后的所有行。 结果集被假定为只读。 如果再次调用相同的程序,数据库管理系统会自动关闭指定站点上存储过程的打开结果集游标。
- 用户自定义函数指定的可滚动光标:
- 使用可滚动光标,一行内容可以多次获取。 因此,如果滚动光标在光标选择列表中定义的函数不是确定性的,则一行可能会被多次获取,每次获取的结果都不同。 (然而,当光标打开时,可滚动光标中WHERE子句中不确定函数的值会被捕获,并在光标关闭前保持不变。) 同样,如果使用带有外部动作的用户定义函数定义可滚动光标,则每次获取时都会执行该动作。
- 多个使用“返回客户端”定义的游标实例:
如果游标是在本机 SQL 程序中声明的,则即使同名游标处于打开状态,也可以打开声明为 WITH RETURN TO CLIENT 的游标。 在这种情况下,已经打开的光标将成为结果集光标,无法再通过光标名称访问。 一个新的光标打开,可通过光标名称访问。 当发出CLOSE语句时,光标的最后一个实例将被关闭。 关闭新游标不会使先前可通过该名称访问的游标再次可通过该游标名称访问。 以这种方式成为结果集游标的游标无法在服务器上访问,只能在客户端处理。
例子 DECLARE CURSOR
以下示例中的语句假定位于 PL/I 程序中。
- 示例 1
- 声明 C1 为查询光标,用于从表DSN8C10.DEPT 中检索数据。 查询本身出现在DECLARE CURSOR语句中。
EXEC SQL DECLARE C1 CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM DSN8C10.DEPT WHERE ADMRDEPT = 'A00'; - 示例 2
- 声明 C1 为查询光标,用于从表 DSN8810.DEPT 中检索数据。 假设稍后将通过搜索更新数据,并且在查询执行时应该锁定数据。 查询本身出现在DECLARE CURSOR语句中。
EXEC SQL DECLARE C1 CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM DSN8C10.DEPT WHERE ADMRDEPT = 'A00' FOR READ ONLY WITH RS USE AND KEEP EXCLUSIVE LOCKS; - 示例 3
- 声明 C2 为名为 STMT2 的语句的游标。
EXEC SQL DECLARE C2 CURSOR FOR STMT2; - 示例 4
- 声明 C3® 为光标,用于查询 DSN8C10.EMP表中定位更新的内容。 允许在不关闭光标的情况下不时提交已完成的更新。
您可以使用不带列名的 FOR UPDATE 子句来更新所有可更新的列,而不必指定要更新的列。EXEC SQL DECLARE C3 CURSOR WITH HOLD FOR SELECT * FROM DSN8C10.EMP FOR UPDATE OF WORKDEPT, PHONENO, JOB, EDLEVEL, SALARY; - 示例 5
- 在存储过程 SP1 中,将 C4 声明为表DSN8C10.PROJ 的查询游标。 使光标能够将结果集返回给 SP1 的调用者,后者在返回时执行提交操作。
EXEC SQL DECLARE C4 CURSOR WITH HOLD WITH RETURN FOR SELECT PROJNO, PROJNAME FROM DSN8C10.PROJ WHERE DEPTNO = 'A01'; - 示例 6
- 在以下示例中,DECLARE CURSOR语句将游标名称 C5 与SELECT的结果相关联,并指定游标可滚动。 C5 允许定位更新和删除,因为结果表可以更新。
EXEC SQL DECLARE C5 SENSITIVE STATIC SCROLL CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM DSN8C10.DEPT WHERE ADMRDEPT = 'A00'; - 示例 7
- 在以下示例中,DECLARE CURSOR语句将游标名称 C6 与SELECT的结果相关联,并指定游标可滚动。
EXEC SQL DECLARE C6 INSENSITIVE SCROLL CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM DSN8C10.DEPT WHERE DEPTNO; - 示例 8
- 以下示例说明了应用程序如何使用动态可滚动光标:首先创建并填充一个表格。
通过插入或加载约500行来填充表格。CREATE TABLE ORDER (ORDERNUM INTEGER, CUSTNUM INTEGER, CUSTNAME VARCHAR(20), ORDERDATE CHAR(8), ORDERAMT DECIMAL(8,3), COMMENTS VARCHAR(20));
打开可滚动光标。EXEC SQL DECLARE CURSOR ORDERSCROLL SENSITIVE DYNAMIC SCROLL FOR SELECT ORDERNUM, CUSTNAME, ORDERAMT, ORDERDATE FROM ORDER WHERE ORDERAMT > 1000 FOR UPDATE OF COMMENTS;
从可滚动光标向前抓取。OPEN CURSOR ORDERSCROLL;
从可滚动光标中获取相对值。-- Loop-to-fill-screen -- do 10 times FETCH FROM ORDERSCROLL INTO :HV1, :HV2, :HV3, :HV4; -- end-- Skip-forward-100-rows FETCH RELATIVE +100 FROM ORDERSCROLL INTO :HV1, :HV2, :HV3, :HV4;
从可滚动光标中获取ABSOLUTE。-- Skip-backward-50-rows FETCH RELATIVE -50 FROM ORDERSCROLL INTO :HV1, :HV2, :HV3, :HV4;
从可滚动光标中获取相对值。-- Re-read-the-third-row FETCH ABSOLUTE +3 FROM ORDERSCROLL INTO :HV1, :HV2, :HV3, :HV4;
通过可滚动光标进行定位更新。-- Read-the-third-row-from current position FETCH SENSITIVE RELATIVE +3 FROM ORDERSCROLL INTO :HV1, :HV2, :HV3, :HV4;
关闭可滚动光标。-- Update-the-current-row UPDATE ORDER SET COMMENTS = "Expedite" WHERE CURRENT OF ORDERSCROLL;CLOSE CURSOR ORDERSCROLL; - 示例 9
- 声明 C1 为查询光标,用于从表Dept中检索行集。 准备好的语句是MYCURSOR。
EXEC SQL DECLARE C1 CURSOR WITH ROWSET POSITIONING FOR MYCURSOR;
