这几天在一个老生产系统中出现了一个问题,在修改数据的时候报错:
no changes made to database
insert into "xxxxx"("id","c1","c2",c3,c4,c5) values(:1,:2,:3,:4,:5,:6)
经过排查发现是系统通过一个view修改一张表的时候出现这个错误,该view是通过三张表t1,t2,t3关联而成的:
select a.id,a.c1,a.c2,a.c3.a.c4,a.c5,b.vv,c.gh
from t1 a,t2 b,t3 c
where a.moid=b.moid and a.cdid=c.cdid
造成这个错误的原因是更新的列不是事实表的列,而是维度表的列。换句话说,如果view是几张表关联而成的,在关联中关联字段是主键的表是维度表,维度表形成的列是不能进行更新的,如上的vv和gh列,如果更新语句涉及了这些列,就会出现ORA-01799错误;而关联字段不是表主键的表就是事实表,事实表形成的列就是可更新的。如果是两张表的主键字段进行关联,那么无论通过view都可以更新这2张表的字段。
进过排查,发现上面的view中的where语句里面cdid既不是a的主键也不是c的主键,造成a表的所有字段都不是可以进行跟新的,程序的原意是要通过view跟新a表的,因此将a.cdid=c.cdid更改成c表的主键bid就行了:
a.bid=c.bid
总结:在通过view修改基表的情况一定要注意生成view的语句关联字段的书写