CURRENT OF子句

用户可以在DELETE或者UPDATE语句中使用CURRENT OF <游标名>来指向从一个命名游标FETCH后游标指向的元组。游标必须已经打开并且定位到一个元组。如果游标没有打开或者还没有执行FETCH,那么使用CURRENT OF子句将产生错误,并且不处理任何元组。

当声明UPDATE或者DELETE语句中的CURRENT OF子句指向的游标时,FOR UPDATE OF子句是可选的。如果必要的话,CURRENT OF子句会使预处理器加入一个FOR UPDATE子句。

在下面的例子中,用户使用CURRENT OF子句指向在游标cur_emp上执行FETCH后游标指向的元组。

EXEC SQL DECLARE cur_emp CURSOR FOR

SELECT empname, grade FROM employee

WHERE city = '杭州'

FOR UPDATE OF grade;

EXEC SQL OPEN cur_emp;

EXEC SQL WHENEVER NOT FOUND GOTO …;

For ( ; ; ) {

EXEC SQL FETCH cur_emp INTO :hname, :hgrade;

EXEC SQL UPDATE employee SET grade = :hnewgrade

WHERE CURRENT OF cur_emp;

}

不能把CURRENT OF子句用在按照索引组织的表上。

FOR UPDATE OF子句和隐含的FOR UPDATE子句需要获取排他行锁。所有的行在游标OPEN的时候加锁,而不是在它们被FETCH的时候。锁的释放在执行COMMIT或者ROLLBACK操作的时候。因此,在COMMIT之后,用户不能FETCH一个FOR UPDATE游标。如果用户视图这么做,系统将返回错误。

另外,用户也不能和宿主数组变量一起使用CURRENT OF子句。

用户不能在使用FOR UPDATE OF子句的语句中引用多个表,也就是不能和CURRENT OF子句一起使用连接操作。

最后,用户不能在动态SQL语句中使用CURRENT OF子句。