Oracle臨時表在實際開發中的應用是本文我們主要要介紹的內容,我們知道,SQL Server 在編寫查詢式的存儲過程的時候,一直都令我為之贊嘆。Create procedure ps_procedure_name as select * from table; Select查詢語句可以作為SQL Server存儲過程的一部分,直接返回結果集。但在Oracle實現這種形式的存儲過程是不合語法的。
為了達到這種目的,我們需要使用Oracle臨時表(這是其中一種解決方案)。
Oracle數據庫除了可以保存永久表外,還可以建立臨時表temporary tables。Oracle臨時表分為會話級臨時表(ON COMMIT PRESERVE ROWS)和事務級臨時表(ON COMMIT DELETE ROWS)。tb會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。
事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中數據。臨時表中的數據只對當前Session有效,每個Session都有自己的臨時數據,并且不能訪問其它Session的臨時表中的數據。
//在數據庫建立一個臨時表:
- CREATE GLOBAL TEMPORARY TABLE ESPS.ESPS_EMP_RANK_TEMP
- (
- COM VARCHAR2(20 BYTE),
- EMPNO VARCHAR2(20 BYTE),
- EMPNAME VARCHAR2(100 BYTE),
- DEPTNAME VARCHAR2(300 BYTE),
- AMOUNT NUMBER,
- APPROVED_AMOUNT NUMBER,
- FOLDING_AMOUNT NUMBER,
- BENEFIT NUMBER,
- EXECUTED_RATE NUMBER,
- FOLDING_RANK NUMBER,
- BENEFIT_RANK NUMBER,
- RANK NUMBER,
- TOTAL_RANK NUMBER
- )
- //ON COMMIT PRESERVE ROWS --這里代表的是事務級臨時表
- ON COMMIT PRESERVE ROWS --這里代表的是會話級臨時表
在實際的操作中,我就驗證過上面所說的。一開始我使用了事務級臨時表,將數據插入到臨時表時,使用commit操作,結果臨時表的內容清空了。例如是:INSERT INTO ESPS_EMP_RANK_TEMP select * from table;commint;執行這兩段SQL后,相當于沒有插入數據。
如果我們使用會話級臨時表,即使使用了commit,臨時表中的內容還是存在的。直到會話斷開時,臨時表中的內容才真正的清空。所以,在實際的開發過程中,我們因該結合場景,使用不同類型的臨時表。
在建議提案系統開發的過程中,我使用了會話級的臨時表。將查詢的數據插入到臨時表中,并且讀取臨時表的內容,會話斷開時,臨時表中的內容自動清空。
在C#里面調用的三大步驟:
//C#里面定義的一個String類型的變量,存儲一段動態SQL,存儲過程為:
- ESPS_EMP_RANK_STATISTIS({0},'{1}')
- public static string I_EMP_RANK_STATISTIS = "BEGIN ESPS_EMP_RANK_STATISTIS({0},'{1}'); END;";
//執行存儲過程,把結果集插入到臨時表ESPS_EMP_RANK_TEMP
- WAF.COM.Core.OracleHelper. ExecuteNonQuery(conn, CommandType.Text, string.Format(SqlCollector.I_EMP_RANK_STATISTIS, 2,’2011’));
//讀取臨時表中保存的結果集
- Oracle DataReader dr = WAF.COM.Core.OracleHelper. ExecuteReader(“select * from ESPS_EMP_RANK_TEMP”)
關于Oracle臨時表在實際開發中的應用的相關知識就介紹到這里了,希望本次介紹能夠對您有所收獲!