如何在Oracle上使用JOIN使用“FOR UPDATE”?

时间:2010-04-06 15:19:23

标签: sql oracle ora-02014

另一个问题的answer是使用此SQL查询:

SELECT o.Id, o.attrib1, o.attrib2 
  FROM table1 o
  JOIN (SELECT DISTINCT Id 
          FROM table1, table2, table3 
         WHERE ...) T1 ON o.id = T1.Id

现在我想知道如何将此语句与关键字FOR UPDATE一起使用。如果我只是将其附加到查询中,Oracle会告诉我:

  

ORA-02014:无法从视图中选择FOR UPDATE

我是否必须修改查询或者是否有使用Oracle执行此操作的技巧? 使用MySql,语句可以正常工作。

2 个答案:

答案 0 :(得分:4)

尝试:

select ..... 
from <choose your table>
where id in (<your join query here>) for UPDATE;

编辑:这可能看起来有点违反直觉,考虑到您所关联的问题(询问如何免除IN),但如果你的话可能仍然有益处join返回一个受限制的集合。但是,没有解决方法:oracle异常非常明显;由于DISTINCT,oracle不知道要锁定哪些行。您可以省略DISTINCT或定义视图中的所有内容,然后根据需要更新,而不显式锁定:http://www.dba-oracle.com/t_ora_02014_cannot_select_for_update.htm

答案 1 :(得分:0)

这可能取决于您想要更新的内容。你可以做 ... FOR UPDATE OF o.attrib1 告诉它你只对从主表更新数据感兴趣,这似乎是这种情况;这意味着它只会尝试锁定该表,而不用担心连接中的隐式视图。 (并且您仍然可以更新该表中的多个列,命名一个仍然会锁定整行 - 但如果您在FOR UPDATE OF子句中指定要更新的所有列,则会更清楚。)

不知道这是否适用于MySQL,这让我们回到Mark Byers的观点。