Oracle臨時(shí)表在實(shí)際開(kāi)發(fā)中的應(yīng)用詳解
Oracle臨時(shí)表在實(shí)際開(kāi)發(fā)中的應(yīng)用是本文我們主要要介紹的內(nèi)容,我們知道,SQL Server 在編寫查詢式的存儲(chǔ)過(guò)程的時(shí)候,一直都令我為之贊嘆。Create procedure ps_procedure_name as select * from table; Select查詢語(yǔ)句可以作為SQL Server存儲(chǔ)過(guò)程的一部分,直接返回結(jié)果集。但在Oracle實(shí)現(xiàn)這種形式的存儲(chǔ)過(guò)程是不合語(yǔ)法的。
為了達(dá)到這種目的,我們需要使用Oracle臨時(shí)表(這是其中一種解決方案)。
Oracle數(shù)據(jù)庫(kù)除了可以保存***表外,還可以建立臨時(shí)表temporary tables。Oracle臨時(shí)表分為會(huì)話級(jí)臨時(shí)表(ON COMMIT PRESERVE ROWS)和事務(wù)級(jí)臨時(shí)表(ON COMMIT DELETE ROWS)。會(huì)話級(jí)臨時(shí)表是指臨時(shí)表中的數(shù)據(jù)只在會(huì)話生命周期之中存在,當(dāng)用戶退出會(huì)話結(jié)束的時(shí)候,Oracle自動(dòng)清除臨時(shí)表中數(shù)據(jù)。
事務(wù)級(jí)臨時(shí)表是指臨時(shí)表中的數(shù)據(jù)只在事務(wù)生命周期中存在。當(dāng)一個(gè)事務(wù)結(jié)束(commit or rollback),Oracle自動(dòng)清除臨時(shí)表中數(shù)據(jù)。臨時(shí)表中的數(shù)據(jù)只對(duì)當(dāng)前Session有效,每個(gè)Session都有自己的臨時(shí)數(shù)據(jù),并且不能訪問(wèn)其它Session的臨時(shí)表中的數(shù)據(jù)。
//在數(shù)據(jù)庫(kù)建立一個(gè)臨時(shí)表:
- 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 --這里代表的是事務(wù)級(jí)臨時(shí)表
- ON COMMIT PRESERVE ROWS --這里代表的是會(huì)話級(jí)臨時(shí)表
在實(shí)際的操作中,我就驗(yàn)證過(guò)上面所說(shuō)的。一開(kāi)始我使用了事務(wù)級(jí)臨時(shí)表,將數(shù)據(jù)插入到臨時(shí)表時(shí),使用commit操作,結(jié)果臨時(shí)表的內(nèi)容清空了。例如是:INSERT INTO ESPS_EMP_RANK_TEMP select * from table;commint;執(zhí)行這兩段SQL后,相當(dāng)于沒(méi)有插入數(shù)據(jù)。
如果我們使用會(huì)話級(jí)臨時(shí)表,即使使用了commit,臨時(shí)表中的內(nèi)容還是存在的。直到會(huì)話斷開(kāi)時(shí),臨時(shí)表中的內(nèi)容才真正的清空。所以,在實(shí)際的開(kāi)發(fā)過(guò)程中,我們因該結(jié)合場(chǎng)景,使用不同類型的臨時(shí)表。
在建議提案系統(tǒng)開(kāi)發(fā)的過(guò)程中,我使用了會(huì)話級(jí)的臨時(shí)表。將查詢的數(shù)據(jù)插入到臨時(shí)表中,并且讀取臨時(shí)表的內(nèi)容,會(huì)話斷開(kāi)時(shí),臨時(shí)表中的內(nèi)容自動(dòng)清空。
在C#里面調(diào)用的三大步驟:
//C#里面定義的一個(gè)String類型的變量,存儲(chǔ)一段動(dòng)態(tài)SQL,存儲(chǔ)過(guò)程為:
- ESPS_EMP_RANK_STATISTIS({0},'{1}')
- public static string I_EMP_RANK_STATISTIS = "BEGIN ESPS_EMP_RANK_STATISTIS({0},'{1}'); END;";
//執(zhí)行存儲(chǔ)過(guò)程,把結(jié)果集插入到臨時(shí)表ESPS_EMP_RANK_TEMP
- WAF.COM.Core.OracleHelper. ExecuteNonQuery(conn, CommandType.Text, string.Format(SqlCollector.I_EMP_RANK_STATISTIS, 2,’2011’));
//讀取臨時(shí)表中保存的結(jié)果集
- Oracle DataReader dr = WAF.COM.Core.OracleHelper. ExecuteReader(“select * from ESPS_EMP_RANK_TEMP”)
關(guān)于Oracle臨時(shí)表在實(shí)際開(kāi)發(fā)中的應(yīng)用的相關(guān)知識(shí)就介紹到這里了,希望本次介紹能夠?qū)δ兴斋@!
【編輯推薦】






