作者:eggplant | 来源:互联网 | 2023-08-11 12:28
【前言】今天开发人员遇到一个temp表找不到数据的问题,稍微了解了一下,感觉还有很多知识点的,所以整理下来供大家参考;
【简介】业务的实现过程中并不是所有的数据都是永久的存放在数据库中的,有些业务在实现的过程中会通过一些临时表或中间表去存放数据,当业务实现完成后临时表或中间表的数据就可以删除掉。基于这个业务特性,Oracle的GLOBAL TEMPORARY TABLE就满足了这个业务的功能;
【注】有些开发人员会创建一个实体表,就临时存放数据,当这个业务过程完成之后再把这个实体表drop掉,实现这个temp表的功能;
【详细介绍】
概念描述:临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁。
当一个会话结束(用户正常退出 用户不正常退出ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行TRUNCATE 语句清空临时表数据。
但不会清空其它会话临时表中的数据,你可以索引临时表和在临时表基础上建立视图。同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效。
类别:Oracle临时表分为会话级临时表和事务级临时表。
会话级临时表:指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
事务级临时表:指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
【创建脚本】
ON COMMIT DELETE ROWS :建立事务级临时表的方法
脚本:
create global temporary table TEST1
( id number)
on commit delete rows ;
ON COMMIT PRESERVE ROWS :创建会话级临时表的方法
脚本:
create global temporary table TEST3
(id number)
on commit preserve rows ;
【实验操作】
一、创建global temporary table TEST1,插入数据1,在session1中查看数据;
#
#
对于global temporary table ,session之间是隔离的状态;
二、ON COMMIT DELETE ROWS的测试
#
数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
三、ON COMMIT PRESERVE ROWS 会话级临时表的测试
#
进行COMMIT之后还能查询到插入的数据,虽然事务结束了,但是会话还是继续存在的;
#
退出之后重新登录,表中的数据已经被truncate,因为会话已经结束了,这是基于会话级别的临时表;
【总结】oracle的temp表的这两种模式已经能够满足实际的开发过程中的关于数据临时存放的问题了。理解技术就是为了更好的利用技术,理解了临时表的这两种设定,对于实际工作的进行有很大的帮助的;