我正在使用JdbcTemplate
和Oracle存储过程。在oracle存储过程中,我有一个select查询,其中我有一个像'IN (SELECT ID FROM GLOBAL_TEMP_TABLE)'
这样的IN子句。
临时表的定义是ON COMMIT PRESERVE ROWS
。
然而,当我从java调用存储过程时,它给我的记录超出了我的预期,似乎临时表正在存储来自上一个会话的数据。需要你的帮助。
答案 0 :(得分:1)
从全局临时表中选择行时,无法访问上一个或其他会话中的数据。 有两个选项:
请注意,如果您使用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
子句表示应该保留行直到会话结束。也就是说,在您的情况下,您需要关闭会话以清除数据。