我正在使用JdbcTemplate
和Oracle存储过程。在 oracle 存储过程中,我有一个选择查询,其中我有像 'IN (SELECT ID FROM GLOBAL_TEMP_TABLE)'
这样的 IN 子句。而临时表的定义是ON COMMIT PRESERVE ROWS
。
但是,当我从 java 调用存储过程时,它给我的记录比我预期的要多,似乎临时表正在存储来自上一个会话的数据。需要你的帮助。
不看任何代码,很难说。
但是,您描述的症状可能只是因为您仍在从同一会话访问数据。
从 Oracle-Base: 全局临时表 (GTT(:
ON COMMIT DELETE ROWS
子句指示应在事务结束时删除数据。ON COMMIT PRESERVE ROWS
子句指示行应保留到会话结束。
也就是说,在您的情况下,您需要关闭会话以清除数据。
全局临时表中选择行时,无法访问上一个会话或其他会话中的数据。有 2 个选项:
- 您的会话不是新的
- 这不是临时表
请记住,如果您使用ON COMMIT PRESERVE ROWS
则必须自己删除行。数据将一直保留到会话结束。
要了解您的会话是否仍然相同,请按以下方式进行查询:
select sid,serial,logon_time from v$session
并将其写入日志文件。