在写PROCEDURES的时候,INSERT和UPDATE是经常碰到的处理.
有时候会要求对表进行INSERT的时候,如果里面已经有了与该条值的KEY值相同的数据,则对该条数据进行UPDATE处理.
方法是在EXCEPTION 里面加WHEN DUP_VAL_ON_INDEX THEN来进行判断...
这时候需要注意的是,如果直接在那个下面进行UPDATE处理的时候,虽然编译是可以通过的.
逻辑也没有任何问题.可是UPDATE处理是执行不到的.具体原因我也说不清楚.但是我碰过多次这种的情况,所用的解决方法是.在前面定义一个中间变量,类型自己定义,NUMBER ,VARCHAR2都可以.我是定义为NUMBER型的FLAG.
在WHEN DUP_VAL_ON_INDEX THEN 里面写FLAG := 1;就是如果发生该情况的时候.把FLAG值设为1.
然后在INSERT处理后面(注意,不是下一层,他们的关系应该是并列的),加个判断
IF FLAG = 1 THEN
UPDATE.....
需要注意的是,在INSERT之前一定要把自己定义的那个中间变量(也就是我用的FLAG)初始化一下.否则就会发生如下的情况.先是发生KEY值重复的情况.然后FLAG = 1,然后下一条数据进行处理,这个时候如果KEY值不重复,正常情况应该是做INSERT处理而不做UPDATE处理,
我们来分析一下.如果没有之前的初始话,这个时候FLAG的值,仍然是1.进行了INSERT处理后,下面的IF FLAG = 1 THEN 的值是TRUE.所以他会继续进行后面的UPDATE处理.这个显然不是我们想要的