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

创建临时表样例
Oracle8i及以上版本中可以创建两种临时表:
1.会话临时表
  CREATE GLOBAL TEMPORARY TABLE_NAME (column specification)
    ON COMMIT PRESERVE ROWS;

2.事务临时表
    CREATE GLOBAL TEMPORARY TABLE_NAME (column specification)
    ON COMMIT DELETE ROWS;
--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
冲突的问题更本不用考虑.

  通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表,对于事务类型的临时表,
数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在。

  会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到
临时表的数据上。下面的语句控制行的存在性。
 
● ON COMMIT DELETE ROWS 表明行只是在事务期间可见
● ON COMMIT PRESERVE ROWS 表明行在整个会话期间可见

  可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的
定义,但是不能导出数据。表的定义对所有的会话可见。
Temporary Tables临时表
1.简介
   ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。
2.详细介绍
Oracle临时表分为 会话级临时表 和事务级临时表。
会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁.当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的
表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.
你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效.
临时表可以拥有触发器.
3.样例
create or replace procedure tmp_table_procedure
AS
i_count integer;
begin
    select count(*) into i_count from user_objects t where t.OBJECT_TYPE ='TABLE' and t.OBJECT_NAME = upper('T_tran_TEMP');
    if i_count>0 then
        EXECUTE IMMEDIATE 'drop table T_tran_TEMP purge';
    end if;

    select count(*) into i_count from user_objects t where t.OBJECT_TYPE ='TABLE' and t.OBJECT_NAME = upper('T_session_TEMP');
    if i_count>0 then
        EXECUTE IMMEDIATE 'drop table T_session_TEMP
purge';
    end if;
end tmp_table_procedure;
/
call tmp_table_procedure();
drop procedure tmp_table_procedure;
  create global temporary table T_tran_TEMP
(
  NODENAME VARCHAR2(512),
  PATH     VARCHAR2(1024),
  QUALITY  NUMBER
)
on commit preserve ROWS;


create global temporary table T_session_TEMP
(
  NODENAME VARCHAR2(512),
  QUALITY  NUMBER,
  NUM      NUMBER
)
on commit delete rows;