觸發器無需commit
也不能寫commit
觸發器和觸發它的DML是同一個事務
DML提交了,觸發器的操作也提交了,要不就一起回滾了
當然,如果你一定要在觸發器里寫COMMIT
那就用自治事務
相當於一個事務里的子事務
正常情況下,Oracle規定在觸發器中不能運行 ddl語句和commit,rollback語句。
解決辦法有兩種:
1.在可以在觸發器中加入:pragma autonomous_transaction; 表示自由事務處理。
如:
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);
end if;
commit;
END UPDATE_relaction_SAMPLE;
2.可以另外寫一個方法,把dll語句傳遞到這個方法中去執行。
注釋:
ddl語句:DDL語句用語定義和管理數據庫中的對象,如Create,Alter,Drop,truncate等;DDL操作是隱性提交的!操作立即生效,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger
DML(Data Manipulation Language)數據操縱語言命令使用戶能夠查詢數據庫以及操作已有數據庫中的數據。如insert,delete,update,select等都是DML