使用WHERE CURRENT OF 子句(ESQL/C、SPL)

使用 WHERE CURRENT OF 子句来更新 FOR UPDATE 声明了的游标的当前行,或更新 Collection 游标的当前元素。

在此,不可指定游标名称做为主变量。

当前行是最近获取的行。由于 UPDATE 语句不会将游标前进到下一行,因此通过此操作不更改在游标的活动集合内当前行的位置。

对于 GBase 8s 的表层级,您不可使用此子句,如果您正在仅从表层级中一个表选择的话。也就是说,如果您使用 ONLY 关键字,则您不可使用此选项。

在 ESQL/C 例程中,要包括 WHERE CURRENT OF 关键字,您必须提前已经使用了 DECLARE 语句来定义带有 FOR UPDATE 选项的游标。如果创建了该游标的 DECLARE 语句指定了 FOR UPDATE 中的一个或多个列,则限制您仅可更新随后的 UPDATE ... WHERE CURRENT OF 语句中的那些行。在 DECLARE 语句的 FOR UPDATE 子句中指定列的优势在于速度。如果在 DECLARE 语句中指定列,数据库服务器通常可更快地执行更新。

在 SPL 例程中,您可在 UPDATE 语句中的 WHERE CURRENT OF 关键字之后指定游标,仅当您在 SPL 的 FOREACH 语句中声明了 cursor_id。您不可在 SPL 例程中使用 DECLARE 语句来声明动态游标的名称,以及将那个游标与 PREPARE 语句已在同一 SPL 例程中声明了的准备好的对象的语句标识符相关联。

Note: Update 游标可执行以 UPDATE 语句不可能执行的更新。
下列 GBase 8s ESQL/C 示例说明 WHERE 子句的 CURRENT OF 形式。在此示例中,在收到 10% 折扣的客户的范围内(假设将新列 discount 添加到 customer 表)执行更新。在 WHILE 循环的外部准备 UPDATE 语句来确保仅执行一次解析。
char answer [1] = 'y';
EXEC SQL BEGIN DECLARE SECTION;
   char fname[32],lname[32];
   int low,high;
EXEC SQL END DECLARE SECTION;
main()
{
   EXEC SQL connect to 'stores_demo';
   EXEC SQL prepare sel_stmt from
      'select fname, lname from customer 
       where cust_num between ? and ? for update';
EXEC SQL declare x cursor for sel_stmt;
   printf("\nEnter lower limit customer number: ");
   scanf("%d", &low);
   printf("\nEnter upper limit customer number: ");
   scanf("%d", &high);
   EXEC SQL open x using :low, :high;
   EXEC SQL prepare u from
      'update customer set discount = 0.1  where current of x';
   while (1)
      {
      EXEC SQL fetch x into :fname, :lname;
       if ( SQLCODE == SQLNOTFOUND) break;
       }
   printf("\nUpdate %.10s %.10s (y/n)?", fname, lname);
   if (answer = getch() == 'y')
      EXEC SQL execute u;
   EXEC SQL close x;
}