Temp Table in Oracle

Oracle8i临时表使用
本文介绍了Oracle8i中引入的临时表特性,包括如何创建会话级和事务级的临时表,并提供了具体的语法示例。
 
Using Temp Tables in Oracle 8i
Oracle 8i introduces the concept of temp tables. This feature long since enjoyed by SQL Server developers enables data to be visible on a Session or Transaction basis. To create an Oracle 8i temp table use the following syntax:
 Create global temporary table tempTable
(
id number,
value number
);
This creates a table that is visible to all sessions, but only the data placed in the table is visible for the current working session. The temp table is resident until the session that created it is closed.

Additionally, temp tables can be created for use on a per-transaction basis. The following syntax creates a temp table that purges all data once a transaction is committed. Or to preserve data once a transaction has been committed, use the "on commit preserve rows" syntax.

 Create global temporary table tempTable
(
id number,
value number
) on commit delete rows;
<think>首先,用户的问题是:“我想了解使用CREATE TEMP TABLE创建的临时表是否可见”。用户提供了几个引用,我需要参考这些引用来回答。 回顾引用: - 引用[1]:解释了临时表在Oracle创建的概念,提到临时表用于特定功能,数据存储在系统的临时表空间中。没有直接提到可见性。 - 引用[2]:讨论了Oracle 8i中的临时表。它说:"This creates a table that is visible to all sessions, but only the data placed in the table is visible for the current working session." 这意味着表本身对所有会话可见,但数据只对当前会话可见。 - 引用[3]:提供了一个创建临时表的例子,但没有直接讨论可见性。 - 引用[4]:给出了创建临时表的语法:"create global temporary table temp_tab_name ...",但没有提到可见性。 用户的问题是:“使用CREATE TEMP TABLE创建的临时表是否可见”。在Oracle中,临时表通常使用"CREATE GLOBAL TEMPORARY TABLE"命令创建,正如引用[2]和[4]所示。用户使用了"CREATE TEMP TABLE",但在Oracle中,正确的语法是"CREATE GLOBAL TEMPORARY TABLE"。引用[2]明确指出:"Create global temporary table ...",所以用户可能简化了语法。 根据引用[2]:"This creates a table that is visible to all sessions, but only the data placed in the table is visible for the current working session." 这表明: - 表定义(即表的元数据)对所有会话可见。 - 但表中的数据只对创建该表的会话或其他指定会话可见(取决于事务模式)。 用户的问题焦点是“临时表是否可见”,这应该指的是表的定义是否可见,而不是数据。引用[2]直接回答了表定义对所有会话可见。 在Oracle临时表中: - 表的定义是全局的,意思是一旦创建,所有会话都可以看到这个表的存在。 - 数据是会话级的或事务级的:取决于创建时指定的是"ON COMMIT DELETE ROWS"(事务结束时删除数据)还是"ON COMMIT PRESERVE ROWS"(会话结束时删除数据),数据只对插入它的会话可见。 因此,对于可见性: - 表的可见性:是的,所有会话都可以看到表的存在。例如,其他用户可以查询表的结构,但看不到其他会话的数据。 - 数据的可见性:仅限于创建数据的会话。 用户的问题是“临时表是否可见”,我认为这指的是表本身是否可见,即表定义是否对其他会话可访问。 基于引用[2],答案是:使用CREATE GLOBAL TEMPORARY TABLE创建的临时表对所有会话可见,但数据只对当前会话可见。 现在,系统级指令: - 所有行内数学表达式用$...$,但这里没有数学内容,所以不需要。 - 独立公式用$$...$$,但也不需要公式。 - LaTeX语法正确:不适用。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识,例如[^数字]。 回答结构要清晰,帮助用户逐步解决问题。 组织回答: 1. 确认用户的查询:解释"CREATE TEMP TABLE"在Oracle中通常是"CREATE GLOBAL TEMPORARY TABLE"的简写或变种。 2. 基于引用回答可见性问题。 3. 引用相关部分。 4. 确保回答真实可靠。 最后,生成相关问题。 回答大纲: - 简要介绍临时表。 - 解释可见性:表定义全局可见,数据会话私有。 - 引用关键点。 - 生成相关问题。 相关问题应该基于主题,比如临时表的使用、优点、限制等。 </think>### 使用CREATE TEMP TABLE创建的临时表是否可见? 在Oracle数据库中,临时表(通常使用`CREATE GLOBAL TEMPORARY TABLE`命令创建)的可见性需要区分两个方面:**表定义(元数据)的可见性**和**表中数据的可见性**。用户提到的`CREATE TEMP TABLE`语法,在Oracle中通常是`CREATE GLOBAL TEMPORARY TABLE`的简写或变种(例如,引用[2]和[4]中使用的语法)。下面我将基于提供的引用,逐步解释临时表的可见性问题: 1. **表定义(元数据)的可见性**: - 临时表的定义(即表结构,如列名、数据类型等)是**全局可见**的。这意味着一旦创建,所有数据库会话(或用户)都可以看到这个表的存在。例如,其他会话可以查询表结构或尝试访问该表。 - 引用[2]明确指出:"This creates a table that is visible to all sessions, but only the data placed in the table is visible for the current working session."(这创建了一个对所有会话可见的表,但表中的数据只对当前工作会话可见。)[^2]。 因此,如果您使用`CREATE GLOBAL TEMPORARY TABLE`(或等效的`CREATE TEMP TABLE`)创建临时表,它将被添加到数据库的系统目录中,所有会话都能通过SQL查询(如`DESC table_name`)检测到其定义。 2. **表中数据的可见性**: - 临时表的数据是**会话私有**的。每个会话只能看到自己插入的数据,其他会话的数据不可见。数据存储在系统的临时表空间(如TEMP),并在会话结束或事务结束时自动清除(取决于创建时指定的选项)。 - 引用[1]提到:"Oracle的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在ORACLE系统的临时表空间中(TEMP)。"(这强调了数据的临时性和私有性。)[^1]。 另外,引用[4]提供了语法选项:`ON COMMIT DELETE ROWS`(事务结束时删除数据)或`ON COMMIT PRESERVE ROWS`(会话结束时删除数据),这进一步控制了数据的生命周期和可见范围[^4]。 **总结**: - **是的,使用`CREATE GLOBAL TEMPORARY TABLE`(或类似语法)创建的临时表在定义上对所有会话可见**。 - **但数据只对创建它的会话可见**,且在会话或事务结束后自动清除,这避免了数据冲突并节省资源。 在实际使用中,临时表适用于需要临时存储数据的场景(如复杂计算或中间结果),而不会污染永久表空间[^1][^2]。 如果需要创建临时表,推荐使用标准语法(如引用[4]所示): ```sql CREATE GLOBAL TEMPORARY TABLE temp_tab_name ( column1 datatype, column2 datatype ) ON COMMIT DELETE ROWS; -- 或 ON COMMIT PRESERVE ROWS ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值