この種のロジックをストアドプロシージャに保持することは良い選択です。そのロジックをトリガーに実装してみてください。何らかの方法で、最終的には
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
組み合わせることができます。ビジネスルールの制約に違反するデータをクエリするテーブルのマテリアライズドビューを作成します(前に作成することを忘れないでください)。CHECK
materialized view
materialized 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
、ビジネスルールの制約に違反するデータをテーブルに挿入しようとしたときに得られます。