【问题标题】:temporary tables in Java procedures (Oracle DB)Java 过程中的临时表 (Oracle DB)
【发布时间】:2016-03-21 11:51:10
【问题描述】:

我在使用临时表在 Oracle DB 中存储我的 java 过程的输出结果时遇到问题。

Connection connection =
DriverManager.getConnection("jdbc:default:connection:");
...
st.executeUpdate("CREATE GLOBAL TEMPORARY TABLE TT1 (id NUMBER, name VARCHAR2(10)) ON COMMIT DELETE ROWS");
st.executeUpdate("INSERT INTO TT1 VALUES (1, 'Scott')");
...

执行程序后,我想使用 SQL 代码管理临时表中的数据,但临时表“不存在”。它是否因为我在 java 中提交而被删除?

我尝试使用 ON COMMIT PRESERVE ROWS 创建表,但结果相同。 是不是因为 java 正在另一个会话中运行?

【问题讨论】:

  • 这是因为临时表只在你的连接被连接的时候存在。我建议将所有数据库工作转移到 Oracle 存储过程,然后将最终结果发送到 java。
  • 该表不会被提交删除,但其中的数据将被删除,因为 ON COMMIT DELETE ROWS 子句。它也只对同一个会话可见,因此使用 PRESERVE ROWS 如果您使用连接池和/或释放其间的连接,您可能仍然看不到数据。但是,真正需要 GTT 是不寻常的,如果您确实需要 GTT,则不应在运行时创建它。考虑改用集合,但不清楚你真正想要做什么。

标签: java sql oracle


【解决方案1】:

其实临时表有2种.. 1.交易特定 2.特定会话

在上面的示例中,您正在使用特定于事务的临时表,因为您提交对 DB 表的更改会从临时表中删除。
当您使用 ON COMMIT PRESERVE ROWS 创建表时,您正在处理特定于会话的表,因此您需要在同一个会话中进行更改

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 2015-02-15
    • 1970-01-01
    • 2019-09-12
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多