ITPub博客

首页 > 数据库 > Oracle > oracle的两种global temporary table!

oracle的两种global temporary table!

原创 Oracle 作者:warehouse 时间:2008-07-05 15:05:48 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/19602/viewspace-1006802/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5366325