2017-10-24 3 views
2

OracleのPLSQLを初めて使用しています。私がトリガーについて学んでいるとき、私はこのソースからhttps://www.techonthenet.com/oracle/triggers/before_insert.phpを読んでいます。これは、BEFORE INSERTトリガーをOracleで作成すると、必ずしも必要ではないので、構文は大括弧[]で囲まれています。その後、エラーメッセージからOracleのBEFORE INSERT TRIGGERでFOR EACH ROWが不要なのはいつですか?

Error report - 
ORA-04082: NEW or OLD references not allowed in table level triggers 
04082. 00000 - "NEW or OLD references not allowed in table level triggers" 
*Cause: The trigger is accessing "new" or "old" values in a table trigger. 
*Action: Remove any new or old references. 

私は:new.[column_name]を使用している場合、それはのように思える:私は上記でFOR EACH ROWを削除した場合、私は実際にエラーを取得する

CREATE OR REPLACE TRIGGER enroll_time 
BEFORE INSERT 
ON ENROLL 
FOR EACH ROW 
BEGIN 
:new.addtime := sysdate; 
END; 
/

:私はこの単純なトリガーを書かれていますFOR EACH ROWが存在する必要があります。どうしてこれなの?オラクルのBEFORE INSERT TRIGGERFOR EACH ROWが必要ない例はありますか?

+1

例外を発生させるトリガーを作成する - データがテーブルに挿入されないようにします。 –

答えて

2

Is there any example that FOR EACH ROW is NOT needed in a BEFORE INSERT TRIGGER in Oracle?

文レベルのトリガの

簡単な例:

CREATE TABLE test_table(col VARCHAR2(10)); 

CREATE OR REPLACE TRIGGER enroll_time 
BEFORE INSERT 
ON ENROLL 
BEGIN 
    INSERT INTO test_table(col) 
    SELECT 1 FROM dual; 
END; 
/

を私は非常に各部品が発射されたときに理解するのに約compound triggerを読むことをお勧めします。

1

OLDまたは:NEW疑似可能性を使用する必要がある場合は、行レベルのトリガーが必要です。ステートメント・レベル・トリガーの例は、別の表が実行されたときにレコードを表に挿入することです。

関連する問題