【问题标题】:Oracle SQL / PL/SQL: Insert if changed/not found; else do nothingOracle SQL / PL/SQL:如果更改/未找到则插入;否则什么都不做
【发布时间】:2015-05-31 17:01:10
【问题描述】:

经过深思熟虑后完全重新编辑。最初我希望与单独的 MERGE 语句结合使用,但忘记了。需要明确的是,这不是一个更新。如果找不到现有的匹配记录,我想添加一条新记录。

假设mytable 包含列foobarbaz。其中(如果与性能相关)foobar 一起唯一标识记录。

a) 如果不是 foobar,则插入 foobarbaz

b) 否则,如果 foobarbaz<new> 不等于 baz<old> 则插入 foobarbaz<new>

c) 否则,如果所有三个都匹配,则什么也不做

请注意,b 同样是一条新记录,而不是更新。本质上,这是对baz 的日志记录更改。

作为额外的奖励,如果我可以让 MERGE 语句(到 my_second_table)只尝试在 ab 上进行合并,那就太好了,因为 case c 意味着 baz 因此没有改变我们不需要碰另一张桌子。但我知道你不可能拥有一切。

为什么他们不能像 Mongo 那样只使用 JavaScript...?

【问题讨论】:

  • 您的示例中没有 PL/SQL
  • 我只是想出了一个 PL/SQL 过程,我需要什么来扩展它来做我需要的,不是吗?至少这是谷歌搜索引导我的方向。

标签: sql oracle sql-merge


【解决方案1】:

没有办法在合并语句中更新两个表,但有几个替代方案。一个是向第一个表添加触发器。触发器将触发您想要的任何更改,并且可以在第二个表中插入行:

CREATE TRIGGER IUA_Table1
AFTER INSERT OR UPDATE
ON Table1 FOR EACH ROW
BEGIN

  INSERT INTO LogTable(groupid, var, sku_no )
  VALUES(:new.groupid, var, sku_no);

END;

此触发器将在任何插入或更新时触发,因此不仅仅是您的合并语句。

请注意,有些人喜欢触发器并将它们用于大多数事情,而其他人则非常不愿意将它们用于任何事情。我个人认为您不应该在触发器中放置过多的业务逻辑,但对于像这样记录更改可能是可以接受的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多