代码之家  ›  专栏  ›  技术社区  ›  tangens

如何在Oracle上使用“for update”和join?

  •  1
  • tangens  · 技术社区  · 14 年前

    这个 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:无法从视图中选择更新

    我是否需要修改查询,或者是否需要使用Oracle来实现这一点? 使用MySQL,语句可以正常工作。

    2 回复  |  直到 14 年前
        1
  •  4
  •   davek    14 年前

    尝试:

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

    编辑 :考虑到你链接到的问题(该问题要求如何免除 IN ,但如果您的联接返回一个受限集,则仍然可以提供好处。但是,没有解决方法:Oracle异常是非常简单的;Oracle不知道要锁定哪些行,因为 DISTINCT .你也可以把 独特的 或者定义视图中的所有内容,然后在不使用显式锁的情况下更新: http://www.dba-oracle.com/t_ora_02014_cannot_select_for_update.htm

        2
  •  0
  •   Alex Poole    14 年前

    它可能取决于您想要更新什么。你可以做到 ... FOR UPDATE OF o.attrib1 告诉它,您只对从主表更新数据感兴趣,这可能是事实;这意味着它只会尝试锁定该表,而不担心联接中的隐式视图。(并且您仍然可以更新该表中的多个列,命名一个列仍然会锁定整行-不过,如果您指定要在 FOR UPDATE OF 条款)。

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