SELECT .. FOR UPDATE给出错误“无法从DISTINCT,GROUP BY等视图中选择FOR UPDATE”

时间:2017-09-29 09:46:35

标签: oracle plsql

我在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不是视图,它只是一个普通的表。

1 个答案:

答案 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>