【问题标题】:Oracle DB, move row on update to another tableOracle DB,将更新行移动到另一个表
【发布时间】:2021-01-07 12:28:50
【问题描述】:

一开始我认为这是很容易执行的事情,但是我被使用触发器的变异错误困住了,我不知道如何执行它 此操作的主要目标是避免更新行被执行两次......所以一旦某些字段被更新,我需要一个将行移动到另一个表的过程(该表中的相同字段)

我已尝试使用 AFTER update 触发.. 但出现变异错误

希望有人能帮助我

提前谢谢你

拉夫

【问题讨论】:

    标签: oracle triggers move


    【解决方案1】:

    看不到的代码很难调试;你为什么不发布一个测试用例让我们看看你做了什么以及 Oracle 是如何回应的?


    因为,它按预期工作 - 如果我正确理解了这个问题。方法如下。

    SQL> create table test (id number, name varchar2(20));
    
    Table created.
    
    SQL> create table test_2 (id number, name varchar2(20), datum date);
    
    Table created.
    
    SQL> create or replace trigger trg_ai_test
      2    after insert on test
      3    for each row
      4  begin
      5    insert into test_2 (id, name, datum)
      6      values (:new.id, :new.name, sysdate);
      7  end;
      8  /
    
    Trigger created.
    

    测试:

    SQL> insert into test (id, name) values (1, 'Littlefoot');
    
    1 row created.
    
    SQL> select * from test;
    
            ID NAME
    ---------- --------------------
             1 Littlefoot
    
    SQL> select * From test_2;
    
            ID NAME                 DATUM
    ---------- -------------------- -------------------
             1 Littlefoot           07.01.2021 13:47:31
    
    SQL>
    

    假设您的触发器是从您创建触发器的表中选择的(在我的示例中,这将是select ... from test)。由于变异表错误,您不能这样做,但是 - 您也不必这样做,因为您可以使用 :new 和/或 :old 列的值。

    【讨论】:

      【解决方案2】:

      正是这样!变异

      我已经找到了让它工作的方法:

      创建或替换 TRIGGER TRIGGER1 在 SCAN4000 上更新自动计数后

      开始 插入 SCAN4000_SAP (datamatrixcode, automaticcount) 从 scan4000 中选择 scan4000.datamatrixcode, scan4000.automaticcount 其中自动计数不为空; 从 scan4000.automaticcount 不为空的 SCAN4000 中删除; 结束;

      一位同事刚刚告诉我,这可能会导致死锁,您怎么看?

      【讨论】:

        猜你喜欢
        • 2019-08-12
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 2018-07-01
        • 2016-03-22
        相关资源
        最近更新 更多