本文將會為您測試在DB2數據庫中,分別在SQL過程以及SQL語句中創建臨時表,並插入數據後,執行結果有何異同之處,供您參考,希望對您有所啟迪。
測試目標:
分別在SQL過程和SQL語句中創建臨時表,並插入數據,看執行結果有什麼異同。
測試環境:
DB2 UDB V9.1
執行附件裡面的SQL語句,得到一個表。
測試代碼和運行結果:
一、臨時
DB2臨時表在SQL過程和SQL語句中的測試總結
測試目標:
分別在SQL過程和SQL語句中創建臨時表,並插入數據,看執行結果有什麼異同。
測試環境:
DB2 UDB V9.1
執行附件裡面的SQL語句,得到一個表。
測試代碼和運行結果:
一、臨時表在SQL語句中
-- 定義一個全局臨時表SESSION.RESULT
DECLARE GLOBAL TEMPORARY TABLE SESSION.RESULT
(
TMP_HYDM VARCHAR(10), -- 行業代碼
TMP_HYMC VARCHAR(300) -- 行業名稱
)
WITH REPLACE
NOT LOGGED;
-- 插入數據到臨時表
INSERT INTO SESSION.RESULT
SELECT MLDM,MLMC FROM DM_HY_CY;
-- 查詢臨時表數據
SELECT * FROM SESSION.RESULT;
測試結果:以上SQL代碼正常執行,但是沒有查詢到任何數據。
二、臨時表在SQL存儲過程中
CREATE PROCEDURE SP_TEST_TMEP ( )
DYNAMIC RESULT SETS 1
------------------------------------------------------------------------
-- 語言:DB2 SQL 存儲過程
------------------------------------------------------------------------
P1: BEGIN
-- 定義一個全局臨時表SESSION.RESULT
DECLARE GLOBAL TEMPORARY TABLE SESSION.RESULT
(
TMP_HYDM VARCHAR(10), -- 行業代碼
TMP_HYMC VARCHAR(300) -- 行業名稱
)
WITH REPLACE -- 如果存在此臨時表,則替換
NOT LOGGED; -- 不在日志裡紀錄
-- 插入數據到臨時表
INSERT INTO SESSION.RESULT
SELECT MLDM,MLMC FROM DM_HY_CY;
P2: BEGIN
-- 游標對客戶機應用程序保持打開
DECLARE CUR_RES CURSOR WITH RETURN FOR
SELECT * FROM SESSION.RESULT;
OPEN CUR_RES;
END P2;
END P1
測試結果:存儲過程執行成功,並返回了插入的目標數據。
測試總結:
1、在SQL語句中,構建臨時表是沒有意義的,因為當SQL語句執行處於自動提交模式下時,執行後就COMMIT了,而一旦執行了COMMIT語句,臨時表將從內存中清除。
2、在SQL過程中,臨時表定義後,如果沒有顯式執行到COMMIT語句,則臨時表一直存在。並且臨時表支持INSERT INTO ... SELECT ... 的語句。
3、在DB2下,臨時表的模式必須為SESSION,SESSION模式下表是一個內存表,這個SESSION是DB2特有的SCHEMA,SESSION對象的聲明周期僅僅限於一次數據連接“會話”,一旦會話結束,SESSION對象就被從內存中清除了,這和JSP中的內置對象SESSION類似。