2017-02-02 16 views
2

私は今質問している質問は既にあります。しかし、私はこれに答えていない。TRIGGERのINSERT INTO ... SELECTを使用

以下のリンクを参照してください。 ORACLE TRIGGER INSERT INTO ... (SELECT * ...)

私は約600列のテーブルを持っています。この表の各挿入の後に、新しい行を別のバックアップテーブルに挿入する必要があります。

「INSERT INTO TABLE_NAME2 SELECT * FROM TABLE_NAME1」クエリの使用方法は、トリガーに記載してください。

注:INSERTまたはSELECT句の両方テーブルの

構造列を指定せずに同じです。トリガーですべての列名を指定するのは難しく、新しい列が追加された場合でもトリガーを追加する必要があります。

+0

(の可能性のある重複した[ORACLE TRIGGER INSERT INTO ...(SELECT \ * ...)] http://stackoverflow.com/questions/41814292/oracle-trigger- – mustaccio

+0

テーブル2にデータを挿入する手続きを作成するほうが簡単でしょうか? – Tenzin

+0

@ Tenzin - いいえ、この挿入物はウェブページ経由です。パッケージはここでは適用されません。 –

答えて

0
SQL> CREATE or REPLACE TRIGGER emp_after_insert AFTER INSERT ON emp 
FOR EACH ROW 
DECLARE 
BEGIN 
insert into emp_backup values (:new.empid, :new.fname, :new.lname); 
DBMS_OUTPUT.PUT_LINE('Record successfully inserted into emp_backup table'); 
END; 

参照: http://www.tech-recipes.com/rx/19839/oracle-using-the-after-insert-and-after-update-triggers/

+0

ここでは、3つの列しか言及していません。 1つの表に膨大な数の列があるので、列を言及せずに求めています。だからselect *を使う予定です。 –

+0

少なくとも1回は列を書き出す必要があります。 – Tenzin

-2

あなたは複合トリガーを使用する必要があります。このトリガーは、次のようになります。

CREATE OR REPLACE TRIGGER t_copy_table1 
FOR INSERT ON table1 
COMPOUND TRIGGER 
    v_id number; 

BEFORE EACH ROW IS 
BEGIN 
    v_id := :new.id; 
END BEFORE EACH ROW; 

AFTER STATEMENT IS 
BEGIN 
    insert into table2 select * from table1 where id=v_id; 
END AFTER STATEMENT; 
END t_copy_table1; 
+0

これは、メインテーブルへの単一のINSERTに対してのみ機能します。メインテーブルでINSERT AS SELECTが実行されている場合、最後の行のみがバックアップテーブルにコピーされます。 IDを格納するためにPL-SQLテーブルを導入する必要があり、メモリの配慮の問題が発生します。 –

+0

@MarcoPolo OKですが、このテーブルでは選択としての挿入が行われるとは言えません。これを行うには1回の挿入が適切な方法であると思います。 – porgo

+0

もう1つの条件は、上記のトリガーで言及したIDが重複している可能性があります。しかし、私は最初のテーブルに新たに挿入された最後のエントリだけが必要です。 –

関連する問題