//怎么在数据插入表之后,将表中的两个字段信息调换?//将添加到表中的数据调换位置,这个是发生在insert发生时,//那么这个问题就得用触发器来做;//我们是用before触发器还是用after触发器呢?//交换数据,应该是发生在insert之后,所以用after触发器://但是,当我建立好after触发器之后执行,却出现下面的错误提示://ORA-04084: cannot change NEW values for this trigger type//after触发器中,不允许改变新添加值的位置//下面是具体的问题说明:ORA-04084: cannot change NEW values for this trigger typeCause: New trigger variables can only be changed in before row insert or update triggers.Action: Change the trigger type or remove the variable reference.//其实应该使用before触发器;//如果使用after触发器,那么在数据添加到表中后才交换值,这就涉及到表更新;//而在这个insert过程中并没有提交操作,也就是数据并未真正的添加到数据块上,//而是存储在块缓冲区缓存中,所以无法完成交换操作;//使用before触发器,在添加数据之前,也就是将数据添加到块缓冲区缓存里面之前,//我们已经将:new数据交换了位置,当添加到快缓冲区缓存中的时候,已经是交换成功了的值//当我们提交(commit)操作之后,也就是将数据写入数据块中后,我们就可以看到交换位置后的数据了。create table t(c1 varchar2(10 char),a number,b number)/create or replace trigger tri_insertbefore insert on tfor each rowdeclaretemp number;begintemp := :new.a;:new.a := :new.b;:new.b := temp;end tri_insert;insert into tselect 'aaa',56,65 from dual union allselect 'bbb',78,87 from dual union allselect 'ccc',69,96 from dual/SQL> commit;//当我们提交数据之后,我们看到了下面交换值后的结果SQL> select * from t;C1 A B-------------------- ---------- ----------aaa 65 56bbb 87 78ccc 96 69//记住,当你执行一条dml语句之后,一定要记得commit,//不要期待数据块的隐式提交,那样会给我们带来很多的不便。//当然你不提交,在当前session中是能够看到效果的。
原帖:http://topic.csdn.net/u/20110519/17/2cad88a6-4d58-4d91-a94e-2850f9ca7832.html?47618