使用Oracle基于session的临时表要注意的问题,oraclesession
在Oracle中有两种临时表,一种是基于session,就是当出现commit之后,数据就会被清空;一种是基于session,当session断开后,数据会被清空。
--基于事务的临时表
create global temporary table test(
ID number
)
on commit delete rows;
--基于session的临时表
create global temporary table test
(
ID number
)
on commit preserve rows;
如果你的系统架构是三层架构,有连接池的,如 weblogic+oracle这种架构,其实session是不会退出的,只是请求完毕后,将session还给连接池。如果你操作基于session的临时表,每次操作完表后不做删除操作,那数据会累积。最好的做法是使用完以后truncate,今天在测试环境上使用系统测试发现的问题。
oracle 里面的临时表建立后所有的session都可见,这样其他session也可能在临时表中处理数据。所以注销session时只清空本session的临时表数据,不会清空其它会话临时表中的数据,更不会删除临时表本身。当然如果你一定想删,可以通过执行DROP TABLE来删除临时表。
临时表的创建
创建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 ;
step 1
insert into Student values ()
step 2
commit
Student 还有数据
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 ; 3) 两中类型临时表的区别
step 1
insert into Student values ()
step 2
commit
Student 中没有数据啦
会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,临时表中的数据都将被截断
不管那种创建临时表过程都必须先在数据库中创建 , 与SQL server 不同