我在PLSQL Block中有以下FOR LOOP。我想使用FOR UPDATE子句来锁定相应的行。但运行代码会产生以下异常:
ORA-02014:无法从DISTINCT,GROUP BY等视图中选择FOR UPDATE
我查了一下,但说实话,我不明白这些解释,所以我暂时无法解决。
FOR l_rec IN (SELECT *
FROM (SELECT *
FROM my_table
WHERE status = 'NEW'
ORDER BY key_id)
WHERE ROWNUM <= i_max
FOR UPDATE)
LOOP
-- do work...
UPDATE my_table SET status = 'FINISHED' WHERE key_id = l_rec.key_id;
有人可以全面解释这里发生的事情并知道如何解决这个问题吗?
EDIR:忘记提及,my_table不是视图,它只是一个普通的表。
答案 0 :(得分:2)
你得到的错误可能有几个原因。第一个已经由Oracle显示。
1)您不能将FOR UPDATE
用于包含DISTINCT,GROUP BY等的观看次数。因此,请确保您的表my_table
不是这样的观点。
2)考虑到您的表my_table
不是视图,那么当您在FOR LOOP
中使用它时,您尝试创建内联视图,因此在这种情况下Oracle也拒绝锁定行。解决方法如下:
这里我修改了查询,以便它使用表来创建内联视图。
FOR l_rec IN ( SELECT *
FROM my_table
WHERE key_id IN ( SELECT key_id
FROM my_table
WHERE status = 'NEW'
ORDER BY key_id)
AND ROWNUM <= i_max
FOR UPDATE )
LOOP
<Do you work>