日期:2014-05-16  浏览次数:20465 次

Oracle--临时表(会话、事务)

? ? ? ? 目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。

  当然在Oracle中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在Oracle中创建“临时表”。

?

?

?

Oracle临时表有两种:会话级的临时表和事务级的临时表。

?

1)会话级的临时表

? ? ? ? 因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断(truncate table,即数据清空)了。

? ? ? ? 会话级的临时表创建方法:

Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) On Commit Preserve Rows;
举例:
create global temporary table Student(
                         Stu_id Number(5),
                         Class_id  Number(5),
                         Stu_Name Varchar2(8),
                         Stu_Memo varchar2(200)

) 
on Commit Preserve Rows ;

?注:会话级(Session关闭掉之后数据就没有了,当Commit的时候则数据还在,当Rollback的时候则数据也是一样被回滚):

?

?

2)事务级临时表

? ? ? ? 是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表也会被自动截断)。

? ? ? ? 事务级临时表的创建方法:

Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) On Commit Delete Rows;
举例:
create global temporary table Classes(
                         Class_id Number(5),
                         Class_Name Varchar2(8),
                         Class_Memo varchar2(200)
)
on Commit delete Rows ;

?注:事务级(Commit之后就删除数据)

?

?

3)两种不通类型的临时表的区别:

? ? ? ? 语法上,会话级临时表采用on commit preserve rows而事务级则采用on commit delete rows;