当声明更新游标时,您可以通过包含 OF 关键字和列的列表将更新操作限制在特定的列。您只可以修改随后 UPDATE 语句中的那些命名的列。列不需要在 SELECT 子句的选择列表中。
EXEC SQL declare name_curs cursor for select * from customer_notansi for update of fname, lname;
缺省情况下,除非声明为 FOR READ ONLY ,否则在兼容 ANSI 的数据库中的 Select 游标是一个更新游标,因此 FOR UPDATE 关键字是可选的。但是,如果希望更新游标只能够修改表中的一些列,则必须在 FOR UPDATE OF column 列表中指定这些列。
如果打算更新的列是用于处理 SELECT 语句的索引的一部分,则数据库服务器会保留一个列表,其中列有每个更新的行,从而确保没有任何行被更新两次。如果 OF 关键字指定了可以更新的列,则数据库服务器便会确定是否要保留更新行的列表。如果数据库服务器确定保留该列表的工作已不再需要,则性能随之提高。如果不使用 OF column 列表,数据库服务器通常会维护一个更新行的列表,尽管此列表可能并不需要。
下面的示例包含将更新游标同 DELETE 语句使用删除当前行的 GBase 8s ESQL/C 代码。
EXEC SQL declare q_curs cursor for select * from customer where lname matches :last_name for update; EXEC SQL open q_curs; for (;;) { EXEC SQL fetch q_curs into :cust_rec; if (strncmp(SQLSTATE, "00", 2) != 0) break; /* Display customer values and prompt for answer */ printf("\n%s %s", cust_rec.fname, cust_rec.lname); printf("\nDelete this customer? "); scanf("%s", answer); if (answer[0] == 'y') EXEC SQL delete from customer where current of q_curs; if (strncmp(SQLSTATE, "00", 2) != 0) break; } printf("\n"); EXEC SQL close q_curs;