【问题标题】:Oracle Gobal Temp table issueOracle Global Temp 表问题
【发布时间】:2014-12-23 10:37:36
【问题描述】:

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

但是,当我从 java 调用 存储过程 时,它给我的记录比我预期的要多,似乎临时表正在存储上一个会话的数据。需要你的帮助。

【问题讨论】:

  • ON COMMIT PRESERVE ROWS 将保留数据直到会话结束。可能是会话在操作后可能还没有关闭

标签: oracle


【解决方案1】:

Without looking at any code,很难说。

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

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

  • ON COMMIT DELETE ROWS 子句表示应在事务结束删除数据。
  • ON COMMIT PRESERVE ROWS 子句表示应保留行直到会话结束

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

【讨论】:

    【解决方案2】:

    当您从全局临时表中选择行时,您无法访问先前或其他会话中的数据。 有两种选择:

    1. 您的会话不是新的
    2. 这不是临时表

    请记住,如果您使用 ON COMMIT PRESERVE ROWS,您必须自己删除行。数据会一直保留到会话结束。

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

    select sid,serial,logon_time from v$session 
    

    并将其写入日志文件。

    【讨论】:

    • 这可能是来自共享池的会话的问题吗?
    • 是的,谢谢,这也是可能的。如果会话来自连接池,则该会话可能不是新的。然后应使用ON COMMIT DELETE ROWS 创建临时表。如果这不是一个选项,您必须在临时表中存储一些会话信息,以便能够区分不同的会话。
    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 2011-01-11
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多