Oracle 临时表

来源:互联网 发布:笔记本怎么切换网络 编辑:程序博客网 时间:2024/06/05 03:13

一、简介

    Oracle 数据库除了可以保存永久表外,还可以建立临时表(temporary tables)。这些临时表用来保存一个会话(SESSION)的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交(commit)和回滚(rollback)事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。

    Oracle 临时表分为“会话级临时表”和“事务级临时表”。
    “会话级临时表”是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
    “事务级临时表”是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
    临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁。

    当一个会话结束(用户正常退出、用户不正常退出 Oracle 、实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据。但不会清空其它会话临时表中的数据。

    你可以在临时表上建立索引和在临时表基础上建立视图。同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效。临时表可以拥有触发器。

    临时表的定义对所有会话(SESSION)都是可见的,但是表中的数据只对当前的会话或者事务有效。

二、建立方法

1. ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法。

SQL> CREATE GLOBAL TEMPORARY TABLE test_tab (
  2     id VARCHAR2(10) NOT NULL,
  3     name VARCHAR2(20),
  4     test_date DATE
  5  ) ON COMMIT DELETE ROWS;

Table created.

SQL> desc test_tab
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 ID                                        NOT NULL VARCHAR2(10 CHAR)
 NAME                                               VARCHAR2(20 CHAR)
 TEST_DATE                                          DATE

SQL> insert into test_tab values ('001', 'Fred', sysdate);

1 row created.

SQL> select * from test_tab;

ID                   NAME                                     TEST_DATE
-------------------- ---------------------------------------- ----------
001                  Fred                                     04-5月 -07

SQL> commit;

Commit complete.

SQL> select * from test_tab;

no rows selected

SQL>

2. ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法.
会话1:
SQL> drop table test_tab;

Table dropped.

SQL> CREATE GLOBAL TEMPORARY TABLE test_tab (
  2     id VARCHAR2(10) NOT NULL,
  3     name VARCHAR2(20),
  4     test_date DATE
  5  ) ON COMMIT DELETE ROWS;

Table created.

SQL> insert into test_tab values ('001', 'Fred', sysdate);

1 row created.

SQL> select * from test_tab;

ID                   NAME                                     TEST_DATE
-------------------- ---------------------------------------- ----------
001                  Fred                                     04-5月 -07

SQL>

会话2:
SQL> select * from test_tab;

no rows selected

SQL>

会话2看不见会话1中临时表的数据。

原创粉丝点击