包括带集合派生的表子句的 SELECT 语句的集合游标提供了对集合变量中的元素的访问。
要选择多个元素: 1. 在 GBase 8s ESQL/C 程序中创建一个客户端集合变量。 2. 使用 DECLARE 语句为 SELECT 语句声明集合游标。 3. 要修改集合变量的元素,可使用 FOR UPDATE 关键字将选择游标声明为一个更新游标。然 后您可以使用 DELETE 和 UPDATE 语句的 WHERE CURRENT OF 子句删除或更新集合的元 素。
4. 使用 OPEN 语句打开此游标。 5. 使用 FETCH 语句和 INTO 子句从集合游标取得元素。 6. 如果需要,则对取得的数据执行任何更新或删除,并将修改的集合变量保存集合列中。
一旦集合变量包含正确的元素,即可使用 UPDATE 或 INSERT 语句将集合变量的内容保存 在实际的集合列(SET 、MULTISET 或 LIST)。 7. 使用 CLOSE 语句关闭此集合游标。
此 DECLARE 语句为一个集合变量声明一个 Select 游标:
EXEC SQL BEGIN DECLARE SECTION; client collection set(integer not null) a_set; EXEC SQL END DECLARE SECTION; ... EXEC SQL declare set_curs cursor for select * from table(:a_set);
有关对于 SELECT 语句使用集合游标的扩展的代码示例,请参阅 从集合游标访存
使用集合派生表插入
要为集合变量声明 Insert 游标,应将集合派生的表这一段同与集合游标相关联的 INSERT 语句包 括在一起。一个 Insert 游标允许您从集合变量选择一个或多个元素。(有关对 INSERT 语句和使 用的描述,请参阅 INSERT 语句。)
该 Insert 游标必须是一个顺序游标。即,DECLARE 语句不能指定 SCROLL 关键字。
当您为集合变量声明 Insert 游标,INSERT 语句的集合派生表子句必须包含集合变量的名称。您不 能为此集合变量指定一个输入参数(问号(?))。但是,可以在 INSERT 语句的 VALUES 子句 中使用输入参数。该参数指示集合元素稍后将由 PUT 语句的 FROM 子句提供。
包括 INSERT 语句和集合派生表子句的集合游标允许您将多个元素插入一个集合变量。
要插入多个元素: 1. 在 GBase 8s ESQL/C 程序中创建一个客户端集合变量。 2. 使用 DECLARE 语句为 INSERT 语句声明集合游标。 3. 使用 OPEN 语句打开游标。 4. 使用 PUT 语句和 FROM 子句将元素放入集合游标。 5. 一旦集合变量包含所有元素,即可对表名称使用 UPDATE 语句或 INSERT 语句将集合变 量的内容保存在集合列(SET 、MULTISET 或 LIST)。 6. 使用 CLOSE 语句关闭此集合游标。
此示例为 a_set 集合变量声明了一个 Insert 游标:
EXEC SQL BEGIN DECLARE SECTION; client collection multiset(smallint not null) a_mset; int an_element; EXEC SQL END DECLARE SECTION; ... EXEC SQL declare mset_curs cursor for insert into table(:a_mset) values (?); EXEC SQL open mset_curs; while (1) { ... EXEC SQL put mset_curs from :an_element; ... }
要将元素插入集合变量,可使用 FROM 子句的 PUT 语句。有关对 INSERT 语句使用集合游标的 代码示例,请参阅插入到 Collection 游标内。
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 407
使用带事务的游标
要回滚修改,必须在事务内执行修改。只有当执行 BEGIN WORK 语句时,不兼容 ANSI 的数据 库中的事务才会开始。
在兼容 ANSI 的数据库中,事务始终有效。
数据库服务器对选择和更新游标强制这些准则以确保可以正常地提交或回滚修改:
⚫ 在事务内打开一个插入或更新游标。
⚫ 在一个事务内包含 PUT 和 FLUSH 语句。
⚫ 在一个事务内修改数据(更新、插入或删除)。
数据库服务器让您打开和关闭保持游标以便在事务之外执行更新操作;但是,应当先取得所有与给 定修改有关的行,然后在一个单独的事务中执行所有的修改。您无法在事务之外打开和关闭保持游 标或更新游标。
以下示例在事务内使用一个更新游标:
EXEC SQL declare q_curs cursor for select customer_num, fname, lname from customer where lname matches :last_name for update; EXEC SQL open q_curs; EXEC SQL begin work; EXEC SQL fetch q_curs into :cust_rec; /* fetch after begin */ EXEC SQL update customer set lname = 'Smith' where current of q_curs; /* no error */ EXEC SQL commit work;
当更新事务内的行时,该行保持为锁定状态,直到游标被关闭或者是事务被提交或回滚。如果在没 有任何事务是有效的时候对行进行更新,则在将修改的行写到磁盘时会释放该行锁定。如果在事务 之外更新或删除行,则无法回滚该操作。
在使用事务的数据库中,您无法在事务之外打开一个插入游标,除非也使用 WITH HOLD 关键字 声明了该插入游标。




