2017-02-22 54 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

相關問題