Carlos 2020-05-26
GLOBAL TEMPORARY
指定GLOBAL TEMPORARY创建一个临时表,该表的定义对于具有适当特权的所有会话均可见。临时表中的数据仅对将数据插入表的会话可见。
首次创建临时表时,其元数据存储在数据字典中,但未为表数据分配空间。在表上进行第一次DML操作时,将为表段分配空间。临时表定义的保存方式与常规表的定义相同,但是表段和表包含的任何数据都是会话特定数据或事务特定数据。您可以使用ON COMMIT子句指定表段和数据是特定于会话还是事务。
您可以执行DDL操作(例如ALTER TABLE,DROP TABLE,CREATE INDEX在临时表),只有当没有会话被绑定到它。INSERT通过对该表的操作,会话将绑定到临时表。会话可以使用TRUNCATE语句或在会话终止时解除绑定到临时表,或者对于特定于事务的临时表,通过发出COMMITor ROLLBACK语句解除绑定。
PRIVATE TEMPORARY
指定PRIVATE TEMPORARY创建一个私有临时表。
私有临时表与临时表的不同之处在于,它的定义和数据仅在创建它的会话中可见。使用ON COMMIT子句定义私有临时表的范围:transaction或session。ON COMMIT与关键字一起使用的子句DROP DEFINITION创建一个特定于事务的表,在提交事务时将删除其数据和定义。这是默认行为。ON COMMIT与关键字一起使用的子句PRESERVE DEFINITION创建一个特定于会话的表,该表在事务提交时将保留其定义。有关ON COMMIT的用法详细信息,请参见此处 条款。
三DDL语句支持专用临时表:CREATE,DROP,和TRUNCATE。
限制条件
您必须是SYS创建私有临时表以外的用户。
也可以看看:
Oracle Database Concepts提供有关临时表和 “ 创建表:临时表示例 ”的信息
临时表的限制
临时表受以下限制:
LOB_storage_clause:TABLESPACE,storage_clause或logging_clause。UPDATE,DELETE并且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,供示例数据库中的销售代表使用。每个销售代表会话可以在表中存储当天的销售数据。在会话结束时删除临时数据。
ON COMMIT PRESERVE ROWS
AS SELECT * FROM orders WHERE order_date = SYSDATE;