【发布时间】: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,则不应在运行时创建它。考虑改用集合,但不清楚你真正想要做什么。