2016-04-19 1 views
0

私の問題は、私が削除したい私はこのようなエラーを取得していますトリガが呼び出された行をトリガ自体で削除するにはどうすればよいですか?私のコードは、まずここで、 を次のように

create or replace trigger tri_ISSUE 
after insert or delete 
on ISSUE 
for each row 
declare 
    ct varchar2(20); 
    cnt number(20); 
begin 
    if inserting 
    then 
     select bk_category into ct from BOOK_MASTER where accn_no=:new.accn_no; 
     select available into cnt from BOOK_INFO where bk_category=ct; 
     if(cnt=0) 
     then 
      dbms_output.put_line('Book is not available!'); 
      delete ISSUE where rollno=:new.rollno and accn_no=:new.accn_no; 
     else 
      select bk_category into ct from BOOK_MASTER where accn_no=:new.accn_no; 
      update BOOK_INFO set available=available-1 where bk_category=ct; 
     end if; 
    end if; 
    if deleting 
    then 
     select bk_category into ct from BOOK_MASTER where accn_no=:old.accn_no; 
     update BOOK_INFO set available=available+1 where bk_category=ct; 
    end if; 
end; 

ORA-04091: table SYSTEM.ISSUE is mutating, trigger/function may not see it 
ORA-06512: at "SYSTEM.TRI_ISSUE", line 12 
ORA-04088: error during execution of trigger 'SYSTEM.TRI_ISSUE' 

私は何をしようとしていることであり、挿入の後に呼び出される「挿入後」トリガによって挿入されている。私は実際にそれを行うことはできますか?誰も私に治療法を提案することができますか?事前に感謝:)

+1

いいえ、あなたはできません。 'insert'が成功するのを防ぐために例外を発生させることができます。トリガーのafter文部分で削除を実行するbefore文、row-level文、およびafter文セクションを持つ複合トリガを(Oracleのバージョンに応じて)使用できます。それはシステムに非常に複雑なものを加える。この論理を最初にトリガーに入れたいのですが、チェックアウトを実装するコードでその本が実際に利用可能であることを検証するのではなく、なぜですか? –

答えて

0

要件を達成するにはいくつかの方法があります。

  1. すべてのロジックを手順に入れます。これが最も効果的な方法です。
  2. は、これは、ユーザが例外を取得し、データが挿入されていないとraise_application_error(-20001, 'Book is not available!');

    によってラインdelete ISSUE where rollno = :new.rollno and accn_no = :new.accn_no;を交換してください。

  3. ,BEFORE EACH ROWおよびAFTER STATEMENTの成分を含むcompound triggerを作成します。
  4. 、ビューとINSTEAD OF TRIGGERを作成し、このようになります:

    CREATE OR REPLACE VIEW V_ISSUE AS 
    SELECT * FROM ISSUE; 
    
    CREATE OR REPLACE TRIGGER tri_ISSUE 
        INSTEAD OF INSERT OR DELETE ON V_ISSUE 
        FOR EACH ROW 
    
    declare 
        ct varchar2(20); 
        cnt number(20); 
    begin 
        if inserting 
        then 
         select bk_category into ct from BOOK_MASTER where accn_no=:new.accn_no; 
         select available into cnt from BOOK_INFO where bk_category=ct; 
         if(cnt=0) 
         then 
          dbms_output.put_line('Book is not available!'); 
          NULL; -- > do nothing 
         else 
          INSERT INTO ISSUE VALUES (... all coloums of this table); 
          select bk_category into ct from BOOK_MASTER where accn_no=:new.accn_no; 
          update BOOK_INFO set available=available-1 where bk_category=ct; 
         end if; 
        end if; 
        if deleting 
        then 
         DELETE FROM ISSUE WHERE ...; 
         select bk_category into ct from BOOK_MASTER where accn_no=:old.accn_no; 
         update BOOK_INFO set available=available+1 where bk_category=ct; 
        end if; 
    END; 
    
関連する問題