`

Oracle Temporary Tables临时表

阅读更多

创建临时表时,ORACLE只创建了表的结构(在数据字典中定义),并没有初始化内存空间,当某一会话使用临时表时,ORALCE会从当前用户的临时表空间分配一块内存空间。也就是说只有向临时表中插入数据时,才会给临时表分配存储空间。

 

临时表分事务级临时表和会话级临时表

1事务级临时表只对当前事务有效,通过语句:ON COMMIT DELETE ROWS 语句指定。 

CREATE GLOBAL TEMPORARY TABLE report_work_area 
(
  startdate DATE, 
  enddate DATE,

  class  CHAR(20)
) ON COMMIT DELETE ROWS;

COMMITROLLBACK之前,数据一直存在,当事务提交之后,表中数据自动清除

 

2会话级临时表对当前会话有效,通过语句:ON COMMIT PRESERVE ROWS语句指定。

CREATE GLOBAL TEMPORARY TABLE report_work_area 
(
  startdate DATE, 
  enddate DATE,

  class  CHAR(20)
) ON COMMIT PRESERVE ROWS;

当我们断开连接或手动执行DELETETRUNCATE之前,临时表中的数据一直存在,并且只有当前会话可以看到,其他会话看不到。当断开会话后,表中数据自动清除。

 

 

 

 

 

 

 

 

1.   简介 

   ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据, 

   或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空, 

   但是临时表的结构以及元数据还存储在用户的数据字典中。 

   临时表只在oracle8i以及以上产品中支持。 

 

2.  详细介绍 

   Oracle临时表分为 会话级临时表 和事务级临时表。 

会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。 

事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。 

临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此, 

临时表不需要DML.当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的 

表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据

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

临时表可以拥有触发器

 

3.    建立临时表 

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

   建立方法

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

CREATE GLOBAL TEMPORARY TABLE admin_work_area 

        (startdate DATE, 

         enddate DATE, 

         class CHAR(20)) 

      ON COMMIT DELETE ROWS; 

EXAMPLE: 

SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 

  2          (startdate DATE, 

  3           enddate DATE, 

  4           class CHAR(20)) 

  5        ON COMMIT DELETE ROWS; 

SQL> create table permernate( a number); 

SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table'); 

SQL> insert into permernate values(1); 

SQL> commit; 

SQL> select * from admin_work_area; 

SQL> select  * from permernate; 

2)ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法

CREATE GLOBAL TEMPORARY TABLE admin_work_area 

        (startdate DATE, 

         enddate DATE, 

         class CHAR(20)) 

     ON COMMIT PRESERVE ROWS; 

 

EXAMPLE: 

 

会话1: 

SQL> drop table admin_work_area; 

SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 

  2          (startdate DATE, 

  3           enddate DATE, 

  4           class CHAR(20)) 

  5       ON COMMIT PRESERVE ROWS; 

SQL> insert into permernate values(2); 

SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary'); 

SQL> commit; 

SQL> select * from permernate; 

 

         A 

---------- 

         1 

         2 

 

SQL> select * from admin_work_area; 

 

STARTDATE  ENDDATE    CLASS 

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

17-1?? -03 17-1?? -03 session temperary 

 

-- transaction level
CREATE GLOBAL TEMPORARY TABLE admin_work_area  
        (startdate DATE,  
         enddate DATE,  
         class CHAR(20))  
      ON COMMIT DELETE ROWS;  
create table permernate( a number);  
insert into admin_work_area values(sysdate,sysdate,'temperary table');  

insert into permernate values(1);  
select * from admin_work_area;  -- there's data
select  * from permernate;  --there's data 

commit;  

select * from admin_work_area;  -- there's NO data
select  * from permernate;  -- there's data
COMMIT;

 

 

 

会话2: 

 

SQL> select * from permernate; 

 

         A 

---------- 

         1 

         2 

 

SQL> select * from admin_work_area; 

 

未选择行

 

 

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

 

 

会话1:

-------- session level
DROP TABLE admin_work_area  ;
CREATE GLOBAL TEMPORARY TABLE admin_work_area  
        (startdate DATE,  
         enddate DATE,  
         class CHAR(20))  
     ON COMMIT PRESERVE ROWS;  -- diff
     
INSERT INTO PERMERNATE VALUES (2);
INSERT INTO ADMIN_WORK_AREA VALUES  (SYSDATE, SYSDATE + 2, 'session temperary');
select * from admin_work_area;  -- there's data
select  * from permernate;  -- there's data
commit;  
select * from admin_work_area;  -- there's data
select  * from permernate;  -- there's data


 

会话2:

 

select * from admin_work_area;  -- there's NO data
select  * from permernate;  -- there's data
分享到:
评论

相关推荐

    Oracle存储过程中使用临时表

    Oracle存储过程中使用临时表 会话级临时表 事务级临时表

    ORACLE 存储过程返回结果集,拼接为字符串输出为clob

    CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB...

    对比Oracle临时表和SQL Server临时表的不同点

    Oracle数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时...

    Oracle_临时表介绍

    目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。当然在Oracle中创建分区是一种不错的选择...那么这个时候我考虑在Oracle中创建“临时表”

    MySQL中的两种临时表

     通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话...

    oracle 临时表详解及实例

    在Oracle8i或以上版本中,可以创建以下两种临时表: 1。会话特有的临时表 CREATE GLOBAL TEMPORARY <TABLE> ( <column> ) ON COMMIT PRESERVE ROWS;  2。事务特有的临时表 CREATE GLOBAL TEMPORARY <TABLE> ( ...

    创建Oracle表空间

    /*第1步:创建临时表空间 */ create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' size 50m autoextend on next 50m maxsize 20480m extent management local; ...

    Oracle12C示例库表结构.sql

    最近装了Oracle12C,但装完之后没有了示例库的相关表,这是从Oracle11g中导出的示例库表结构的SQL,有需要的欢迎下载! 下载请注意: 在Oracle12C中,默认是没有scott开启用户的,需要自己创建,并赋予权限,但是...

    longxuegang#MySQL5.7#241-临时表优化1

    1.背景MySQL包括两类临时表,一类是通过create temporary table创建的临时表,一类是在query过程中using temporary而创

    MYSQL 临时表用法总结

    MYSQL 临时表用法总结 1.背景 老项目最近被吐槽性能不行,经排查发现mysql占用cpu过高,梳理流程发现一些经常被使用的字段需要多张表关联之后可获取,于是想到了临时表; 2.临时表用法总结 将正常的CREATE TABLE语句...

    36.为什么临时表可以重名?1

    1. 建表语法是create temporary table … 2. 一个临时表只能被创建它的session访问,对其他线程不可见 3. 临时表可以与普通表同

    pgtt:PostgreSQL扩展,用于创建,管理和使用Oracle风格的全局临时表以及其他RDBMS

    pgtt是PostgreSQL扩展,用于创建,管理和使用Oracle风格的Global Temporary Tables和其他RDBMS。 此扩展的目的是提出一个扩展,以提供等待核心实现的全局临时表功能。 此扩展的主要目的是在迁移到PostgreSQL时无法...

    MySQL两种临时表的用法详解

    通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不...

    深度解析MySQL 5.7之临时表空间

    在MySQL里的临时表指的就是以create temporary table 这样的关键词创建的表。 3、事务级别临时表 这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表

    Oracle常用的命令如何查看表的结构

    10 temporary tablespace temp --临时表空间为temp 11 profile default --受profile文件的限制 12 quota unlimited on 表空间名; --在表空间下面建表不受限制 4.创建角色 create role 角色名 identified by 密码;...

    MySQL临时表的简单用法介绍

    创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字: CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL ) 临时表将在你连接MySQL期间存在。当你断开时,...

    Oracle数据库创建和授权

    - 删除临时表空间及文件 DROP TABLESPACE ELWY_TEMP INCLUDING CONTENTS AND DATAFILES; -- 创建临时表空间 CREATE TEMPORARY TABLESPACE ELWY_TEMP TEMPFILE 'E:\DataBase\Oracle\ELWY_TEMP.DBF' SIZE 100m ...

    Mysql临时表原理及创建方法解析

    mysql 利用 temporary 关键字就可以创建出一个临时表。创建的这张表会在与服务器的会话终止时自动消失 语法:create temporary table tbl_name…; 规则:每个会话只能看到自己创建的临时表,不同的会话可以创建相同...

    oracle 查询表名以及表的列名

    1.查询表名: 代码如下:select table_name,tablespace_... temporary:是否为临时表(varchar2(1))。 eg: select table_name,tablespace_name,temporary from user_tables where table_name=’TEST_TEMP’; 结果: —

Global site tag (gtag.js) - Google Analytics