//怎么在数据插入表之后,将表中的两个字段信息调换? //将添加到表中的数据调换位置,这个是发生在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 type Cause: 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_insert before insert on t for each row declare temp number; begin temp := :new.a; :new.a := :new.b; :new.b := temp; end tri_insert; insert into t select 'aaa',56,65 from dual union all select 'bbb',78,87 from dual union all select 'ccc',69,96 from dual / SQL> commit; //当我们提交数据之后,我们看到了下面交换值后的结果 SQL> select * from t; C1 A B -------------------- ---------- ---------- aaa 65 56 bbb 87 78 ccc 96 69 //记住,当你执行一条dml语句之后,一定要记得commit, //不要期待数据块的隐式提交,那样会给我们带来很多的不便。 //当然你不提交,在当前session中是能够看到效果的。 原帖:http://topic.csdn.net/u/20110519/17/2cad88a6-4d58-4d91-a94e-2850f9ca7832.html?47618