打开 Select 游标
当您打开以 SELECT… FOR UPDATE 语法创建的 Select 游标或更新游标时,将 SELECT 语句以 USING 子句中指定的任何值传递到数据库服务器。数据库服务器处理该查询到定位或构造活动集 合的第一行的点。下列示例展示 GBase 8s ESQL/C 中的简单 OPEN 语句:
EXEC SQL declare s_curs cursor for select * from orders; EXEC SQL open s_curs;
SPL 例程不可引用 OPEN 语句中的更新游标。
在事务内部打开 Update 游标
如果您正在带有显式事务的数据库中工作,则必须在事务内打开更新游标。如果您使用 WITH HOLD 选项声明了该游标,则放弃此要求。
打开 Function 游标
当您打开 Function 游标时,随同在 USING 子句中指定的任何值,将 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句传递到数据库服务器。
将 USING 子句中的值作为参数传递给用户定义的函数。必须声明此用户定义的函数来接受值。 (如果先前准备了该语句,则在准备的时候将该语句传递给数据库服务器。)数据库服务器执行该 函数来指出它返回第一个值集的位置。
下列示例展示 GBase 8s ESQL/C 中的一个简单的 OPEN 语句:
EXEC SQL declare s_curs cursor for execute function new_func(arg1,arg2) into :ret_val1, :ret_val2; EXEC SQL open s_curs;
重新打开 Select 或 Function 游标
仅当数据库服务器打开 Select 游标或 Function 游标时,它才计算在 OPEN 语句的 USING 子句 中指定的值。在打开游标时,在 USING 子句中对程序变量的后续更改不更改游标的活动集合。
在符合 ANSI 的数据库中,如果您试图打开一已打开的游标,则会收到错误代码。
在不符合 ANSI 的数据库中,后续的 OPEN 语句关闭该游标,然后重新打开它。当数据库服务器 重新打开游标时,它基于 USING 子句中变量的当前值创建新的活动集合。如果自从先前的 OPEN
语句以来这些变量已经更改,则重新打开该游标可生成一完全不同的活动集合。
即使这些变量的值未改变,在下列情况下,该活动集合中的值也可不同:
⚫ 如果用户定义的函数采用了与在 Function 游标上的先前的 OPEN 语句不同的执行路径
⚫ 自从 Select 游标上的先前的 OPEN 语句以来,如果表中的数据更改了
当数据库服务器打开 Select 或 Function 游标时,它可动态地处理大多数查询,无需预先取回所有 行。因此,如果其他用户在同一时间正在修改该用表正在处理的表,则活动集合可能反映这些活动 的结果。
对于一些查询,当数据库服务器打开该游标时,它计算整个活动集合。这些查询包括具有下列特性 的那些:
⚫ 要求排序的查询:那些带有 ORDER BY 子句或带有 DISTINCT 或 UNIQUE 关键字的
⚫ 要求散列的查询:那些带有结合或带有 GROUP BY 子句的
对于这些查询,在游标正在处理时其他用户对该表的任何更改都不反映在活动集合中。




