`

Oracle 临时表

阅读更多

Oracle中的临时表
临时表有两种一种
1是事务级别的临时表
它在事务结束的时候自动清空记录.

2 是会话级的的临时表
它在我们访问数据库是的一个会话结束后自动的清 空。

关于临时表多用户并行不是问题,一个会话从来不会阻止另一个会话使用临时表。即使“锁定”临时表,一个会话也不会阻止其他会话使用它们的临时表。   如果有在SQL SERVER 和\或sybase中使用临时表的经验,需要主要考虑的不是执行select x,y ,z into #temp from some_table 来创建和装载临时表,而是:   1.对于每一个数据库,创建所有的temp表作为全局临时表。这将作为应用程序安装的一部分完成,就像创建永久表一样。   2.只要在过程中简单的 insert into temp(x,y,z) selelct x,y,z from some_table。只是理解这点,这里的目的不是运行存储过程创建表。在Oracle中这样做不是正确的方法。DDL是一种消耗资源非常大的操作,在 运行时尽量不要使用,应用程序需要的临时表应在应用程序安装时创建,而不是在运行时创建。Oracle中的临时表和其他数据库的临时表是相似的,在每个数 据库中创建临时表一次,不必在数据库中的每个存储过程中创建一次。临时表总是存在的,他们作为对象存在于数据字典中,并且总是保持为空,直到有会话在其中 放入数据。  所有我在这里说明如果我们在存储过程中建临时表,每次都建立一个那么我的系统随着用户的操作调用此存储过程,每次多一个这样的表,我们在不知不觉中数据库中的表的数量会越来越多,而我们还不知道会存在很大的隐患的所有说这点不可小视,为了我们的系统能在客户那里平稳、安全的运行我们一定要注 意这样的问题。如果不手动Drop 表,临时表还是在数据字典中存在的。

Oracle临时表攻略

环境准备
建立两种临时表 ,本例使用scott用户下的emp表中的数据作为临时表数据

--建立两张临时表

--建立事务级临时表(defualt)
create
global
temporary table emp_delete on commit delete rows
as select *
from emp
where 1=2

--建立会话级临时表
create
global
temporary table emp_preserve on commit preserve rows
as select *
from emp
where 1=2

下面说一下两种临时表的异同
相同点:两种表都不能永久的保存记录。他们都是用临时表空间。
不同点:事务级临时表临时表在提交后就回被清空。
              而会话级临时表只有在SESSION 断开后才会被清空。

临时表的使用范围:
建议:在逻辑相当复杂,并且生成的数据


实验步骤如下

向事务级表插入数据

insert into EMP_DELETE

select * from emp


不提交而是在同一个回话中查询这个表的数据
select * from EMP_DELETE 这时候是有数据的。
确认提交
再次查询临时表的数据。
select * from EMP_DELETE
这个时候是没有数据的。在提交的时候,是事务级临时表已经被清空了。



再对会话级临时表做相同的动作。插入数据
insert into EMP_PRESERVE
select * from emp
查询
select *
from EMP_PRESERVE
确认提交
再次查询
select *
from EMP_PRESERVE

仍然有数据。
但是在别的session中却查询不出数据。

select *
from EMP_PRESERVE

当我们关闭这个session的窗口时,数据就被清空了。

当我们使用union 将多个结果集区分的时候,可以使用with构建一张虚拟的临时表
With fis as (select * from emp)

select *
from fis
where empno <7900

union

select *
from fis
where deptno=20

使用它你不用再建立临时表。
但是With 只能在select 中使用,并且只对一条语句使用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics