请教有经验者帮我解决下这个问题,以下是我写的触发器,只能insert不能update,update会出错,以下是出错信息,但是不知道出错在哪里,请高手帮我查看下,不甚感激,谢谢!在线等,急急急
create or replace trigger resource_typeTri
 before insert or update on resource_type
  for each row
declare
v_code varchar2(50);
v_name  varchar2(50);
begin
v_code:=:new.code;
select max(substr(code,-3,3))+1001 into v_name  from resource_type  where code like v_code||'%';
if v_name is null then
:new.code:=v_code||'_'||'001';
else
  :new.code := v_code||'_'||to_char(substr(v_name,-3,3));
  end if;
end;
SQL> update resource_type
  2  set code='transport'
  3  where resource_type_id=0;update resource_type
set code='transport'
where resource_type_id=0ORA-04091: 表 EGIS_ADMIN.RESOURCE_TYPE 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "EGIS_ADMIN.RESOURCE_TYPETRI", line 6
ORA-04088: 触发器 'EGIS_ADMIN.RESOURCE_TYPETRI' 执行过程中出错

解决方案 »

  1.   

    create or replace trigger resource_typeTri 
    before insert or update on resource_type 
      for each row 
    declare 
    v_code varchar2(50); 
    v_name  varchar2(50); 
    pragma autonomous_transaction;
    begin 
    v_code:=:new.code; 
    select max(substr(code,-3,3))+1001 into v_name  from resource_type  where code like v_code||'%'; 
    if v_name is null then 
    :new.code:=v_code||'_'||'001'; 
    else 
      :new.code := v_code||'_'||to_char(substr(v_name,-3,3)); 
      end if; 
    end; 
      

  2.   

    SQL> create or replace trigger resource_typeTri
      2  before insert or update on resource_type
      3    for each row
      4  declare
      5  v_code varchar2(50);
      6  v_name  varchar2(50);
      7  pragma autonomous_transaction;
      8  begin
      9  v_code:=:new.code;
     10  select max(substr(code,-3,3))+1001 into v_name  from resource_type  where code like v_code||'%';
     11  if v_name is null then
     12  :new.code:=v_code||'_'||'001';
     13  else
     14    :new.code := v_code||'_'||to_char(substr(v_name,-3,3));
     15    end if;
     16  end;
     17  /Trigger createdSQL> insert into resource_type(resource_type_id,code) values(seq_resource_type.nextval,'transport');1 row insertedSQL> 
    SQL> update resource_type
      2  set code='transport'
      3  where resource_type_id=0
      4  ;update resource_type
    set code='transport'
    where resource_type_id=0ORA-00001: 违反唯一约束条件 (EGIS_ADMIN.RESOURCE_TYPE_CODE_IDX)高手帮帮忙吧
      

  3.   

    我有建唯一索引,后来我把索引删除了,出现这样情况
    drop index RESOURCE_TYPE_CODE_IDX;Index droppedSQL> 
    SQL> update resource_type
      2  set code='transport'
      3  where resource_type_id=0
      4  ;1 row updatedSQL> insert into resource_type(resource_type_id,code) values(seq_resource_type.nextval,'transport');1 row insertedSQL> select * from resource_type;RESOURCE_TYPE_ID CODE                                               NAME                           STATUS DESCRIPTION
    ---------------- -------------------------------------------------- ------------------------------ ------ --------------------------------------------------------------------------------
                   0 transport_006                                      巴士                                1 description
                   1 transport_002                                      麵包車                              1 description1
                   2 transport_003                                      卡車                                1 description2
                   3 consumable_001                                     小吃                                1 description3
                   4 consumable_002                                     飲料                                1 description4
                   5 consumable_003                                     餐飲                                1 description5
                   6 consumable_004                                     血袋類型                            1 description6
                   7 equipment_001                                      椅子                                1 description7
                   8 equipment_002                                      床                                  1 description8
                   9 equipment_003                                      桌子                                1 description9
                  10 equipment_004                                      電腦                                1 description110
                  60 consumable_005                                     xc                                    
                  61 transport_004                                      df                                    
                 103 transport_005                                                                            
                 104 transport_006                                                                            
                  80 equipment_007                                      equipment3                            
                  62 consumable_006                                     dfg                                   
                  63 consumable_007                                     consumable1                           
                 100 equipment_008                                      cxxx                                  
                 102 equipment_009                                      货车                                  货车
                  58 equipment_005                                      equipment                             
                  59 equipment_006                                      equipment2                            22 rows selectedSQL> 
    SQL> update resource_type
      2      set code='transport'
      3      where resource_type_id=3;1 row updatedSQL> select * from resource_type;RESOURCE_TYPE_ID CODE                                               NAME                           STATUS DESCRIPTION
    ---------------- -------------------------------------------------- ------------------------------ ------ --------------------------------------------------------------------------------
                   0 transport_006                                      巴士                                1 description
                   1 transport_002                                      麵包車                              1 description1
                   2 transport_003                                      卡車                                1 description2
                   3 transport_006                                      小吃                                1 description3
                   4 consumable_002                                     飲料                                1 description4
                   5 consumable_003                                     餐飲                                1 description5
                   6 consumable_004                                     血袋類型                            1 description6
                   7 equipment_001                                      椅子                                1 description7
                   8 equipment_002                                      床                                  1 description8
                   9 equipment_003                                      桌子                                1 description9
                  10 equipment_004                                      電腦                                1 description110
                  60 consumable_005                                     xc                                    
                  61 transport_004                                      df                                    
                 103 transport_005                                                                            
                 104 transport_006                                                                            
                  80 equipment_007                                      equipment3                            
                  62 consumable_006                                     dfg                                   
                  63 consumable_007                                     consumable1                           
                 100 equipment_008                                      cxxx                                  
                 102 equipment_009                                      货车                                  货车
                  58 equipment_005                                      equipment                             
                  59 equipment_006                                      equipment2                            22 rows selectedSQL> commit;Commit completeSQL> create unique index RESOURCE_TYPE_CODE_IDX on resource_type(code);Index createdSQL> commit;Commit completeSQL> insert into resource_type(resource_type_id,code) values(seq_resource_type.nextval,'transport');1 row insertedSQL> 
    SQL> update resource_type
      2      set code='transport'
      3      where resource_type_id=0;update resource_type
        set code='transport'
        where resource_type_id=0ORA-00001: 违反唯一约束条件 (EGIS_ADMIN.RESOURCE_TYPE_CODE_IDX)SQL> select * from resource_type;RESOURCE_TYPE_ID CODE                                               NAME                           STATUS DESCRIPTION
    ---------------- -------------------------------------------------- ------------------------------ ------ --------------------------------------------------------------------------------
                   0 transport_001_001                                  巴士                                1 description
                   1 transport_002                                      麵包車                              1 description1
                   2 transport_003                                      卡車                                1 description2
                   3 consumable_001_001                                 小吃                                1 description3
                   4 consumable_002                                     飲料                                1 description4
                   5 consumable_003                                     餐飲                                1 description5
                   6 consumable_004                                     血袋類型                            1 description6
                   7 equipment_001                                      椅子                                1 description7
                   8 equipment_002                                      床                                  1 description8
                   9 equipment_003                                      桌子                                1 description9
                  10 equipment_004                                      電腦                                1 description110
                  60 consumable_005                                     xc                                    
                  61 transport_004                                      df                                    
                 103 transport_005                                                                            
                 104 transport_006                                                                            
                 105 transport_007                                                                            
                  80 equipment_007                                      equipment3                            
                  62 consumable_006                                     dfg                                   
                  63 consumable_007                                     consumable1                           
                 100 equipment_008                                      cxxx                                  
                 102 equipment_009                                      货车                                  货车
                  58 equipment_005                                      equipment                             
                  59 equipment_006                                      equipment2                            23 rows selectedSQL> select * from resource_type;
      

  4.   

    解决了,非常感谢cosio的帮忙,但是你位置放错了哦,要这样
    create or replace trigger resource_typeTri 
    before insert or update on resource_type 
      for each row 
    declare
    pragma autonomous_transaction;  
    v_code varchar2(50); 
    v_name  varchar2(50); 
    begin 
    v_code:=:new.code; 
    select max(substr(code,-3,3))+1001 into v_name  from resource_type  where code like v_code||'%'; 
    if v_name is null then 
    :new.code:=v_code||'_'||'001'; 
    else 
      :new.code := v_code||'_'||to_char(substr(v_name,-3,3)); 
      end if; 
    end;