この種のロジックをストアドプロシージャに保持することは良い選択です。そのロジックをトリガーに実装してみてください。何らかの方法で、最終的には
ORA-04091: table <your table> is mutating, trigger/function may not see it
たとえば、トリガーにそれを実装すると、次のように使用できるinsertようになります
insert into <Yourtable> (<col1>...<coln>)
values(val1... valn)
しかし、このようmutating tableに実行しようとすると、間違いなくエラーが発生しますinsert
insert into <Yourtable> (<col1>...<coln>)
select col1, .. coln
from some_table
ストアドプロシージャを使用したくない場合は、他の選択肢としてview、instead of trigger
Create or replace view <ViewName> as
select *
from your_table;
create or replace trigger <Trigger_name>
instead of insert on <View_Name>
begin
-- your logic
end;
更に
また、制約(制約)を介してビジネスルールを適用するには、次のように制約をCHECK組み合わせることができます。ビジネスルールの制約に違反するデータをクエリするテーブルのマテリアライズドビューを作成します(前に作成することを忘れないでください)。CHECKmaterialized viewmaterialized view log
Create materialized view MV_1
refresh complete on commit as
--here goes your query
-- selecting data you want to raise exception on
check常にfalseになる制約を追加します。このようなもの
alter table MV_1 add constraint CHK check(1=2) deferrable;
これを行うとcheck constraint <..> violated、ビジネスルールの制約に違反するデータをテーブルに挿入しようとしたときに得られます。