1. 程式人生 > >表xxx發生了變化,觸發器/函式不能讀它

表xxx發生了變化,觸發器/函式不能讀它

當刪除表中的資料的時候,報錯了,是觸發器/函式不能讀它

我的觸發器是當一個表中的資料改變(增、刪、改)後,操作另一張表中的資料,對另一張表中的資料進行增刪操作。

我修改後的觸發器是這樣的,在declare語句塊裡面加了“pragma autonomous_transaction;“,讓oracle知道觸發器是自定義事物處理。原因應該是當刪除一張表中的資料時,我同時要修改另一張表的資料。如果刪除時沒有commit,則會影響另一張表的操作。因為這是兩個事物。兩個事物衝突了,就出現錯誤了。

下面是我修改後的觸發器,修改了兩點:一是在declare語句塊加了“pragma autonomous_transaction;“ 二是在涉及到的insert、update、delete 語句後面加上了commit;

create or replace trigger AMC_SAP_VOUCHER_HR_QX_T
  after insert or update or delete on xip.AMC_SAP_VOUCHER_HR_QX  
  for each row
declare
  is_exist number;
  is_exist_user_role number;
  emp_count number;
  pragma autonomous_transaction;
begin
  case 
    when inserting then
      select count(*) into is_exist from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :new.empnumber;
      if is_exist=0 then
        insert into t_user_role values(:new.empnumber,'I8ad99053015525f625f6e770015529d2fc3f0bf6');
        commit;
      end if;
    when updating  then
      if :new.empnumber=:old.empnumber then
        return;
      else
        --刪除舊的
        select count(*) into emp_count from xip.AMC_SAP_VOUCHER_HR_QX t where t.empnumber = :old.empnumber;
      if is_exist=0 then
        select count(*) into is_exist_user_role from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :old.empnumber;
        if is_exist_user_role>0 then
          delete from t_user_role tr where tr.c_userid = :old.empnumber and tr.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6';
          commit;
        end if;
      end if;
        --插入新增的
        select count(*) into is_exist from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :new.empnumber;
        if is_exist=0 then
           insert into t_user_role values(:new.empnumber,'I8ad99053015525f625f6e770015529d2fc3f0bf6');
           commit;
        end if;
      end if;
    when deleting  then
      --一個使用者可能對應多個org,在資料庫中有多條記錄,刪除某條使用者並不代表把這個使用者全部刪除了
      select count(*) into is_exist from xip.AMC_SAP_VOUCHER_HR_QX t where t.empnumber = :old.empnumber;
      if is_exist=0 then
        select count(*) into is_exist_user_role from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :old.empnumber;
        if is_exist_user_role>0 then
          delete from t_user_role tr where tr.c_userid = :old.empnumber and tr.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6';
          commit;
        end if;
      end if;
        
  end case;
end AMC_SAP_VOUCHER_HR_QX_T;