一、全局临时表
1、介绍
创建临时表时,Oracle只创建了表的结构(在数据字典中定义),并没有初始化内存空间,当某一会话使用临时表时,ORALCE会从当前用户的 临时表空间分配一块内存空间。也就是说只有向临时表中插入数据时,才会给临时表分配存储空间。
所有的操作都在一个事务里,事务提交后,此表清空,特别适合做插入删除频率特别高的临时表操作,比如插入完数据就开始查询,查询完就删掉等,用完就扔!
临时表分事务级临时表和会话级临时表。
事务级临时表只对当前事务有效,通过语句:ON COMMIT DELETE ROWS 指定。(默认)
会话级临时表对当前会话有效,通过语句:ON COMMIT PRESERVE ROWS语句指定。
2、建表语句
(1)事务级全局临时表创建语法
create global temporary table t_global_temp( a int ) on commit delete rows;
创建全局临时表指定on commit delete rows一提交即清表,插入不提交即可查询到记录
(2)基于会话方式创建全局临时表
create global temporary table t_global_temp( a int ) on commit preserve rows;
创建全局临时表指定on commit preserve rows,这种临时表不占用表空间,而且不同的SESSION之间互相看不到对方的数据,在会话结束后表中的数据自动清空
3、Temp Table 数据的时效性
(1)On Commit Delete Rows(默认) :
数据在 Transaction 期间有效,一旦COMMIT后,数据就被自动 TRUNCATE 掉了;
(2)On Commit Preserve Rows :
数据在 Session 期间有效,一旦关闭了Session 或 Log Off 后,数据就被 ORACLE 自动 Truncate 掉。
注:这里要说明的是,ORACLE Truncate 掉的数据仅仅是分配给不同 Session 或 Transaction的 Temp Segment 上的数据,而不是将整张表数据 TRUNCATE 掉。
4、关于drop
(1)On Commit Delete Rows :
随时可以drop;
(2)On Commit Preserve Rows :
只有所有的session下都没有数据了,才可以drop;
操作时是,在所有session下truncate数据,或者退出所有session,重新进入进行drop.
4、全局临时表的操作限制
(1) 不能分区,不能集簇化,不能iot化
(2) 不能指定外键约束
(3) 不能包含nested table column
(4) 不能指定lob_storage_clause的参数
(5) 不能启用并行update,delte,merge
(6) 在segment_atrributes_clause子句中,唯一可指定的参数是:tablespace
(7) 不支持分布式事务
(8)有数据的情况下不能添加列,无数据可以添加列
5、Temp Table 的特点
(1) 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的 Temp Segment,
这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;
(2) 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。
ORACLE根据你创建临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。
原文链接:https://blog.csdn.net/weixin_45233227/article/details/114115582
二、私有临时表
1、私有临时表是18c新特性。
Private temporary tables are temporary database objects that are automatically dropped at the end of a transaction or a session. A private temporary table is stored in memory and is visible only to the session that created it.
A private temporary table confines the scope of a temporary table to a session or a transaction, thus providing more flexibility in application coding, leading to easier code maintenance and a better ready-to-use functionality.
私有临时表是数据库的临时对象,私有临时表在事务或者会话结束后被自动drop掉。
私有临时表定义在内存中,只能被创建他的会话看见该表的定义和数据。
By default, rows in a private temporary table are stored in the default temporary tablespace of the user who creates it. However, you can assign a private temporary table to another temporary tablespace during the creation of the temporary table by using the TABLESPACE clause of CREATE PRIVATE TEMPORARY TABLE statement.
私有临时表存储在临时表空间中。
2、私有临时表类别(跟全局临时表比较类似)
(1)事务私有临时表(on commit drop definition)
在事务结束后drop掉私有事务临时表。
语法:create private temporary table ORA$PTT_tab1(a number) on commit drop definition;
(2)会话私有临时表(on commit preserve definition)
当会话结束时,drop掉私有会话临时表
语法:CREATE PRIVATE TEMPORARY TABLE ORA$PTT_tab2(id number) ON COMMIT PRESERVE DEFINITION;
三、全局临时表和私有临时表对比