Oracleには、行レベルとテーブルレベルの2つのレベルのトリガーがあります。
行レベルのトリガーは、for each row
実行されます。 。ステートメントが複数の行を変更した場合でも、ステートメントごとに実行されるテーブルレベルのトリガー。
行レベルのトリガーでは、トリガーを持つテーブル自体を選択/更新することはできません。変更エラーが発生します。
この場合、UPDATEステートメントは必要ありません。これを試してみてください:
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
:new.quote_expiration_date=sysdate+90;
END;
/
編集 Rajeshは、新しい行を挿入する前に、OPがaso_quote_headers_all
内の他のすべてのレコードを更新する可能性があると述べました。 テーブル。
まあ、これは実行可能ですが、少し注意が必要です。これを適切に行うには、
が必要です。- トリガーによって変更されるpl/sqlパッケージおよびパッケージヘッダー内の変数。この変数は、新しく挿入されたレコードのIDを保持するリストである可能性があります。挿入トリガー後の行レベルは、リストに新しいIDを追加します。このパッケージ変数の内容はセッションごとに異なるため、この変数を
session_variable
と呼びましょう。 。 - 挿入トリガー後の行レベル。これにより、
session_variable
に新しいIDが追加されます。 。 -
session_variable
からIDを取得する挿入トリガー後のテーブルレベル 、IDを処理してから、session_variable
から削除します。 。このトリガーは、aso_quote_headers_allで必要な選択/更新を実行できます。新しく挿入されたIDが処理された後、このトリガーはIDがsession_variable
から削除されていることを確認する必要があります 。