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

(转)在Oracle 数据库中的临时表用法汇总
1 语法?

  在Oracle中,可以创建以下两种临时表:?

  1) 会话特有的临时表?

  CREATE GLOBAL TEMPORARY ( )?

  ON COMMIT PRESERVE ROWS;?

  2) 事务特有的临时表?

  CREATE GLOBAL TEMPORARY ( )?

  ON COMMIT DELETE ROWS;?

  CREATE GLOBAL TEMPORARY TABLE MyTempTable?

  所建的临时表虽然是存在的,但是如果insert 一条记录然后用别的连接登上去select,记录是空的。  ?

  --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)?

  --ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。  ?

  2 动态创建?

  create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as?

  v_num number;?

  begin?

  select count(*) into v_num from user_tables where table_name='T_TEMP';  ?

  --create temporary table?

  if v_num<1 then?

  execute immediate 'CREATE GLOBAL TEMPORARY TABLE T_TEMP (?

  COL1 VARCHAR2(10),?

  COL2 VARCHAR2(10)?

  ) ON COMMIT delete ROWS';?

  end if;  ?

  --insert data?
? ? ? ?--这里为什么不能直接写插入的INSERT语句,因为该表是动态创建的,编译时还没有该表,所以不能直接
? ? ? ?插入表当中,也要采取动态执行SQL的方式。
  execute immediate 'insert into t_temp values('''  v_col1  ''','''  v_col2  ''')';  ?

  execute immediate 'select col1 from t_temp' into v_num;?

  dbms_output.put_line(v_num);?

  execute immediate 'delete from t_temp';?

  commit;?

  execute immediate 'drop table t_temp';?

  end pro_temp;  ?

  测试:  ?

  15:23:54 SQL> set serveroutput on?

  15:24:01 SQL> exec pro_temp('11','22');?

  11  ?

  PL/SQL 过程已成功完成。  ?

  已用时间: 00: 00: 00.79?

  15:24:08 SQL> desc t_temp;?

  ERROR:?

  ORA-04043: 对象 t_temp 不存在  ?

  3 特性和性能(与普通表和视图的比较)?

   临时表只在当前连接内有效?

  临时表不建立索引(临时表也是可以建立索引的,如果不建的话,当数据量大时可能查询效率就比较低),所以如果数据量比较大或进行多次查询时,不推荐使用?

  数据处理比较复杂的时候时表快,反之视图快点?

  在仅仅查询数据的时候建议用游标: open cursor for 'sql clause';?

4 楼?dolphin_ygj?2009-04-13???引用
临时表管理需要注意的地方。?

  临时表相对与其他表来说,是一种比较特殊的表结构,但是,作用又比较大,Oraclee数据库若没有这种表的话,还真是不行。为了管理好这种特殊的表,我们需要注意几个细节。?

  一是要注意临时表不能永久的保存数据。只所以称为临时表,就是因为该表中的内容只是临时存在的。当一个会话或者事务结束时,该表中的内容就会被自动清空。所以,在临时表中,一般不要保存永久数据。在实务中,有个不好的操作习惯,就是有些人在测试数据库的时候,喜欢把测试的数据放在临时数据表中。其实,这是对Oralce临时数据表认识的错误。若我们在数据库中,把要测试的数据,如销售定单的内容放在数据库的临时表中的话,则在其他功能中,如要测试销售定单日报表的功能时,就会找不到相关的定单内容。因为离开特定的会话或者事务的话,临时表中的内容就会不存在了。所以,Oralce数据库中所讲的临时表不是给我们来存储测试数据的。?

  二是临时表中的数据不会备份、恢复,对其的修改也不会有任何的日志信息。若我们在操作数据库的时候,往数据库的临时表中存入了一些信息。此时突然服务器出现当机。此时,我们想通过数据库备份文件恢复数据库临时表中的内容,或者查看临时表的日志信息,都是无法实现的。也就是说,当服务器以外死机重新启动后,临时表中的内容就会被清空。在数据库的任何地方,如数据库备份文件或者日志信息中,都查不到在重新启动之前数据库临时表中保存了哪些内容,就好象根本没有对临时表进行操作一样。?

  三是临时表表空间的管理。临时表在Oraclee数据库中,也是表的一种,其也有对应的表空间。在创建临时表的时候,若我们不指定表空间的话,默认的表空间是SYSTEM。对于临时表的表空间管理的话,我们需要注意一个小的细节。若我们把临时表的表空间归属为SYSTEM的话,也就是说,在创建临时表的时候不具体指定具体的表空间,则这个默认的表空间是不能被删除的。而若我们在创建临时表表空间的时候,指定为SYSTEM以外的表空间的话,则在不需要这表空间的时候,我们可以删除。所以,为了后续管理的方便,笔者还是建议大家在创建临时表的时候,要指定表空间。?

  四是要注意一个问题,临时表只是数据是临时的,而表仍然是永久的。也就是说,当一个会话结束或者一个事务完成时,其临时表中的数据虽然删除了,但是,临时表本身仍然是存在的。也就是说。Oraclee数据库中的临时表表是全局的,只是数据是临时的。这跟SQL Server数据库系统具有比较大的区别。其实,这两个数据库在临时表的处理上有很大的不同,各有各的特色。在以后的文章中,我会专门叙述这两种数据库在临时表管理机制上的不同,欢迎大家关注。?

  五是要注意Oraclee数据库在给临时表填入数据的时候,不会对相应的记录加锁。也就是说,当在临时表上执行DML语句的操作时,不会给记录加锁,也不会将数据的变化内容写到重做(REDO)日志中。所以不能用临时表保存永久的数据,也不能对临时表进行共同的操作。这是新手在管理数据库临时表经常会碰到的问题。?

  六是临时表与普通表之间不能相互转换。在一般情况下,临时表建立后,该表就不能被转换成永久表。所以,这也说明一个道理,利用临时表作为数据库设计时候的测试表不合适。这个临时表可能跟我们按字面意思理解的临时表有误,不是我们所认为的为了测试表结构而建立的临时表。这一点是我们在刚开始接触OracleE数据库时,经常会犯的错误。?