2017-02-22 58 views
2

以下是我正在执行某些更新的虚拟表。在这里,我只是操纵“名称”列。我需要插入受影响的行,(比方说)我改变了第二个“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是操作tabel和temp3是新的。

回答

3

不需要SELECT。你可能也希望把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; 
/
+0

像一个魅力工作, 非常感谢。 但如果有很多列呢?插入 – hashir

+1

@hashir:是的,你需要这样做,这就是SQL insert语句的工作原理。 –

+0

非常感谢你的帮助兄弟! – hashir

相关问题