我先建了一个临时表TMP_A,是session级别的(on commit preserve rows)我在SP中往这个临时表插入数据做中间计算,然后连续执行两次这个SP(传给它的参数不同)我的疑问是:
1.第一次运行完这个SP以后,临时表会自动清空吗?如果会就没问题了,两次运行SP不会相互影响。
2.但如果不会的话,那第二次执行时临时表里的数据就会重复了,第二次运行的结果就不对了,那有什么办法解决这个问题呢?

解决方案 »

  1.   

    你测试过数据不正确了吗?既然ORACLE有临时表这个东西也当然会考虑并发的问题。只要你COMMIT了就不会有问题。
    而且不是没有其他办法的情况俺一般不会用临时表。
      

  2.   

    是的,我测试过数据不正确。我在同一个连接中运行一遍SP,跑完以后马上再运行一遍,结果是不正确的,临时表里面的数据是重复的,
    所以我觉得因为运行完第一遍SP后连接不会自动被断开,还是处于同一个session,所以会话级别的临时表就不会自动清空了。不知道有什么办法解决?在SP里面明文清空它吗?(execute immediate 'truncate table tmp_a'?)
      

  3.   

    把临时表改为on commit delete rows;
    然后在你的存储过程中最后加一句commit
      

  4.   

    你如果是建on commit preserve rows, Commit 后会再当前会话下保留数据.你可以在插入数据之前先truncate.其它的会话是看不到现在会话的数据.
      

  5.   

    insert之前先判断临时表中是否已有本期插入的数据,如要则先delete 再insert
      

  6.   

    因为我的SP要做较大数据量的delete和insert,所以我写了分段commit(SP中有多处commit)。这个临时表在整个SP都要用到,所以就不能用on commit delete rows这种形式咯。看来只好在SP开始的地方把它truncate,如果有另一个连接同时跑这个SP,那么我在SP开始的地方写execute immediate 'truncate table tmp_a'不会相互影响吧?