指定された値に応じて、挿入/更新を実行しようとしているテーブルがあります。ただし、挿入はこの特定のテーブルでは機能しませんが、スクリプトが実行された以前のテーブルでは機能します。
この問題をテストするために、キーが存在するかどうかに応じて挿入または更新する oracle の sqldeveloper にいくつかの匿名ブロックを入れました。更新は正常に機能しているように見えますが、新しい行を挿入すると、何も挿入されません。
このテーブルがあった場合:
COFFEE_ID TEA_ID NAME
11 100 combo 1
12 101 combo 2
13 102 combo 3
これを行うと、何も挿入されず、代わりに次の無名ブロックに移動します。
begin
insert into COFFEE_TEA(COFFEE_ID, TEA_ID, NAME) values (14, 103, 'combo 4');
exception when dup_val_on_index then
update ....
end;
....
このテーブルのトリガーと関係があると思われます。これはBEFORE EACH ROW
トリガー タイプであり、他のテーブルにデータを挿入します。トリガーには例外処理がないため、失敗する必要があると推測していますが、それを報告する必要はありません (スクリプトを実行しても sqldeveloper に表示されません)。
私の2つの質問は、
トリガーが実行されると、他のテーブルに挿入しようとしている ID が既に存在する場合はどうなりますか? 静かに失敗するように見えますか?
これをどのように修正するのが最善ですか?トリガーコード自体を変更できるかどうかはわかりませんが、匿名ブロック内でエラーをキャッチすることは可能でしょうか (実際に問題を引き起こしているのはトリガーであると仮定します)。もしそうなら、サイレントに失敗した場合にキャッチする例外をどのように知ることができますか?
sqldeveloper で例外を削除したところ、一意の制約に違反したことがわかりました。つまり、トリガーを介して他のテーブルにデータが挿入されていることが原因です。