问题分析
在Oracle中执行DML语句的时候是需要显示进行提交操作的。当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时 候触发器和插入语句是在同一个事务管理中的,因此在插入语句没有被提交的情况下,我们无法对触发器作用表进行其他额外的操作。如果执行其他额外的操作则会 抛出如上异常信息。
解决方案
:1,我们知道,出错的原因是因为触发器和DML语句在同一事务管理中,所以方案一便是将触发器和DML语句分成两个单独的事务处理。这里可以使用Pragma autonomous_transaction; 告诉Oracle触发器是自定义事务处理。
SQL语句如下:
1 create or replace trigger trigger_insert_cust_rate 2 after insert on t_cr_customer_rate 3 FOR EACH ROW 4 DECLARE 5 V_CON NUMBER(10); 6 pragma autonomous_transaction; --这里是关键的地方,在变量申明的地方,指定自定义事务处理。 7 begin 8 select count(1) 9 into V_CON 10 from t_cr_customer_rate t, t_It_Customer C 11 where t.t_it_customer_id = C.ID 12 and t.valid = 1 13 AND C.ID = :NEW.T_IT_CUSTOMER_ID; 14 --dbms_output.put_line(V_CON); 15 if (V_CON > 0) THEN 16 if (:NEW.Valid = 1) THEN 17 RAISE_APPLICATION_ERROR(-20000, 'CUST DATA IS DISTINCT,NO INSERT'); 18 END IF; 19 END IF; 20 commit; --这里需要显示提交事务 21 end;
文章参考自
http://www.iteye.com/topic/1124681