【问题标题】:How to Insert affected rows in a new table如何在新表中插入受影响的行
【发布时间】:2017-02-22 07:03:55
【问题描述】:

以下是我正在执行一些更新的虚拟表。在这里,我只是在操作“NAME”列。我需要的是插入受影响的行,(比如说)我将第二个更改为“ID”-2,然后我需要只将这一行插入到具有新/更新值的新表中。我曾尝试通过触发器这样做,但它会吐出有关表突变的错误。

   ID    NAME
================ 
    1    Vaz
    2    Dan
    3    Steve

我希望插入数据的表具有与上述表相同的结构和具有相同数据类型的相同列。

请建议这是否可以通过任何其他方式完成,或者我为触发器编写了错误的代码。这是我为此目的编写的代码:

CREATE OR REPLACE TRIGGER HR.ins_temp
after UPDATE OF name ON HR.TEMP2 FOR EACH ROW
BEGIN
INSERT INTO temp3
(SELECT NAME
FROM temp2
WHERE (:new.NAME<>:old.NAME));
END;

temp2 是操作表,temp3 是新的。

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    不需要选择。而且您可能还想将ID值放入表中temp3

    CREATE OR REPLACE TRIGGER HR.ins_temp
    after UPDATE OF name ON HR.TEMP2 FOR EACH ROW
    BEGIN
        INSERT INTO temp3 (id, name)
        values (:new.id, :new.name);
    END;
    /
    

    由于触发器被定义为update of name,您实际上不需要检查名称是否更改,但如果您愿意,您可以这样做:

    CREATE OR REPLACE TRIGGER HR.ins_temp
    after UPDATE OF name ON HR.TEMP2 FOR EACH ROW
    BEGIN
      if (   (:new.name <> :old.name)
          OR (:new.name is null and :old.name is not null)
          OR (:new.name is not null and :old.name is null)) 
     then
        INSERT INTO temp3 (id, name)
        values (:new.id, :new.name);
      end if;
    END;
    /
    

    【讨论】:

    • 工作就像一个魅力,非常感谢。但是如果有很多列怎么办?我仍然会在插入时单独提及它们
    • @hashir:是的,你需要这样做,这就是 SQL insert 语句的工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多