Chinaunix首页 | 论坛 | 博客
  • 博客访问: 428847
  • 博文数量: 55
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-04 15:15
个人简介

热衷技术,热爱交流

文章分类

全部博文(55)

文章存档

2014年(7)

2013年(48)

分类: Oracle

2013-06-16 20:53:35


  临时表


Temporary Tables

1.  临时表就是为会话或者事务创建的表。对于会话级别的临时表,会话结束时候,临时表就被truncate,对于事务级别的临时表,事务提交或者回滚时候            被truncateon commit关键字用于确定是哪种临时表。

2.  创建临时表时候,只是在数据库中定义了一个永久的数据字典定义,在插入数据后才在临时表空间中分配临时段。

3.  临时表是静态的,所以可以为临时表创建索引,视图,触发器等对象。

4.  由于临时表的特征,临时表一般不支持常规表的很多特性,例如压缩,外键(无法参考其他表,也无法被其他表参考)等,所以临时表一般只能是单表存在。

1. 会话级别临时表:

会话1

HR >create global temporary table test(id date) on commit preserve rows;

Table created.

HR >insert into test values(sysdate);

HR >select table_name,TEMPORARY from user_tables where table_name='TEST';

TABLE_NAME                    |T

------------------------------|-

TEST                          |Y

HR >select dbms_metadata.get_ddl('TABLE','TEST') from dual;

DBMS_METADATA.GET_DDL('TABLE','TEST')

--------------------------------------------------------------------------------

 

  CREATE GLOBAL TEMPORARY TABLE "HR"."TEST"

   (    "ID" DATE

   ) ON COMMIT PRESERVE ROWS

HR >select * from test;

ID

-------------------

2013-06-16 12:36:03

HR >select username,sqladdr,sqlhash,blocks from v$sort_usage;

USERNAME       |SQLADDR         |   SQLHASH|    BLOCKS

---------------|----------------|----------|----------

HR             |000000006B9FA368|1029988163|       128

 

新建会话2查看:

HR >select * from test;

no rows selected

退出会话1,在会话2中查看:

HR >select username,sqladdr,sqlhash,blocks from v$sort_usage;

no rows selected

2   事务级别临时表

会话1

HR >truncate table test;

Table truncated.

HR >drop table test;   

Table dropped.

建立临时表:

HR > CREATE GLOBAL TEMPORARY TABLE "HR"."TEST"

  2     (    "ID" DATE

  3     ) ON COMMIT delete ROWS;

 临时段已经分配:

HR >select username,sqladdr,sqlhash,blocks from v$sort_usage;

 

USERNAME       |SQLADDR         |   SQLHASH|    BLOCKS

---------------|----------------|----------|----------

HR             |000000006B9FA368|1029988163|       128

插入数据

HR >insert into test values(sysdate);

1 row created.

HR >select * from test;

ID

-------------------

2013-06-16 13:27:57

 

HR >commit;

 

Commit complete.

 

HR >select * from test;

no rows selected

3   临时表用途

1. 多表关联查询,查询表较多,可以把查询结果放在临时表,在会话过程中直接访问临时表即可,这样可以提高查询效率。当然Oracle本身就会对二次查询进行优化,所以这需要很好地理解业务逻辑,从而决定是否需要。

create global temporary table test on commit preserve rows as select a.FIRST_NAME,b.JOB_TITLE from employees a,jobs b where a.job_id=b.job_id;;

2. 强调用户会话操作的独立性。

3. 程序执行过程中可能需要存放一些临时的数据(例如出报表),这些数据在整个程序的会话过程中都需要用到。

阅读(2209) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~