你是從哪裏讀到的?我懷疑不在Oracle SQL Reference中。所以解釋很簡單:該斷言的作者沒有測試全局臨時表的行爲。無論是或者你正在閱讀其他SQL實現的描述,比如DerbyDB。
爲了完整起見,讓我們排除事務或會話作用域的作用。這裏有兩個全局臨時表:
create global temporary table gtt1
(col1 varchar2(30))
ON COMMIT PRESERVE ROWS
/
create global temporary table gtt2
(col1 varchar2(30))
ON COMMIT DELETE ROWS
/
讓我們運行實驗爲一個具有會話範圍:
SQL> insert into gtt1 values('one');
1 row created.
SQL> insert into gtt1 values('two');
1 row created.
SQL> savepoint f1;
Savepoint created.
SQL> insert into gtt1 values('three');
1 row created.
SQL> insert into gtt1 values('four');
1 row created.
SQL> rollback to f1;
Rollback complete.
SQL> select * from gtt1;
COL1
------------------------------
one
two
SQL>
同樣的結果對錶事務範圍:
SQL> insert into gtt2 values('five');
1 row created.
SQL> insert into gtt2 values('six');
1 row created.
SQL> savepoint f2;
Savepoint created.
SQL> insert into gtt2 values('seven');
1 row created.
SQL> insert into gtt2 values('eight');
1 row created.
SQL> rollback to f2;
Rollback complete.
SQL> select * from gtt2;
COL1
------------------------------
five
six
SQL>
其實這並不奇怪。該official Oracle documentation狀態:
「的臨時表定義相同的方式,普通表的定義仍然存在,」基本上他們是堆表。的區別在於:
- 範圍(可見性)的數據
- 用於保留數據(全局臨時表寫入到臨時表)的表空間。
來源
2015-05-13 05:10:52
APC