私はこのトリガーを回避しています。スクリプトを実行すると、前のエラー・メッセージが表示されます。私はそれが正しくコンパイルされない理由を把握することができない、すべてのPL/SQLのトリガチュートリアルは、私のトリガが持っている構造を持っているようだ。コードは以下の通りです:新しいアーティストは、すでにそのスーパータイプ(演奏者)に存在する場合、それはそれはアーティストに両方を挿入していない場合、それはエラーを与える存在しない場合ORA-24344:コンパイル・エラーで成功 - トリガーAPEX
create
or replace trigger new_artist before insert
on
Artist referencing new as nvartist declare counter number;
begin select
count(*) into
counter
from
Performer
where
Stage_name = nvartist.Stage_name;
if counter > 0 then signal sqlstate '45000';
else insert
into
Artist
values(
nvartist.Stage_name,
nvartist.Name
);
insert
into
Performer
values(nvartist.Stage_name);
end if;
end;
それはStage_name VARCHAR2、名前(、チェックvarchar2)とパフォーマー(Stage_name)。 Performerの別のサブタイプ(およびArtistへの兄弟)はBand(Stage_name)で、Artistとの関係もあります。なぜコンパイラはこのトリガのために私に怒鳴りますか?あなたは(私は少しあなたのテーブルの名前を変更)このバリアントを試してみたいことがあり、事前
同じ基本テーブルにデータを挿入しようとすると、トリガエラーの突然変異が原因で実行時にエラーが発生する –
私はそれについて読んで、挿入/更新された行が混乱するとトリガが失敗することを理解しましたトリガー内でその行を直接的または間接的に削除した場合、私はそれが当てはまるとは思わない。私の目的はArtistに挿入する前にPerformerにStage_nameがすでに存在するかどうかをチェックすることです。存在していれば(それは彼らの関係であるため、ISA Artist/Band)パフォーマーはエラーを出しますが、存在しなければアーティストとパフォーマーの両方に挿入します。私はこれがそれを達成すると思った。 – Punk
OracleにはSIGNALコマンドはありません。これはMySqlです。このトリガーはコンパイルされません。シグナルの代わりにraise_application_errorを使用します。あなたは同じテーブルに挿入することはできませんし、必要はありません。 'アーティストに挿入'コマンドを削除します。これは自動的に行われます。 – Mottor