Oracle SQL:UPDATE,但抛出错误'如果条件不符合

时间:2016-02-11 22:28:37

标签: sql oracle sql-update

很抱歉,如果这是一个骗局 - 我搜索了类似的问题,但它们似乎都是条件更新,你可以使用CASE语句将列设置为多个值中的一个。

我有一个SQL UPDATE语句,但有两个原因让我不希望它更新:

  1. 找不到该项(导致rowsUpdated为0)
  2. 如果符合条件
  3. 我想以某种方式区分这两种状态,这就是为什么我不能把条件放在WHERE子句中。

    目前看起来像这样:

    UPDATE MY_TABLE t 
       SET t.TITLE = :TITLE,
           t.TYPE = :TYPE,
           t.STATE = :STATE,
           t.UPDTIME = :UPDTIME
     WHERE t.ITEM_ID = :ITEM_ID 
       AND exists (SELECT t.ITEM_ID
                    FROM MY_TABLE t, USERINFO ui
                   WHERE ui.USERID = t.USERID
                     AND ui.USERNAME = :USERNAME
                     AND t.ITEM_ID = :ITEM_ID);
    

    如果它找到(并更新)MY_TABLE中与给定USERNAME和ITEM_ID匹配的项目,则返回1,如果没有,则返回0。

    我想添加一些内容,以便在t.STATE = 'READ_ONLY'时不会更新,但这样做可以将该条件区分为"该项目没有"存在"条件。也许抛出某种错误?

    我可以在更新之前运行SELECT语句,以确保项目的状态不是READ_ONLY,但这似乎很浪费。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我不认为以前的SQL会浪费它。抛出一个错误只是为了捕捉一个条件(如果你的真实更新抛出相同的除以零错误会怎么样?)。您可以选择更新,然后通过rowid更新它,以便在您使用堆表时加快速度:

SELECT t.ITEM_ID, t.condition, t.rowid
FROM MY_TABLE t, USERINFO ui
WHERE ui.USERID = t.USERID
AND ui.USERNAME = :USERNAME
AND t.ITEM_ID = :ITEM_ID for update;

如果满足您的条件,您只需按rowid更新表格

update MY_TABLE
set ...
where rowid = :rowid