连同列的列表使用 FOR UPDATE

当声明更新游标时,您可以通过包含 OF 关键字和列的列表将更新操作限制在特定的列。您只可以修改随后 UPDATE 语句中的那些命名的列。列不需要在 SELECT 子句的选择列表中。

下一个示例声明了一个更新游标,并指定该游标只可以更新 customer_notansi 表中的 fnamelname 列:
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 语句满足以下条件时性能得到增强:

如果打算更新的列是用于处理 SELECT 语句的索引的一部分,则数据库服务器会保留一个列表,其中列有每个更新的行,从而确保没有任何行被更新两次。如果 OF 关键字指定了可以更新的列,则数据库服务器便会确定是否要保留更新行的列表。如果数据库服务器确定保留该列表的工作已不再需要,则性能随之提高。如果不使用 OF column 列表,数据库服务器通常会维护一个更新行的列表,尽管此列表可能并不需要。

下面的示例包含将更新游标同 DELETE 语句使用删除当前行的 GBase 8s ESQL/C 代码。

每当删除行时,游标仍处于行之间。在删除数据之后,必须在可以引用 DELETE 或 UPDATE 语句中的游标之前使用 FETCH 语句将游标推进到下一行。
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;