触发器无需commit
也不能写commit
触发器和触发它的DML是同一个事务
DML提交了,触发器的操做也提交了,要不就一块儿回滚了
固然,若是你必定要在触发器里写COMMIT
那就用自治事务
至关于一个事务里的子事务数据库
正常状况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。对象
解决办法有两种:事务
1.在能够在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
如:ip
create or replace trigger UPDATE_relaction_SAMPLE
before update ON SAMPLE
REFERENCING
FOR EACH ROW
DECLARE
pragma autonomous_transaction;
verror int;
BEGIN
verror:=0;
update sample_relation t set t.status=:new.status where t.sample_id=:new.trim_idnumeric;
if :new.status='C' and :old.status<>'C' then
proc_synch_procedure_data(:new.trim_idnumeric,verror);
it
end if;
commit;
END UPDATE_relaction_SAMPLE;io
2.能够另外写一个方法,把dll语句传递到这个方法中去执行。date
注释:
ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操做是隐性提交的!操做当即生效,原数据不放到rollback segment中,不能回滚. 操做不触发trigger
DML(Data Manipulation Language)数据操纵语言命令使用户可以查询数据库以及操做已有数据库中的数据。如insert,delete,update,select等都是DMLselect