为解决在for循环遍历下查询数据库的问题

    1.能直接关联查询的,直接关联查询

    2.不能做关联查询的,可先插入临时表,再关联临时表查询

 

 

1. 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的临时表,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;

 

2. 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。ORACLE根据你创建临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。

 

临时表的不足:

1. 不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实,要此功能时就无法使用临时表了。

 

2. 不支持主外键关系。

 

临时表的应用场景

  1.大表分割

         众所周知,为表创建合适的索引可以在很大程度上提高数据查询的速度。但是当某个表的数据量相当大,例如数据量为亿级时,那么创建索引将会花费大量的时间,而且,查询大的索引表,与直接查询数据表相比,在性能上几乎没有任何优势,此时,一个常用的方法就是分割大表,例如:将大表分割为多个小的临时表,然后对这些小表进行相应操作,最后对所有查询结果进行综合处理。

  2.解决并行问题

         当多个进程同时对某张表进行操作时,往往会出现并行问题。

3.作为数据缓存

    在程序段,可能需要对若干数据进行复杂运算。此时,可以创建一个临时表,并将这些数据存储在临时表中。因为可以像操作普通表一样操作临时表,这样,许多函数和sql语句都可以用来处理这些数据。

 

临时表分两种类型的临时表:

1. 会话级临时表

 

2. 事务级临时表

 

临时表:顾明思义,存在该表的数据是临时的。

 

会话临时表:该临时表肯定与会话有关。会话在不退出时,则些临时表中的数据存在,会话退出,该临时表中的数据也会随之消失。在多用户操作的情况下,一个会话从来不阻塞另一个会话使用临时表。即使锁定临时表,一个会话也不会阻塞其他会话使用临时表。

其语法为:

Create global temporary table table_name

    (col1 type1, col2 type2 …)

--这句表示 当事务提交时 保留数据

On commit preserve rows;

 

示例:

Create global temporary table temp_emp

    (

    empno number(8),

    Ename varchar2(30),

    Sal    number(8,2)

    )

On commit preserve rows;

 

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

语法为:

Create global temporary table table_name

    (col1 type1, col2 type2 …)

--这句表示 当事务提交时 删除数据

On commit delete rows;

 

示例:

Create global temporary table temp_dept

    (

    d_no      number(4),

    D_name   varchar2(30),

    D_num    number(8)

    )

On commit delete rows;

 

会话临时表和事务临时表的区别:

在语法上,会话临时表采用on commit preserve rows,而事务临时表采用on commit delete rows;在用途上,会话级临时表只会在会话结束时,临时表中的数据才会被截断。而事务临时表则不管是在事务提交(commit)、事务回滚(rollback)或会话结束,临时表中的数据都会被截断。