更新子句
可选的 FOR UPDATE 子句用于标识在后续定位的 UPDATE 语句的赋值子句中可以作为目标出现的列。
更新子句
每个列名必须是非限定性的,且必须标识在fullselect的第一个 FROM 子句中指定的表或视图的列。 如果fullselect的结果表是只读的,则不能指定该子句。
如果 FOR UPDATE 子句中指定了列名列表 ,且扩展指示器未启用, 则列名必须为可更新列。
子句中,如果没有指定列名列表,则隐式列名列表由表或视图中的所有可更新列组成,该表或视图在第一个 FOR UPDATE 子句中未指定列名列表 ,则隐式列名列表由全选查询的第一个 FROM 子句中标识的表或视图的所有可更新列。
如果动态准备的select语句不包含FOR UPDATE子句,则与select语句关联的游标不能在定位UPDATE语句中引用。
如果静态准备的SELECT语句不包含FOR UPDATE子句,且其结果表不是只读的,则会产生一个隐式UPDATE子句。 隐式列名列表确定如下:- 如果启用扩展指示符,则包括在fullselect的第一个FROM子句中标识的表或视图的所有列。
- 否则,将包括在完整选择的第一FROM子句中标识的表或视图的所有可更新列。

如果在准备程序时指定了STDSQL(YES)或NOFOR SQL处理选项,则定位UPDATE语句中引用的游标的声明无需包含 UPDATE 子句,前提是在准备程序时指定了STDSQL(YES)或NOFOR SQL处理选项。 更多信息,请参阅列的已定位更新。
当 FOR UPDATE 使用FETCH操作时,当光标指向U或X锁时,而不是S锁时,会获取光标:
- 该语句的隔离级别为游标稳定性。
- 语句的隔离级别为可重复读取或读取稳定性,且RRULOCK子系统参数设置为YES。
- 语句的隔离级别是可重复读取或读取稳定性,并且SQL语句中指定了“使用并保留排他性锁”或“使用并保留更新锁”,在获取时分别获取X锁或U锁。
已声明的临时表不会添加锁定。 有关U型锁和S型锁的讨论,请参阅锁具模式和锁具兼容性。
注意
参考更新后的列:
如果游标使用FETCH语句来检索稍后要更新的列,则在选择列时指定FOR UPDATE OF。 然后在后续的UPDATE或DELETE语句中指定WHERE CURRENT OF。 这些条款阻止了 Db2 通过正在更新的列的索引进行选择访问,否则可能会导致 Db2 多次读取同一行。更多信息,请参阅更新之前检索的数据。

