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子句。