【问题标题】:Oracle SQL: UPDATE, but throw 'error' if condition not metOracle SQL:更新,但如果条件不满足则抛出“错误”
【发布时间】:2016-02-11 22:28:37
【问题描述】:

对不起,如果这是一个骗局 - 我搜索了类似的问题,但它们似乎都符合条件更新,您可以使用 CASE 语句将列设置为多个值之一。

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

  1. 未找到该项目(导致 rowsUpdated 为 0)
  2. 如果满足条件

我想以某种方式区分这两种状态,这就是为什么我不能只将条件放在 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,但这似乎很浪费。有没有更好的办法?

【问题讨论】:

  • 您可以添加一个虚拟计算,例如t.UPDTIME = CASE WHEN t.STATE = 'READ_ONLY' THEN 1/0 ELSE :UPDTIME END1/0 应该抛出一个 除以零,你可以捕捉到。
  • 这很聪明,但有点老套,你不是说吗?我喜欢你的头在哪里:) 我希望出现某种自定义错误——但我什至不确定这在 SQL 中是否可行。这样,我们就可以避免忽略一个合法的除以零错误,正如 Felipe 所说。并不是说我们当前的架构设置很可能会发生这种情况,但谁知道未来会怎样?

标签: sql oracle sql-update


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多