oracle 的TEMPORARY TABLE有两种,一种是基Session的,即表中的数据在Session结束前数据都存在。另一种是基于transaction的数据在transaction Commit或Rollback后消失。默认值是基于transaction的。所以你"提交后被告知没有行可以选择"。
当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空(truncate),但是临时表的结构以及元数据还存储在用户的数据字典中。你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 临时表可以拥有触发器。
Temp Table 并非存放在用户的表空间中,而是存放在 Schema 所指定的临时表空间中, 你可以用下面的语句来检测:
SQL> Select Table_Name, Tablespace_Name
From User_Tables
Where Table_Name Like 'temp_%';
用户 SQLTRAINER 的临时表空间是 TEMP , 用户创建的临时表是存放在TEMP表空间中的。下面来证明
SQL> SELECT UserName, Default_Tablespace def_ts, Temporary_Tablespace temp_ts
FROM User_Users;
尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log 的,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。
如果你想数据在Session结束前数据都存在参考下面的例子,或看Oracle的帮助
/*******************************************************************************/
CREATE GLOBAL TEMPORARY TABLE flight_schedule (
startdate DATE,
enddate DATE,
cost NUMBER)
ON COMMIT PRESERVE ROWS;
/*******************************************************************************/
create global temporary table temp_table_name (....) on commit delete rows;
此为事务级临时表,你向里边插入的数据,在commit后就消失,当然rollback后也回滚即消失。
注意事务级临时表在同一会话的嵌套事务中跟一般表一样也可能发生阻塞。
create global temporary table temp_table_name (....) on commit preserve rows;
此为会话级临时表,你向里边插入的数据,在commit后保留不消失,而在整个会话结束后消失,当然rollback也会回滚。
No comments:
Post a Comment