Oracle臨時表
臨時表分為兩種
會話級別(ON COMMIT PRESERVE ROWS;)
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT PRESERVE ROWS;
會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。即切換到另外一個窗口查詢時,數據將被清空。
事務級別(ON COMMIT DELETE ROWS;)
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT DELETE ROWS;
用戶提交commit和回滾rollback事務的時候,臨時表的數據自動清空。
創建臨時表時,可以使用TYPE快捷創建,操作如下
CREATE GLOBAL TEMPORARY TABLE TEMP_TABLE OF TYPE_NAME ON COMMIT DELETE ROWS;
刪除臨時表
TRUNCATE TABLE <TABLE_NAME>;
DROP TABLE <TABLE_NAME>;
刪除臨時表時,偶爾會出現ORA-14452
的錯誤,意思是有資源還在占用臨時表,無法刪除。需要找到臨時表的會話,手動殺掉。
-- 查找還在使用臨時表的會話
SELECT sid, serial#
FROM v$session
WHERE sid = (SELECT sid FROM v$lock
WHERE id1 = (SELECT object_id FROM dba_objects
WHERE object_name = UPPER('臨時表名')));
-- 使用上面查出的sid和serial#,殺掉會話
ALTER system kill session 'sid,serial#';