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;
after 改成before 试试
3楼:触发器中的DML操作都是单行操作,所以不存在慢的原因,而且我把里面的代码都注视了,留了一个空的操作,结果还是很慢,我觉得应该不是代码问题;
但是你在触发体内有又对这个表的insert语句...
---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; ---你这个触发器无非就是复制你插入的语句跟记录 为何不复制触发表 加个时间字段 建立触发器就可以了何必这么麻烦
6楼:自制事物我研究一下;可以试试你的办法。
7楼:谢谢你研究我的代码,但你只是代码语句优化了,并没有对实际功能进行解决,不过还是谢谢你。
即使我注释掉操作的SQL语句,也很慢;再有就是请问你有没有对这样数据量大的SQL语句有没有好的方法?谢谢!
加入trigger 表的操作本就会变慢
你的外部程序或许一次插入1k条 那么这个trigger也被执行了1k次
还有你不要用应用代码来测试 直接在数据库层测试