Oracle临时表(Temporary Table)
GLOBAL TEMPORARY
指定GLOBAL TEMPORARY
创建一个临时表,该表的定义对于具有适当特权的所有会话均可见。临时表中的数据仅对将数据插入表的会话可见。
首次创建临时表时,其元数据存储在数据字典中,但未为表数据分配空间。在表上进行第一次DML操作时,将为表段分配空间。临时表定义的保存方式与常规表的定义相同,但是表段和表包含的任何数据都是会话特定数据或事务特定数据。您可以使用ON COMMIT子句指定表段和数据是特定于会话还是事务。
您可以执行DDL操作(例如ALTER
TABLE
,DROP
TABLE
,CREATE
INDEX
在临时表),只有当没有会话被绑定到它。INSERT
通过对该表的操作,会话将绑定到临时表。会话可以使用TRUNCATE
语句或在会话终止时解除绑定到临时表,或者对于特定于事务的临时表,通过发出COMMIT
or 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,供示例数据库中的销售代表使用。每个销售代表会话可以在表中存储当天的销售数据。在会话结束时删除临时数据。
CREATE GLOBAL TEMPORARY TABLE today_sales(id number(5))
ON COMMIT PRESERVE ROWS
AS SELECT * FROM orders WHERE order_date = SYSDATE;
GLOBAL TEMPORARY
指定GLOBAL TEMPORARY
创建一个临时表,该表的定义对于具有适当特权的所有会话均可见。临时表中的数据仅对将数据插入表的会话可见。
首次创建临时表时,其元数据存储在数据字典中,但未为表数据分配空间。在表上进行第一次DML操作时,将为表段分配空间。临时表定义的保存方式与常规表的定义相同,但是表段和表包含的任何数据都是会话特定数据或事务特定数据。您可以使用ON COMMIT子句指定表段和数据是特定于会话还是事务。
您可以执行DDL操作(例如ALTER
TABLE
,DROP
TABLE
,CREATE
INDEX
在临时表),只有当没有会话被绑定到它。INSERT
通过对该表的操作,会话将绑定到临时表。会话可以使用TRUNCATE
语句或在会话终止时解除绑定到临时表,或者对于特定于事务的临时表,通过发出COMMIT
or 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;