create or replace trigger insert_WR_I_DATA_trigger after insert on WR_I_DATA
  for each row  
declare 
  CurrDT  varchar(50); 
  SQLText varchar(200); 
  DELSQL  varchar(1000); 
  KeyValue number(18,0);
 KeyPrimary varchar2(100);
 --p_Addv varchar2(100);
 --p_ST INTEGER;
 begin 
 
 select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') into CurrDT from dual;
 
 select currKeyValue into KeyValue from RSYKeyValue where id = 1; 
 update RSYKeyValue set currKeyValue = currKeyValue  + 1 where id = 1; 
 SQLText :=  'insert into RSYTranPrimary(id, tablename,orctm, currstate) values('''|| KeyValue ||''',''WR_I_DATA'', ''' || CurrDT || ''' ,''0'')';
 execute immediate  SQLText; 
  
  DELSQL := ' insert into WR_I_DATA  (DATAID,ADDV,ST,TMSEND,TMRECEIVE,AFN,DATATYPE,COMMYTYPE,ALARMJLD,ALARMXDCZT,ALARMSWBJ,ALARMSYBJ,ALARMSZBJ,ALARMSLYB,ALARMSB,ALARMSLLEFT,STATEMODE,STATEICENABLE,STATEDZTR,STATESB,STATEXM,STATEDY,LISTBJTYPE,FLAG ) values ( '''||:new.DATAID||''' ,'''||:new.ADDV||''' ,'||:new.ST||' ,'''||:new.TMSEND||''' ,'''||:new.TMRECEIVE||''' ,'||:new.AFN||' ,'||:new.DATATYPE||' ,'||:new.COMMYTYPE||' ,'||:new.ALARMJLD||' ,'||:new.ALARMXDCZT||' ,'||:new.ALARMSWBJ||' ,'||:new.ALARMSYBJ||' ,'||:new.ALARMSZBJ||' ,'||:new.ALARMSLYB||' ,'||:new.ALARMSB||' ,'||:new.ALARMSLLEFT||' ,'||:new.STATEMODE||' ,'||:new.STATEICENABLE||' ,'||:new.STATEDZTR||' ,'||:new.STATESB||' ,'||:new.STATEXM||' ,'||:new.STATEDY||' ,'||:new.LISTBJTYPE||' ,'||:new.FLAG||')';
  KeyPrimary := ''||:new.DATAID||'';
  update RSYTranPrimary set varySQL = DELSQL||'|'||KeyPrimary||'|'||'WR_I_DATA',addv=''||:new.addv||'',st=:new.st  where id  = KeyValue;
  
 end;

解决方案 »

  1.   

    这个是在表写的一个触发器,外部程序对此表进行insert时会很慢,关掉我这个触发器,速度很快,看了许久未发现问题,盼会的朋友过来帮帮忙,谢谢
      

  2.   

    after insert on WR_I_DATA
    after 改成before 试试
      

  3.   

    主要是看你触发体中的那些DML操作,会不会很慢?
      

  4.   

    2楼:我可以试试,如果可以立即给分;
    3楼:触发器中的DML操作都是单行操作,所以不存在慢的原因,而且我把里面的代码都注视了,留了一个空的操作,结果还是很慢,我觉得应该不是代码问题;
      

  5.   

    你的触发器是在表WR_I_DATA而你又有对本表进行插入操作,要用自治事务进行控制
      

  6.   

    你的这个触发器是对WR_I_DATA的insert触发的
    但是你在触发体内有又对这个表的insert语句...
      

  7.   


    ---select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') into CurrDT from dual;
     
     select currKeyValue into KeyValue from RSYKeyValue where id = 1; 
     update RSYKeyValue set currKeyValue = currKeyValue  + 1 where id = 1; 
     SQLText :=  'insert into RSYTranPrimary(id, tablename,orctm, currstate) values('''|| KeyValue ||''',''WR_I_DATA'', ''' || CurrDT || ''' ,''0'')';
     execute immediate  SQLText; 
    ----改成这样就可以了 完全没有必要什么动态  能静态就静态 少了解析的时间
     select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),currKeyValue into CurrDT,KeyValue  from RSYKeyValue where id = 1; 
     insert into RSYTranPrimary(id, tablename,orctm, currstate)  select KeyValue,'WR_I_DATA',CurrDT,'0' from RSYKeyValue where id = 1;
     update RSYKeyValue set currKeyValue = currKeyValue  + 1 where id = 1; ---你这个触发器无非就是复制你插入的语句跟记录  为何不复制触发表 加个时间字段 建立触发器就可以了何必这么麻烦
      

  8.   

    5楼:这张表是过一段时间处理1000条数据,应该不是数据量大的问题,我就是注释掉操作的SQL语句,程序执行还是很慢!
    6楼:自制事物我研究一下;可以试试你的办法。
    7楼:谢谢你研究我的代码,但你只是代码语句优化了,并没有对实际功能进行解决,不过还是谢谢你。
      

  9.   

    for each row, 不慢也很慢啊,遍历这么多行.....
      

  10.   

    10楼朋友:
    即使我注释掉操作的SQL语句,也很慢;再有就是请问你有没有对这样数据量大的SQL语句有没有好的方法?谢谢!
      

  11.   

    如果trigger里没代码也慢  那就和里面的代码没关系了
    加入trigger  表的操作本就会变慢
    你的外部程序或许一次插入1k条  那么这个trigger也被执行了1k次
    还有你不要用应用代码来测试   直接在数据库层测试
      

  12.   

    可能会是 你获取 key 的那个代码,会不会死锁哦
      

  13.   

    你的Trigger是有Insert触发的,但程序中又包含了对自身表的Insert,这样会造成循环啊。