Oracle数据库-临时表详解(temporary table)

文章目录

1 概述

2.2 会话级临时表
1 概述
1. 作用:用来 '临时' 存储数据
(1) 当一个事务或会话结束的时候,这个临时表中的 '数据' 会被数据库自动清空
(2) 但 '表结构' 依旧保留

2. 分类: '生命周期的不同'
(1) 事务级临时表: on commit delete rows; commit 时 '删除' 记录(默认)
(2) 会话级临时表: on commit preserve rows; commit 时 '保存' 记录,结束会话时 '删除' 记录

3. 注意
(1) 临时表处理的效率高于普通表
<1> 不记录 '日志'
<2> 只能当前用户使用,不会产生 '锁'
(2) 和普通表操作方式一样

4. 以下测试中,创建临时表后,信息查询
select t.owner,
t.table_name,
t.tablespace_name, -- 所属表空间
t.logging, -- 是否记录日志
t.duration --生命周期
from dba_tables t
where t.owner = 'SCOTT'
and t.table_name in ('TRANSACTION_TEMP', 'SESSION_TEMP');

2 分类
2.1 事务级临时表
create global temporary table transaction_temp (
tid number(3),
tname varchar2(30)
) on commit delete rows; -- on commit delete rows 可省略(默认)

验证:事务中,数据可以查询,事务结束后(commit、rollback)后,数据被清空

insert into transaction_temp(tid, tname) values(1, 'a');
insert into transaction_temp(tid, tname) values(2, 'b');
-- commit;

select * from transaction_temp;

查询截图:

2.2 会话级临时表
create global temporary table session_temp (
tid number(3),
tname varchar2(30)
) on commit preserve rows;

验证:commit 时,保存数据至表中,会话结束后,数据被清空

insert into session_temp(tid, tname) values(1, 'a');
insert into session_temp(tid, tname) values(2, 'b');
commit;

select * from session_temp;

结束会话有以下办法:(上述测试,立马就结束了,执行很快哦)

1. 自然结束(执行完成) -- sql_text => begin :id := sys.dbms_transaction.local_transaction_id; end;
select t1.sid, t1.serial#, t2.sql_text, t2.action
from v$session t1, v$sql t2
where t2.sql_id = t1.prev_sql_id
and t1.username = 'SCOTT';

2. 手动删除
(1) alter system kill session 'sid,serial#';

再新建一个会话,查询:数据被清空了

 一个用户,删除表的时候,会把表的数据都删除,进而影响了其他用户对该表的使用

 
楼上说的在点子上,真正的临时表都是session隔离的,所以多用户并发理论上来说是没有问题的。 如果lz使用普通表来代替了oracle的临时表即建立lz所谓的临时表时没有加temporary 等关键字,就会出现并发问题
 
 
楼主的临时表示普通的表吧? 建议根据你的实际情况,建临时表解决这个问题,下面是关于临时表的介绍等,希望可以帮到你。 临时表顾名思义就是一个临时的表,不仅可以在commit或者session退出之后对数据进行高效清理数据,而且对于不同的回话都是独立的,也就是说a用户登录对全局临时表进行操作后,这时候b用户登录查看全局临时表,根本不会看到任何记录,是不是很神奇,这点可以自行测试哈。 创建语句: create global temporary table tt2(t number) on commit delete/preserve rows;(顺便加一句,oracle过程中使用临时表要用基于session的,因为插入数据会自动隐式提交,而且过程里面不能使用commit,要不然数据会重复) 临时表的使用场合就不用我多说了,基于commit的全局临时表,无论commit或者关闭会话都会清空;而基于session的全局临时表,关闭会话会清空,是不是方便,而且产生的log非常少哦,自己动手试试吧。
 

Oracle临时表分为 会话级临时表 和 事务级临时表。

会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。

事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit orrollback),Oracle自动清除临时表中数据。

临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁。

DML操作的临时表不产生redo log重作日志,但会产生回滚日志Undo log;Undo的产生(rollback segment)会产生Redo log。

当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.

3建立临时表

临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效.

你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效.临时表可以拥有触发器.

posted @ 2022-02-21 16:40  吴土炮Jared  阅读(5111)  评论(0编辑  收藏  举报