什么是臨時表,用戶做一個操作查詢出幾百幾千條數據,我們可以把數據放在內存中。當有很多用戶都這樣做,內存空間不足,這個時候就需要把數據保存在磁盤上。對於 oracle 就提供了一種臨時表用於存放這些數據。
事務級
會話級
on commit preserve rows --session 臨時表
on commit delete rows --transaction 臨時表
下面演示創建一個事務級別與會話級別的兩個臨時表
SQL> conn test/test Connected. SQL> desc test; Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER NAME VARCHAR2(10)
在 sys 下創建 sessione 級別的臨時表
SQL> conn / as sysdba Connected. SQL> create global temporary table session_test on commit preserve rows as select * from test.test; Table created.
SQL> commit; Commit complete.
on commit preserve rows 表示創建的表是 session 級別,只要用戶不退出,臨時表一直有效。
SQL> select * from session_test; ID NAME ---------- ---------- 0 orcl 1 orcl 3 orcl 2 orcl
退出並重新進入,並驗證表內容是否存在。
SQL> exit
……
SQL> select * from session_test; no rows selected SQL>
查看 session 級別的臨時表在斷開連接后,重新登錄查看變為空了。
接下來創建事務級別的臨時表
SQL> create global temporary table transaction_test on commit delete rows as select * from test.test; Table created.
on commit delete rows 表示創建的表是事務級別,這個臨時表的作用范圍只在一個事務內有效。
驗證事務臨時表的作用范圍:
雖然是 copy 的 test.test 表,但是依然是沒有數據。
SQL> select * from transaction_test; no rows selected
接下來添加數據到事務臨時表 transaction_test
SQL> insert into transaction_test select * from test.test; 4 rows created. SQL> select * from transaction_test; ID NAME ---------- ---------- 0 orcl 1 orcl 3 orcl 2 orcl
如上我們將 test.test 表的內容插入到了 transaction_test 表中,然后直接查詢,能查到剛剛插入的數據。
接下來提交,並查詢。(提交相當於提交事務,也就是一個事務的結束)
SQL> select * from transaction_test; ID NAME ---------- ---------- 0 orcl 1 orcl 3 orcl 2 orcl SQL> commit; Commit complete. SQL> select * from transaction_test; no rows selected
由此可見
會話級別的臨時表,只要會話不斷開,臨時表一直有效,會話斷開后,臨時表內容清空;
事務級別的臨時表,只在一個事務內有效,事務提交后,臨時表內容清空。