`

ORACLE 在存储过程中使用临时表

 
阅读更多

 

一 临时表语法

 

    临时表只在Oracle 8i 以及以上产品中支持。  

    语法:

  1. create global temporary table 临时表名 on commit preserve/delete rows    
  2. --preserve:SESSION级的临时表,delete:TRANSACTION级的临时表.  

 

 

    SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。 

当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。当一个会话结束(用户正常退出、用户不正常退出、ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据,但不会清空其它会话临时表中的数据。临时表可以使用触发器。

 

二 临时表ORACLE数据库与sqlserver的区别

 

ORACLE临时表,transaction或者session结束,会清空表数据。但是表还存在。

SQL SERVER临时表,存储在 tempdb 中,当不再使用时会自动删除。

 

 1 SQL SERVER临时表是一种”内存表”,表是存储在内存中的。ORACLE临时表除非执行DROP TABLE,否则表定义会保留在数据字典中;

 2 SQL SERVER临时表不存在类似ORACLE临时表事务级别上的功能;

 3 SQL SERVER本地临时表(#) 与 ORACLE的会话级别临时表类似,但是在会话退出的时候,SQL SERVER会自动删除,ORACLE不会删除表;

 4 SQL SERVER的全局临时表(##) 是指多个连接共享同一片内存。当没有指针引用该内存区域时,SQL SERVER自动释放全局临时表。

 

ORACLE不是一种内存中的数据库,所以如果ORACLE类似SQL SERVER 频繁的对临时表进行建立和删除,必定会影响性能。所以ORACLE会保留临时表的定义直到用户DROP TABLE。

  在ORACLE中,如果需要多个用户共享一个表(类似SQL SERVER的全局临时表##),则可以利用永久表,并且在表中添加一些可以唯一标识用户的列。利用触发器和视图,当用户退出的时候,根据该登陆用户的唯一信息删除相应的表中的数据。 但这种方法给ORACLE带来了一定量的负载。

 

 

三  使用

 

1 判断表不存在就创建表

 

  1. create ...  
  2. is  
  3.     temptable_name varchar2(20);  
  4.     v_count number(1);  
  5. begin  
  6.     temptable_name := 'TEMP_TABLENAME';  
  7.     select count(*) into v_count from tab where tname = temptable_name;  
  8.     if(v_count = 0) then  
  9.         execute immediate 'create table ...';  
  10.     else  
  11.         --其他表存在的操作  
  12.     end if;  

 

 

2 注意使用时,可能会产生的错误:ORA-08103: object no longer exists,ORA-14452  attempt to create, alter or drop an index on temporary table already in use

 

ORA-14452 : 通过1的判断,一般会解决该问题。如果在表使用时,执行删除表操作,会出现该错误。

ORA-08103 : 使用事务级的临时表时,如果,事务提交前执行删除表操作或者在事务提交以后使用,就会产生这样的问题。改成会话级别的可以解决这个问题,但是在会话级别的数据的正确性,可能会因为使用连接池,同一个会话中不同操作而产生错误。

分享到:
评论

相关推荐

    Oracle存储过程中使用临时表

    3. **在存储过程中使用**:在存储过程中,可以直接查询、更新或删除这个临时表中的数据。 4. **结束会话**:会话结束后,临时表及其所有数据将自动消失。 ### 事务级临时表 事务级临时表(Transaction-Level ...

    Oracel储存过程用临时表

    `ON COMMIT PRESERVE ROWS` 选项确保了即使在事务提交后,临时表中的数据仍保留,直到会话结束。另外,还可以选择 `ON COMMIT DELETE ROWS`,这样在事务提交时,所有行都将被删除。 在存储过程中使用临时表,我们...

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    ORACLE中临时表

    Oracle中的临时表是一种特殊的数据结构,用于存储会话或事务期间的数据,这些数据仅对当前会话可见,并在特定条件下自动清除。Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的...

    Oracle 临时表用法

    1. **会话级临时表**:这类临时表中的数据仅在当前会话期间有效。当会话结束时,临时表中的所有数据会被自动清除。 2. **事务级临时表**:这类临时表中的数据仅在一个事务期间有效。当事务提交或回滚后,临时表中的...

    oracle临时表用法

    Oracle 临时表用法 Oracle 临时表是一种特殊的表结构,它可以在数据库中临时存储...但是,使用临时表时需要注意一些问题,例如避免在存储过程中创建临时表,避免在运行时创建临时表,以免导致数据库中的表数量增加。

    主流数据库中临时表的使用

    在临时表中保存的数据只有对当前会话是可见的,任何会话都不能看到其他会话的数据,即使在当前会话 COMMIT 数据以后也是不可见的。多用户并行不是问题,一个会话从来不阻塞另一个会话使用临时表。临时表比正常表产生...

    Oracle中临时表的创建

    局部临时表是一种只能在一个会话中使用的临时表,当会话结束时,所有的数据都会被自动删除。下面是如何创建一个局部临时表的例子: ```sql CREATE LOCAL TEMPORARY TABLE TempTable (id NUMBER, name VARCHAR2(50))...

    一个选查询后插入到一个临时表的oracle函数

    本文将详细解析一个特定的Oracle函数——`NS_DNAF_GetPaidUpDeposit`,该函数旨在执行查询操作,并将结果插入到一个临时表中。通过分析该函数的结构、参数以及执行逻辑,我们可以更好地理解其工作原理及其应用场景。...

    Oracle临时表空间满的解决步骤

    Oracle 临时表空间满是指数据库中的临时表空间达到最大容量,无法继续存储临时数据,影响数据库的正常运行。本文将详细介绍解决 Oracle 临时表空间满的问题的步骤。 第一步:查看当前数据库的默认临时表空间 在解决...

    学习oracle创建一个表空间创建临时表空间创建用户表空间资源的权限

    在Oracle数据库系统中,表空间(Tablespace)是存储数据对象(如表、索引、视图等)的逻辑单位,而临时表空间(Temporary Tablespace)则用于存储临时数据,比如排序或联接操作产生的中间结果。创建和管理表空间及...

    oracle临时表(事务级、会话级).docx

    当会话或事务结束时,临时表中的数据自动清空,但是临时表的结构和元数据还存储在用户的数据字典中。 会话级临时表 会话级临时表是指临时表中的数据只在会话生命周期中存在,当用户退出会话结束的时候,Oracle ...

    Oracle 临时表空间使用注意

    Oracle 临时表空间是Oracle数据库管理系统中的一个重要组成部分,主要用于存储执行特定操作时产生的临时数据,例如排序、连接和聚合操作。这些操作在处理大量数据时尤为常见,因此了解临时表空间的使用注意事项对于...

    oracle存储过程使用游标对多表操作例子

    本文将深入探讨如何在Oracle存储过程中使用游标进行多表操作,具体通过一个示例来展示这一过程。 ### 标题与描述分析 标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,...

    oracle自增长与临时表

    这里的`ON COMMIT DELETE ROWS`选项表示当事务提交时,临时表中的所有行将被删除。 2. **使用临时表**:在会话中,你可以像操作普通表一样对临时表进行INSERT、UPDATE和SELECT等操作。但请注意,不同会话之间无法...

    Oracle临时表

    在设计应用时,不应将重要数据或需要长期保留的数据存储在临时表中。 - **数据不会备份或恢复**:临时表中的数据不会被备份,也不会在恢复过程中被恢复。这意味着一旦数据丢失,将无法找回。 - **无日志记录**:对...

    oracle 存储过程学习总结

    文章中使用了dbms_output.put_line来输出调试信息,这在调试存储过程时非常有用。同时,存储过程可以通过异常处理语句来捕获并处理可能发生的异常情况。 综上所述,Oracle存储过程学习总结提供了一套存储过程编写和...

    不让临时表空间影响ORACLE数据库性能

    在Oracle数据库系统中,临时表空间是用于存储临时数据的特定区域,这些数据通常由排序、聚合、JOIN等操作产生。当处理大量数据或者运行复杂SQL查询时,临时表空间的作用尤为关键。然而,如果不正确地管理和使用临时...

    oracle临时表

    其中`ON COMMIT DELETE ROWS`表示在事务提交后删除临时表中的所有行,另一种选项是`ON COMMIT PRESERVE ROWS`,意味着在事务提交后保留数据,但仅对当前会话可见。 2. **插入数据** 插入数据到临时表的方法与普通...

    Oracle中的临时表讲解

    - 存储过程中的临时表:在存储过程中使用临时表时,同样需要确保在开始操作前清空数据。 - DDL操作:创建、删除临时表的DDL语句不能直接在存储过程或语句块中执行,应存储为字符串,然后用 `EXECUTE IMMEDIATE` 执行...

Global site tag (gtag.js) - Google Analytics