在oracle数据块中,除了平常所说的永久表以外,还有一种类型的表,叫做临时表。临时表与永久表最基本的区别是临时表中的数据只会在一定时期内临时存在,当一个session结束时或者一个transaction结束时,相应的临时表中的数据就会被数据库自动清除。值得注意的是,临时表是全局表,只是其中的数据被清除,表仍然存在。oracle中的临时表它有一个显著的作用,就是它可以让用户之间互不干扰,每个用户在各自的session或transaction中去操作自己的数据,不用担心去影响其他session或transaction,更不用担心锁的问题。
根据临时表的性质,将oracle数据块中的临时表分为回话临时表(session)和事务临时表(transaction),回话临时表只在当前session中有效,当结束session时,回话临时表被清除;事务临时表中的数据在transaction结束时被清除,即执行commit或rollback操作,或者是结束session回话,以上三种都会清除事务临时表中的数据。session临时表与transaction临时表在创建的时候不同的地方在于on commit preserve rows和on commit delete rows,前者为session临时表,后者为transaction临时表,注意下就好。 (1)session临时表 - - 创建session临时表
- CREATE GLOBAL TEMPORARY TABLE temp_tbs(
- t_id NUMBER,
- t_note VARCHAR2(20)
- ) ON COMMIT PRESERVE ROWS;
- -- 为session临时表插入一条数据
- INSERT INTO temp_tbs VALUES (1, 'note01');
- -- 提交数据保存到数据块中
- COMMIT;
- -- 查找session临时表中数据
- SELECT * FROM temp_tbs;
复制代码在一个session中执行上述代码,执行结果可以找到插入的那条数据。当关闭该session,重新再打开一个session,再次执行最后一条查询语句,发现没有提示temp_tbs表不存在的错误,说明session临时表是全局存在的,但是此时查出来的表中并没有数据,说明数据已经随着session的结束而被数据库自动清除了。
(2)transaction临时表 - - 创建transaction临时表
- CREATE GLOBAL TEMPORARY TABLE temp_tbt(
- t_id NUMBER,
- t_note VARCHAR2(20)
- ) ON COMMIT DELETE ROWS;
- -- 为transaction临时表插入一条数据
- INSERT INTO temp_tbt VALUES (1, 'note01');
- -- 查找transaction临时表中数据(数据没有commit到数据库中)
- SELECT * FROM temp_tbt;
- -- 提交数据保存到数据库中(将数据commit到数据库中)
- COMMIT;
- -- commit以后,再次执行查询语句,发现没有结果集
- SELECT * FROM temp_tbt;
复制代码在一个session中分别执行上述代码,当数据没有commit到数据库中时,发现查询结果中能够找到(1, 'note01')这条记录,然后执行commit,如果是在永久表中,commit以后数据会被保存到数据库中,那么应该会查到数据,但是在这里,当commit以后,再次执行查询会发现没有结果集,说明transaction临时表中的数据在这里随着transaction的结束而被数据库清除了。这里只实验了commit导致transaction结束的一种情况,读者可自行测试rollback以及关闭session。
对于oracle中临时表的简单理解大概就是这样,之所以这次会总结oracle的临时表,主要是因为我在开发报表的时候发现报表开发中大量使用到了临时表,这也强有力的说明了临时表确实十分有用。
|