南大通用GBase8s 常用SQL语句(225)

FOR UPDATE 子句
当您打算更新由准备好的 SELECT 语句返回的值,当存取这些值时,请在 ESQL/C 应用中和在 DB-Access 中使用 FOR UPDATE 子句。
准备包含 FRO UPDATE 子句的 SELECT 语句,等同于准备不带有 FOR UPDATE 子句的 SELECT 语句,然后为准备好的语句声明 FOR UPDATE 游标。
FOR UPDATE 子句
在这里插入图片描述

元素 描述 限制 语法
column 在 FETCH 之后可被更新的列的名称 必须在 FROM 子句 table 中存在,但不需要在 Projection 列表中。所有的列必须都来自同一表。 标识符
FOR UPDATE 关键字通知数据库服务器可能会有更新,导致它使用比随同 Select 游标更严格的锁。不带有此子句,您不可通过游标修改数据。您可指定哪些列可被更新。
在您为 SELECT . . . FOR UPDATE 语句声明游标之后,您可使用带有 WHERE CURRENT OF 子句的 UPDATE 或 DELETE 语句更新或删除当前选择了的行。关键字 CURRENT OF 引用最近存取了的行;它们替代在 WHERE 子句中的通常的条件表达式。要以特定的值更新行,您的程序可能包含诸如下列示例中的语句:
EXEC SQL BEGIN DECLARE SECTION;
char fname[ 16];
char lname[ 16];
EXEC SQL END DECLARE SECTION;
. . .

EXEC SQL connect to ‘stores_demo’;
/* select statement being prepared contains a for update clause */
EXEC SQL prepare x from ‘select fname, lname from customer for update’;
EXEC SQL declare xc cursor for x;

for (;😉
{
EXEC SQL fetch xc into $fname, $lname;
if (strncmp(SQLSTATE, ‘00’, 2) != 0) break;
printf(“%d %s %s\n”,cnum, fname, lname );
if (cnum == 999) --update rows with 999 customer_num
EXEC SQL update customer set fname = ‘rosey’ where current of xc;
}

EXEC SQL close xc;
EXEC SQL disconnect current;
SELECT . . . FOR UPDATE 语句,像 Update 游标一样,允许您执行那些单独使用 UPDATE 语句不可能执行的更新,因为对更新的决定以及新的数据项的值都可基于该行的原始内容。UPDATE 语句不可查询正在被更新的表。
注: 在游标的 FETCH 循环内部的正常的更新不可确保在 UPDATE 之后再次存取更新了的行。WHERE CURRENT OF 规范将 UPDATE 联系到 Update 游标,并确保每一行仅更新一次,通过在内部保持一个已被更新了的行的列表。这些行将不被 Update 游标再次存取。
与 FOR UPDATE 子句不兼容的语法
包括 FOR UPDATE 子句的 SELECT 语句必须符合下列限制:
该语句可仅从一个表选择数据。
该语句不可包括任何聚集函数。
该语句不可包括任何下列子句或关键字:DISTINCT、EXCEPT、FOR READ ONLY、GROUP BY、INTO TEMP、INTERSECT、INTO EXTERNAL、MINUS、ORDER BY、UNION、UNIQUE。
将游标与该语句关联的 DECLARE 语句还不可包括 FOR UPDATE 关键字。
该语句仅在 ESQL/C 例程中和(在事务之内)在 DB-Access 实用程序中是有效的。例如,不可在 SPL 例程之内发出它。
要获取关于如何为一不包括 FOR UPDATE 子句的 SELECT 语句声明 update 游标的信息,请参阅 使用 FOR UPDATE 选项。
在 SPL 例程中更新游标
您不可在 SPL 的 FOREACH 语句的 SELECT . . . INTO 段中包括 FOR UPDATE 关键字。然而,SPL 例程可提供 FOR UPDATE 游标的功能
通过在 FOREACH 语句中声明 cursor 名称,
然后使用 UPDATE 或 DELETE 语句中的 WHERE CURRENT OF cursor 子句,对同一 FOREACH 循环之内的那个 cursor 的当前行进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值