Oracle Global Temp表问题

时间:2014-12-23 10:37:37

标签: oracle

我正在使用JdbcTemplate和Oracle存储过程。在oracle存储过程中,我有一个select查询,其中我有一个像'IN (SELECT ID FROM GLOBAL_TEMP_TABLE)'这样的IN子句。 临时表的定义是ON COMMIT PRESERVE ROWS

然而,当我从java调用存储过程时,它给我的记录超出了我的预期,似乎临时表正在存储来自上一个会话的数据。需要你的帮助。

2 个答案:

答案 0 :(得分:1)

从全局临时表中选择行时,无法访问上一个或其他会话中的数据。 有两个选项:

  1. 您的会话不是新的
  2. 它不是临时表
  3. 请注意,如果您使用ON COMMIT PRESERVE ROWS,则必须自行删除行。数据一直保留到会话结束。

    要确定您的会话是否仍然相同,请查询:

    select sid,serial,logon_time from v$session 
    

    并将其写入日志文件。

答案 1 :(得分:1)

Without looking at any code,很难分辨。

然而,您描述的症状可能只是因为您仍然从同一会话访问数据而引起的。

来自Oracle-Base: Global Temporary Tables (GTT)

  • ON COMMIT DELETE ROWS子句表示应在交易结束时删除数据
  • ON COMMIT PRESERVE ROWS子句表示应该保留行直到会话结束

也就是说,在您的情况下,您需要关闭会话以清除数据。