在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
/
答案 0 :(得分:1)
Oracle中的临时表是“事务”或“会话”特定的;前者是默认的。特定于事务的临时表将在每commit
后截断自身。据推测,SQL Fiddle的“Build Schema”部分在完成后包含一个提交,因此会破坏数据。
请参阅https://docs.oracle.com/cd/B28359_01/server.111/b28310/tables003.htm#i1006400
答案 1 :(得分:0)
为什么会这样?
Insert
和select
已在不同会话中生成或已插入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)