1

フィールドがnullかどうかを確認するトリガーがあります。

create or replace trigger trig1
after insert on table_1
for each row
begin
if ((select table2.column2 from table2 where table2.id= :new.id) isnull) then
update table2 set table2.column2 = :new.column1 where table2.id = :new.id;
end if;
end trig1;
.
run;

トリガーがコンパイルエラーで作成されるというエラーが発生します。何が問題なのかわかりません。Oracle SQL *Plus10.2.0を使用しています

4

1 に答える 1

8

PL / SQL構文では、IF句にSQL文を含めることはできません。

正しいアプローチは、SELECTステートメントを分離してから、その結果をテストすることです。つまり、次のようになります。

create or replace trigger trig1 
after insert on table_1 
for each row 
declare
    v table2.column2%type;
begin
    select table2.column2 
    into v
    from table2 
    where table2.id= :new.id;

    if v is null
    then 
        update table2 
        set table2.column2 = :new.column1 
        where table2.id = :new.id; 
    end if; 
end trig1;

table2これは、基準に一致する複数の行の存在、または実際に一致する行がないことを処理しないことに注意してください。また、ロックも処理しません。

また、このようなコードはマルチユーザー環境ではうまく機能しないことに注意してください。だから私はロックについて言及しました。これらの種類の要件を処理するには、実際には手続き型ロジックを使用する必要があります。よく考えられていないトリガーの場合によくあることですが、本当の原因は貧弱なデータモデルです。 table2.column2存在しない状態で正規化されている必要があります。

于 2012-05-31T13:01:08.257 に答える