Oracle临时表介绍
目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。当然在Oracle中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在Oracle中创建“临时表”。
在Oracle中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了。Oracle的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在ORACLE系统的临时表空间中
ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SESSION/TRANSACTION的数据,这也是数据安全的一种解决方法 临时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。
两种临时表的语法
create global temporary table 临时表名 on commit preserve|delete rows
用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表
CREATE GLOBAL TEMPORARY TABLE GT_ONE ( SN NUMBER, QTY NUMBER ) ON COMMIT DELETE ROWS; “ON COMMIT DELETE ROWS ” 意思是提交当前事务时删除临时表中的数据。 CREATE GLOBAL TEMPORARY TABLE GT_ONE ( SN NUMBER, QTY NUMBER ) ON COMMIT PRESERVE ROWS; “ON COMMIT DELETE ROWS ” 意思是提交当前事务时不删除临时表中的数据。 不论哪种形式,结束会话时都会删除临时表中的数据,在不同的会话中互不影响。
SESSION级临时表
--建立临时表 create global temporary table temp_tbl(col_a varchar2(30)) on commit preserve rows --插入数据 insert into temp_tbl values('test session table') --提交 commit --查询数据 select *from temp_tbl 可以看到数据'test session table'记录还在 --结束SESSION,重新登录,再查询数据select *from temp_tbl,这时候记录已不存在,因为系统在结束SESSION时自动清除记录
TRANSACTION级临时表
--建立临时表 create global temporary table temp_tbl(col_a varchar2(30)) on commit delete rows --插入数据 insert into temp_tbl values('test transaction table') --提交 commit --查询数据 select *from temp_tbl 这时候可以看到刚才插入的记录'test transaction table'已不存在了;同样,如果不提交而直接结束SESSION,重新登录记录也不存在。
已存在的表插入到临时表
create table SSS ( ID NUMBER, VALUE1 NUMBER ) insert into sss values(1,2); CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS BEGIN execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON COMMIT DELETE ROWS '; execute immediate 'insert into AAA SELECT * FROM sss'; OPEN PO_RESULT FOR 'select * from AAA'; END BBBB;
临时表的应用
1、 当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。 2、 程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。 3、 临时表的索引以及对表的修改、删除等和正常的表是一致的。