oracle的兩種global temporary table!

warehouse發表於2008-07-05

1. on commit delete rows

2.on commit preserve rows

[@more@]

SQL> create global temporary table gt1 (id int) ;

表已建立。

SQL> insert into gt1 values(1);

已建立 1 行。

SQL> insert into gt1 values(2);

已建立 1 行。

SQL> select * from gt1;

ID
----------
1
2
SQL> commit;

提交完成。

SQL> select * from gt1;

未選定行

SQL> create global temporary table gt2 (id int) on commit delete rows ;

表已建立。

SQL> create global temporary table gt3 (id int) on commit preserve rows ;

表已建立。

SQL> insert into gt3 values(1);

已建立 1 行。
SQL> commit;

提交完成。

SQL> select * from gt3;

ID
----------
1

SQL> disconnect;
從 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 斷開
SQL> connect/ as sysdba
已連線。
SQL> select * from gt3;

未選定行
SQL> grant connect ,resource to test;

授權成功。

SQL> select * from gt3;

未選定行

SQL> insert into gt3 values(1);

已建立 1 行。

SQL> commit;

提交完成。

SQL> grant select on gt3 to test;

授權成功。
--=========================================
另一個session:

SQL> select * from sys.gt3;

未選定行

--==========================================

SQL> insert into gt1 values(1);

已建立 1 行。

SQL> select count(*) from v$transaction;

COUNT(*)
----------
1

SQL> select count(*) from v$locked_object ;

COUNT(*)
----------
0

SQL> rollback;

回退已完成。

SQL> select count(*) from v$transaction;

COUNT(*)
----------
0

SQL>

我們可以看出在透過dml操作temp table時也會開啟事務,同樣事務也需要commit或者rollback,但該事務卻不對temp table進行lock,原因是不需要lock temp table,因為temp table的資料只能是當前session訪問,類似於單使用者操作temp table。但temp table的結構只要具備訪問priv其他session都可以訪問,我想正因為它的結構可以被其他session訪問,所以oracle的temp table稱為global temp table

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1006802/,如需轉載,請註明出處,否則將追究法律責任。

相關文章