私はいくつかのトリガー スクリプトの実装を任されており、同僚からのサンプルを参考にしています。それらでは、更新/挿入/削除にpl-sql条件を使用し、巨大な挿入ステートメントを(別のテーブルで)使用します。これらの挿入ステートメントは、値の前に new または old が付いているかどうか以外は変わりません。私は賢く、以下を使用して私のものをもう少しコンパクトにしようと思いました:
DECLARE
vRow SATURN.SPRCMNT%ROWTYPE;
BEGIN
IF UPDATING THEN
vRow := :NEW;
ELSIF INSERTING THEN
vRow := :NEW;
ELSIF DELETING THEN
vRow := :OLD;
END IF;
-- Not the real insert statement
INSERT INTO blah
(columns)
VALUES
(vRow.somecolumns);
END;
コンパイル システムから次の情報が返されます。
10/13 PLS-00049: bad bind variable 'NEW'
13/13 PLS-00049: bad bind variable 'NEW'
16/13 PLS-00049: bad bind variable 'OLD'
明らかに、これは好きではありません。私が試みていることを達成するものはありますか?:new と :old は真の行型ではありませんか? 本質的に同じコードを 3 回繰り返すのはばかげているように思えますが、より良い方法を見つけることはできません。地獄、トリガーのサイズにも厳しい制限があることを読んだと思います。どんな助けでも感謝します。
[編集] 考えただけですが、DECODE() 内で何らかの形で UPDATING/INSERTING キーワードを参照することは可能ですか?
たとえば、DECODE(SOMETHINGVAR, UPDATING, :NEW.column, DELETING, :OLD.column) を実行できれば、1 つのステートメントで vRow の各列の値を設定できます。
最初に DELETING をチェックして、他の 2 つのデフォルトを使用する方がよいと思います。
これは可能ですか?