Oracle临时表(Temporary Table)

Oracle临时表(Temporary Table)

GLOBAL TEMPORARY

指定GLOBAL TEMPORARY创建一个临时表,该表的定义对于具有适当特权的所有会话均可见。临时表中的数据仅对将数据插入表的会话可见。

首次创建临时表时,其元数据存储在数据字典中,但未为表数据分配空间。在表上进行第一次DML操作时,将为表段分配空间。临时表定义的保存方式与常规表的定义相同,但是表段和表包含的任何数据都是会话特定数据或事务特定数据。您可以使用ON COMMIT子句指定表段和数据是特定于会话还是事务。

您可以执行DDL操作(例如ALTER TABLEDROP TABLECREATE INDEX在临时表),只有当没有会话被绑定到它。INSERT通过对该表的操作,会话将绑定到临时表。会话可以使用TRUNCATE语句或在会话终止时解除绑定到临时表,或者对于特定于事务的临时表,通过发出COMMITor ROLLBACK语句解除绑定。

PRIVATE TEMPORARY

指定PRIVATE TEMPORARY创建一个私有临时表。

私有临时表与临时表的不同之处在于,它的定义数据在创建它的会话中可见。使用ON COMMIT子句定义私有临时表的范围:transactionsessionON COMMIT与关键字一起使用的子句DROP DEFINITION创建一个特定于事务的表,在提交事务时将删除其数据定义。这是默认行为。ON COMMIT与关键字一起使用的子句PRESERVE DEFINITION创建一个特定于会话的表,该表在事务提交时将保留其定义。有关ON COMMIT的用法详细信息,请参见此处 条款。

三DDL语句支持专用临时表:CREATEDROP,和TRUNCATE

限制条件

您必须是SYS创建私有临时表以外的用户。

也可以看看:

Oracle Database Concepts提供有关临时表和  创建表:临时表示例 ”的信息

临时表的限制

临时表受以下限制:

  • 临时表不能分区,聚集或组织索引。
  • 您不能在临时表上指定任何外键约束。
  • 临时表不能包含嵌套表的列。
  • 不能指定的以下条款LOB_storage_clauseTABLESPACEstorage_clauselogging_clause
  • 并行UPDATEDELETE并且MERGE不支持临时表。
  • segment_attributes_clause您可以为临时表指定的唯一部分是TABLESPACE,它允许您指定单个临时表空间。
  • 临时表不支持分布式事务。
  • 临时表不能包含INVISIBLE列。

私人临时表的限制

除了临时表的一般限制之外,私有临时表还受到以下限制:

  • 专用临时表的名称必须始终init.ora参数定义的前缀为前缀PRIVATE_TEMP_TABLE_PREFIX。默认值为ORA$PTT_
  • 您不能在私有临时表上创建索引,实例化视图或区域映射。
  • 您不能使用默认值定义列。
  • 您不能在任何永久对象(例如视图或触发器)中引用私有临时表。
  • 通过数据库链接看不到专用临时表。


ON COMMIT

ON COMMIT子句仅在创建全局临时表时才相关。此子句指定临时表中的数据在事务或会话期间是否持续存在。

DELETE ROWS

DELETE ROWS为特定于事务的临时表指定。这是默认值。每次提交后,Oracle数据库都会截断该表(删除其所有行)。

PRESERVE ROWS

PRESERVE ROWS为特定于会话的临时表指定。当您终止会话时,Oracle数据库将截断该表(删除其所有行)。

私有临时表的范围也使用该ON COMMIT子句定义,但使用关键字定义DROP DROP DEFINITION,分别PRESERVE DEFINITION用于定义特定于事务的表或特定于会话的表。

DROP DEFINITION

指定DROP DEFINITION创建一个私有临时表,当事务提交时,其内容和定义将被删除。此专用临时表的范围仅限于事务。这是默认值。

PRESERVE DEFINITION

指定PRESERVE DEFINITION创建一个私有临时表,在提交事务时保留其定义。此专用临时表的范围已扩展到会话。



下面的语句创建了一个临时表today_sales,供示例数据库中的销售代表使用。每个销售代表会话可以在表中存储当天的销售数据。在会话结束时删除临时数据。

CREATE GLOBAL TEMPORARY TABLE today_sales(id number(5))

   ON COMMIT PRESERVE ROWS 

   AS SELECT * FROM orders WHERE order_date = SYSDATE;

相关推荐