如何通过触发器本身删除关于触发器被调用的行?

时间:2016-04-19 15:37:13

标签: database oracle

我的问题如下, 首先,这是我的代码,

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}}

我想要做的是,我想删除正在插入的行,通过' After Insert'触发,然后插入调用。我真的能这样做吗?谁能建议我一个补救措施?提前谢谢:)

1 个答案:

答案 0 :(得分:0)

有几种方法可以满足您的要求。

  1. 将所有逻辑放入程序中。这很可能是最好的方式。
  2. delete ISSUE where rollno = :new.rollno and accn_no = :new.accn_no;替换为raise_application_error(-20001, 'Book is not available!');

    这样,用户就会收到异常并且未插入数据。

  3. 使用BEFORE STATEMENTBEFORE EACH ROWAFTER 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;