【问题标题】:Delete temporary table with 'ON COMMIT PRESERVE ROWS' option in oracle在 oracle 中使用“ON COMMIT PRESERVE ROWS”选项删除临时表
【发布时间】:2015-06-14 17:20:01
【问题描述】:

我使用 jdbc 和 oracle db。如何使用 otion ON COMMIT PRESERVE ROWS 创建全局临时表,然后使用另一条语句删除该表? 我的代码示例如下所示。

queryOfStatement1 = "CREATE GLOBAL TEMORARY TABLE MY_TABLE (ID VARCHAR(20 BYTE), NAME VARCHAR(20 BYTE)) ON COMMIT PRESERVE ROWS"; statement1.execute(); statement1.commit(); queryOfStatement2 = "DROP TABLE MY_TABLE"; statement2.execute(); statement2.commit();

【问题讨论】:

  • 这不是使用全局临时表的正确方法。它们与 T-SQL 中的临时表不同,后者更像是内存中的集合..

标签: java oracle jdbc


【解决方案1】:

如Oracle官方文档中所述:“临时表在要缓冲(临时持久化)结果集的应用程序中很有用。在会话期间,行程数据是私有的。在会话结束时,可选行程被丢弃。”

您也不能在同一个会话中更改表定义,您必须断开连接并连接才能更改或删除您的临时表。

在你的例子中:

SQL> show user
USER is "Z_TEST"
SQL>


SQL> CREATE GLOBAL TEMPORARY TABLE MY_TABLE
  2  (
  3    ID VARCHAR(20 BYTE),
  4    NAME VARCHAR(20 BYTE)
  5  )
  6  ON COMMIT PRESERVE ROWS ;

Table created.

SQL> insert into my_table values ('this is id','this name') ;

1 row created.

SQL> commit ;

Commit complete.

SQL>

/* alter table example */

SQL>alter table
    my_table
    add
   (col3 varchar2(100));

ERROR at line 1:
ORA-14450: attempt to access a transactional temp table already in use

SQL> drop table my_table ;
drop table my_table
           *
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

SQL>

SQL> show user
USER is "Z_TEST"
SQL> select * from my_table ;

ID                   NAME
-------------------- --------------------
this is id           this name

SQL>

/* DISCONNECT SESSION AND CONNECT AGAIN */
SQL> conn z_test/welcome1
Connected.

SQL> show user
USER is "Z_TEST"
SQL> select * from my_table ;

no rows selected

SQL>

SQL>  alter table
    my_table
    add
   (col3 varchar2(100)) ;  


Table altered.

SQL>

SQL> drop table my_table ;

Table dropped.

SQL>

重要的是要注意,当您断开/连接时,您会发现“空表”,正如我在开头所说的那样:“在会话结束时,可选行程被丢弃。”。您的应用程序设计必须考虑这种预期行为。

【讨论】:

  • “临时表只存在于内存中”。不对。全局临时表的内容被写入 - 并从 - 临时表空间(即磁盘)中读取。这可能是一个巨大的开销,也是我们应该只在没有更好的选择时才使用 GTT 的主要原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多