2017-02-22 6 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は操作テーブルでtemp3は新しいものです。

答えて

3

SELECTの必要はありません。そして、あなたはおそらくもテーブルにID値を入れたい

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; 
/

temp3トリガは、あなたが本当に名前が変更されているかどうかを確認する必要はありませんが、あなたがしたい場合は、あなたが行うことができます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

関連する問題