2017-08-18 47 views
1

DATABSE触发I具有低于规定─将数据插入临时表在主表

我有2个表主表A,临时表乙

我以前一个上主表阿插入触发器写入检查一些错误的数据。如果数据错误,则会插入登台表B,以便用户可以查看错误并进行更正,然后再次上传数据。 我的问题是数据没有被插入到登台表中,因为我刚刚在插入语句后使用raise_form_trigger_failure。是否有任何其他方式来执行此操作?

TRIGGER代码 -

create or replace trigger CCM_TEST 
    before insert OR UPDATE ON "CCM_MANAGER" 
    for each row 
    declare 
    l_user varchar2(500); 
    v_user number; 
    v_cost_centre number; 
    v_company_code number; 
    v_show_error varchar2(100); 
begin 
l_user := NVL(v('APP_USER'), user); 
    if inserting then 

      begin 
      select count(1) 
      into v_cost_centre 
      From gl_code_combinations 
      where segment2=:new.cost_center 
      and enabled_flag ='Y'; 

      if (v_cost_centre= 0) then  
      v_show_error:='Cost Centre does not exists!! '||'Cost Centre -'||:new.cost_center;  
      :new.CHECK_INSERT_FLAG:='Y'; 

       Insert into CCM_MANAGER_STG(COMPANY_CODE, 
       COST_CENTER, 
       USER_NAME, 
       EFFECTIVE_START_DATE, 
       EFFECTIVE_END_DATE, 
       CREATED_BY, 
       CREATION_DATE, 
       LAST_UPDATED_BY, 
       LAST_UPDATE_DATE, 
       LINE_ID, 
       CHECK_INSERT_FLAG, 
       SHOW_ERRORS) values 
       (:new.COMPANY_CODE, 
       :new.COST_CENTER, 
       :new.USER_NAME, 
       :new.EFFECTIVE_START_DATE, 
       :new.EFFECTIVE_END_DATE, 
       :new.CREATED_BY, 
       :new.CREATION_DATE, 
       :new.LAST_UPDATED_BY, 
       :new.LAST_UPDATE_DATE, 
       :new.LINE_ID, 
       :new.CHECK_INSERT_FLAG, 
       v_show_error); 
       end if; 
      raise_application_error (-20001, 'Cost Centre does not exists!! '||'Cost Centre -'||:new.cost_center||' ');        
      exception 
      when others then 
      --raise_application_error (-20001, sqlerrm); 
      null; 

     end; 

     begin 
      select count(1) 
      into v_company_code 
      From gl_code_combinations 
      where segment1=:new.company_code 
      and enabled_flag ='Y'; 

      if (v_company_code= 0) then 

      v_show_error:='Company Code does not exists!!'; 
      :new.CHECK_INSERT_FLAG:='Y'; 

       Insert into CCM_MANAGER_STG(COMPANY_CODE, 
       COST_CENTER, 
       USER_NAME, 
       EFFECTIVE_START_DATE, 
       EFFECTIVE_END_DATE, 
       CREATED_BY, 
       CREATION_DATE, 
       LAST_UPDATED_BY, 
       LAST_UPDATE_DATE, 
       LINE_ID, 
       CHECK_INSERT_FLAG, 
       SHOW_ERRORS) values 
       (:new.COMPANY_CODE, 
       :new.COST_CENTER, 
       :new.USER_NAME, 
       :new.EFFECTIVE_START_DATE, 
       :new.EFFECTIVE_END_DATE, 
       :new.CREATED_BY, 
       :new.CREATION_DATE, 
       :new.LAST_UPDATED_BY, 
       :new.LAST_UPDATE_DATE, 
       :new.LINE_ID, 
       :new.CHECK_INSERT_FLAG, 
       v_show_error); 
      end if; 

       raise_application_error (-20001, 'Company Code does not exists!! '||'Company code -'||:new.company_code||' '); 
      -- Rollback; 
      exception 
      when others then 
      raise_application_error (-20001, sqlerrm); 
      null; 
      end; 
    end if; 

end; 

回答

0

第一种方式是autonomous transaction

第二种方式是compound trigger

+0

我尝试使用自动事务并将其保存到临时表中,但它也保存在主表中。如果数据存储到临时表中,则不应将其保存到主表中,因为用户将更正数据,然后再次将其上载。如果我在插入语句后尝试raise_application_error,那么它会为每个记录出错,并且没有任何内容保存到主表中。 – user3849885

+0

@ user3849885请给我看自动交易的代码 –