Oracle

时间:2015-12-23 12:29:47

标签: oracle

在SQL FIDDLE(sqlfiddle.com)中,我可以构建表的架构:

create table test(name varchar2(20), id number);

insert into test values('posey', 363);

以下查询运行并提供正确的结果:

select * from test
/

我也尝试了一个临时表,我可以构建模式。

create Global Temporary table test(name varchar2(20), id number);
insert into test values('posey', 363); 

以下查询运行但不返回任何内容。为什么会这样?

select * from test
/

5 个答案:

答案 0 :(得分:1)

Oracle中的临时表是“事务”或“会话”特定的;前者是默认的。特定于事务的临时表将在每commit后截断自身。据推测,SQL Fiddle的“Build Schema”部分在完成后包含一个提交,因此会破坏数据。

请参阅https://docs.oracle.com/cd/B28359_01/server.111/b28310/tables003.htm#i1006400

答案 1 :(得分:0)

  

为什么会这样?

Insertselect已在不同会话中生成已插入global temporary table已提交(临时表具有ON COMMIT DELETE ROWS选项默认)。

答案 2 :(得分:0)

在会话范围内创建临时表,并且该数据仅存在于该会话中。

全局临时表中的数据是私有的,因此会话插入的数据只能由该会话访问。可以为整个会话保留全局临时表中特定于会话的行,或仅保留当前事务。

来自文档Creating a Temporary Table

  

临时表的定义对所有会话都是可见的,但临时表中的数据仅对将数据插入表中的会话可见。

因此,当您在sqlfiddle(构建架构)上创建该会话时,该会话不再存在,因此您的选择不会返回任何数据。

答案 3 :(得分:0)

Oracle上这两个对象之间存在根本区别。前者是一个物理表,允许您存储给定模式的数据。 Latter是一个临时对象,允许您在会话期间存储一些数据。

如果您包含ON COMMIT PRESERVE ROWS条款,如下所示,您会注意到您选择的数据将保留在GTT中。

CREATE GLOBAL TEMPORARY TABLE <table_name> (
 <column_name>  <column_data_type>,
 <column_name>  <column_data_type>,
 <column_name>  <column_data_type>)
 ON COMMIT PRESERVE ROWS;

答案 4 :(得分:0)

  • 在&#34;运行SQL&#34;中运行INSERT;框,而不是&#34; Build 架构&#34;框。
  • 另外,请避免在插入后提交,或添加&#34; ON 承诺保留行&#34;到CREATE命令。