2

挿入されるすべてのレコードの後に​​トリガーを実行する必要があります。

この検証は、次のような単純な挿入がある場合は正常に機能します。

insert into g_dossier values
               (112334, 'BBT', 'LPO','TTS','Y') ;

ただし、次のようなバルクインサートのような場合:

INSERT INTO g_piece(
                refpiece,
                typpiece,
                class_piece
                group_piece
                flag_piere)    
SELECT         :new.element_num,
                PROC_TYPE,
                DECODE( piece_it, 'F', 'FTTR', 'N', 'FTTR', NULL ),
                DECODE( piece_it, 'T', 'TTSN', 'N', 'TTSN', NULL ),
                'N'
FROM    t_elements
WHERE   :new.db_piece_flag = 'Y';

トリガーが変化します。一括挿入として実行した場合にも検証が機能するようにしたいと思います。

この問題の原因となるクエリは

SELECT COUNT(*)
INTO existing_cmcl_cnt
FROM g_piece cmcl
WHERE cmcl.class_piece= :new.class_piece

問題は、このクエリが同じテーブル「g_piece」に適用されたトリガーで呼び出されることです。単純な挿入(g_piecevalues(...)に挿入)を続行すると、この問題は発生しません。

この問題を回避するにはどうすればよいですか?ありがとう。

4

2 に答える 2

1

ここではSELECT ... FROM some join、トリガーをまったく使用せずに、クエリを変更して結果を挿入する必要があります。テーブルに挿入するときXに、トリガーも同じテーブルに挿入する必要がありますが、これは不可能です(再帰します)。

クエリを変更できない場合は、テーブルの名前を変更し、古い名前でテーブルのビューを作成し、の結果とTRIGGER INSTEAD OF INSERT ON that view FOR EACH ROW なるビューを作成する必要があります。INSERT INTO into the real tableSELECT ... FROM some join

于 2011-10-13T15:10:17.977 に答える
0

Oracle 11Gを使用している場合は、複合トリガーを調べて、テーブルの変更エラーを回避できます。ご覧ください: http ://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/triggers.htm#CIHEFGFD

于 2011-10-13T11:11:35.583 に答える