工作需要,在写一个系统时需要每天统计数据,因此设计了一个处理统计数据的临时表,为节省空间,设计成oracle临时表。正好学习下ORACLE临时表,结合网上资料,小结一下。
ORACLE数据库可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。
可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的定义,但是不能导出数据。表的定义对所有的会话可见。
ORACLE临时表有两种:会话临时表,事务临时表。
会话临时表 | 保存当前会话(session)用到的数据,数据会话期间存在,每次提交后ORACLE将截断表(删除全部行),两个不同的session所插入的数据互不相干。 |
事务临时表 | 保存当前事务用到的数据,数据只在事务期间存在,当中断会话时ORACLE将截断表。会话的数据对于当前会话私有,每个会话只能看到并修改自己的数据,DML锁不会加到临时表的数据上。 |
创建会话临时表:
CREATE GLOBAL TEMPORARY TABLE <TABLE_NAME> (
<column specification>
) ON COMMIT PRESERVE ROWS;
创建事务临时表:
CREATE GLOBAL TEMPORARY TABLE <TABLE_NAME> (
<column specification>
) ON COMMIT DELETE ROWS;
两中类型临时表的区别:
会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,临时表中的数据都将被截断
临时表的大致用处:
1:当某一个 SQL 语句关联的表在 2 张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中
2:程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等……
另网上也有人提到临时表的不足及自己创建临时表的方法,觉得他写的不错,留个链接
http://fangrn.iteye.com/blog/567191