Oracle数据库中的临时表用法

本文介绍Oracle数据库中的临时表,包括会话特有的临时表和事务特有的临时表的创建语法,并通过一个动态创建临时表的例子展示了其使用方法。同时,还对比了临时表与普通表和视图的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要介绍了Oracle数据库中的临时表用法,希望对大家的学习和工作有所帮助。

 

 

一:语法

 

在Oracle中,可以创建以下两种临时表:

(1) 会话特有的临时表

 

CREATE GLOBAL TEMPORARY ( ) 

ON COMMIT PRESERVE ROWS;  

(2) 事务特有的临时表

 

CREATE GLOBAL TEMPORARY ( ) 

ON COMMIT DELETE ROWS; 

CREATE GLOBAL TEMPORARY TABLE MyTempTable  

所建的临时表虽然是存在的,但是如果insert 一条记录然后用别的连接登上去select,记录是空的。  

--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)

--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。  

 

 

二:动态创建

 

create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as 

v_num number; 

begin 

select count(*) into v_num from 
user_tables where table_name=''T_TEMP'';   

--create temporary table 

if v_num<1 then 

execute immediate ''CREATE GLOBAL TEMPORARY TABLE T_TEMP ( 

COL1 VARCHAR2(10), 

COL2 VARCHAR2(10) 

) ON COMMIT delete ROWS''; 

end if;   

--insert data 

execute immediate ''insert into t_temp values
(''''''  v_col1  '''''',''''''  v_col2  '''''')'';   

execute immediate ''select col1 from t_temp'' into v_num; 

dbms_output.put_line(v_num); 

execute immediate ''delete from t_temp''; 

commit; 

execute immediate ''drop table t_temp''; 

end pro_temp;  

 

 

测试:  

 

15:23:54 SQL> set serveroutput on 

15:24:01 SQL> exec pro_temp(''11'',''22''); 

11   

PL/SQL 过程已成功完成。   

已用时间: 00: 00: 00.79 

15:24:08 SQL> desc t_temp; 

ERROR: 

ORA-04043: 对象 t_temp 不存在  

 

三:特性和性能(与普通表和视图的比较)

 

 

临时表只在当前连接内有效

临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用

 

 

数据处理比较复杂的时候时表快,反之视图快点

在仅仅查询数据的时候建议用游标: open cursor for ''sql clause'';

<think>嗯,用户想要删除Oracle数据库中的临时表空间。这个问题在数据库维护中很常见,特别是当临时表空间过大或需要重建时。 用户可能遇到的情况是:执行了DROP TABLESPACE命令但操作卡住了,或者担心直接删除会影响数据库运行。从引用内容看,用户提供的参考材料提到了几种典型场景:临时表空间删除操作挂起、不同Oracle版本的差异处理、以及空间回收方法。 根据Oracle的机制,临时表空间比较特殊: - 它不存储永久对象,只用于排序等临时操作 - 必须至少保留一个临时表空间供数据库使用 - 删除前需要确保没有活跃会话正在使用它 在准备回答时需要考虑几个关键点: 1 版本差异处理:引用[1]提到9i以上版本可以直接删除数据文件,而老版本需要重建 2 删除卡住问题:引用[3][4]指出这可能是bug,需要特殊处理 3 替代方案:如果只是要缩小空间,重建比删除更安全 用户可能没意识到的是:直接删除默认临时表空间会导致系统崩溃。必须先用CREATE TEMPORARY TABLESPACE新建替代空间,再用ALTER DATABASE切换默认空间。 对于操作步骤,需要强调: - 查询当前默认空间(SELECT property_name, property_value FROM database_properties) - 创建新空间时的文件路径避免冲突 - 删除后操作系统文件不会自动清理(引用[5]提到OMF文件例外) 最后要提醒预防措施: 1 操作前备份控制文件(alter database backup controlfile to trace) 2 避免在生产高峰期操作 3 检查是否有未提交事务使用临时段 相关问题设计要覆盖: - 空间回收的替代方法(引用[1]的两种方案) - 诊断删除卡住的方法(结合引用[3][4]的bug说明) - 文件残留处理(呼应引用[5]的OMF特性)</think>以下是删除Oracle临时表空间的完整步骤及注意事项: ### 正确删除临时表空间的步骤 1. **创建新临时表空间** 先创建替代空间,避免删除默认空间导致系统崩溃: ```sql CREATE TEMPORARY TABLESPACE temp_new TEMPFILE '/u01/oradata/temp_new01.dbf' SIZE 500M; ``` 2. **修改默认临时表空间** 将数据库默认临时表空间指向新建空间: ```sql ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new; ``` 3. **检查会话状态** 确保无活动会话使用临时表空间: ```sql SELECT sid, serial#, username, sql_id FROM v$sort_usage WHERE tablespace = 'TEMP_OLD'; ``` 4. **删除原临时表空间** 强制删除空间及其文件: ```sql DROP TABLESPACE temp_old INCLUDING CONTENTS AND DATAFILES; ``` --- ### 关键注意事项 1. **删除操作卡住处理** 若`DROP`命令长时间挂起(常见于Oracle 11g/12c): - 检查是否命中Bug 1911167.1[^4] - 强制清理: ```sql ALTER TABLESPACE temp_old OFFLINE; ALTER DATABASE TEMPFILE '/path/tempfile.dbf' DROP INCLUDING DATAFILES; ``` 2. **空间回收替代方案** 若仅需缩小空间(无需删除): ```sql ALTER DATABASE TEMPFILE '/path/tempfile.dbf' RESIZE 500M; ``` 3. **文件残留问题** 非OMF(Oracle管理文件)需手动删除OS文件: ```shell rm /u01/oradata/temp_old01.dbf # Linux/Unix示例 ``` --- ### 操作验证 ```sql -- 确认默认临时表空间已切换 SELECT * FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE'; -- 检查原空间是否删除 SELECT tablespace_name FROM dba_tablespaces; ``` > ⚠️ **警告**:直接删除默认临时表空间将导致数据库崩溃!必须遵循先创建新空间再切换的流程[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值