臨時(shí)表概念
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),湄潭企業(yè)網(wǎng)站建設(shè),湄潭品牌網(wǎng)站建設(shè),網(wǎng)站定制,湄潭網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,湄潭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
臨時(shí)表就是用來(lái)暫時(shí)保存臨時(shí)數(shù)據(jù)(亦或叫中間數(shù)據(jù))的一個(gè)數(shù)據(jù)庫(kù)對(duì)象,它和普通表有些類(lèi)似,然而又有很大區(qū)別。它只能存儲(chǔ)在臨時(shí)表空間,而非用戶(hù)的表空間。ORACLE臨時(shí)表是會(huì)話(huà)或事務(wù)級(jí)別的,只對(duì)當(dāng)前會(huì)話(huà)或事務(wù)可見(jiàn)。每個(gè)會(huì)話(huà)只能查看和修改自己的數(shù)據(jù)。
臨時(shí)表語(yǔ)法
clip_image002
臨時(shí)表分類(lèi)
ORACLE臨時(shí)表有兩種類(lèi)型:會(huì)話(huà)級(jí)的臨時(shí)表和事務(wù)級(jí)的臨時(shí)表。
1)ON COMMIT DELETE ROWS
它是臨時(shí)表的默認(rèn)參數(shù),表示臨時(shí)表中的數(shù)據(jù)僅在事物過(guò)程(Transaction)中有效,當(dāng)事物提交(COMMIT)后,臨時(shí)表的暫時(shí)段將被自動(dòng)截?cái)啵═RUNCATE),但是臨時(shí)表的結(jié)構(gòu) 以及元數(shù)據(jù)還存儲(chǔ)在用戶(hù)的數(shù)據(jù)字典中。如果臨時(shí)表完成它的使命后,最好刪除臨時(shí)表,否則數(shù)據(jù)庫(kù)會(huì)殘留很多臨時(shí)表的表結(jié)構(gòu)和元數(shù)據(jù)。
2)ON COMMIT PRESERVE ROWS
它表示臨時(shí)表的內(nèi)容可以跨事物而存在,不過(guò),當(dāng)該會(huì)話(huà)結(jié)束時(shí),臨時(shí)表的暫時(shí)段將隨著會(huì)話(huà)的結(jié)束而被丟棄,臨時(shí)表中的數(shù)據(jù)自然也就隨之丟棄。但是臨時(shí)表的結(jié)構(gòu)以及元數(shù)據(jù)還存儲(chǔ)在用戶(hù)的數(shù)據(jù)字典中。如果臨時(shí)表完成它的使命后,最好刪除臨時(shí)表,否則數(shù)據(jù)庫(kù)會(huì)殘留很多臨時(shí)表的表結(jié)構(gòu)和元數(shù)據(jù)。
1:會(huì)話(huà)級(jí)的臨時(shí)表的數(shù)據(jù)和你當(dāng)前會(huì)話(huà)有關(guān)系,當(dāng)前SESSION不退出的情況下,臨時(shí)表中的數(shù)據(jù)就還存在,臨時(shí)表的數(shù)據(jù)只有當(dāng)你退出當(dāng)前SESSION的時(shí)候才被截?cái)啵═RUNCATE TABLE),如下所示:
會(huì)話(huà)級(jí)別的臨時(shí)表創(chuàng)建:
復(fù)制代碼
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;
或
CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT PRESERVE ROWS
AS
SELECT * FROM TEST;
操作示例:
SQL CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;
Table created
SQL INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL COMMIT;
Commit complete
SQL SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------
1 kerry
SQL INSERT INTO TMP_TEST
SELECT 2, 'rouce' FROM DUAL;
1 row inserted
SQL ROLLBACK;
Rollback complete
SQL SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------------
1 kerry
SQL
復(fù)制代碼
2:事務(wù)級(jí)的臨時(shí)表(默認(rèn)),這種類(lèi)型的臨時(shí)表與事務(wù)有關(guān),當(dāng)進(jìn)行事務(wù)提交或者事務(wù)回滾的時(shí)候,臨時(shí)表的數(shù)據(jù)將自行截?cái)?,即?dāng)COMMIT或ROLLBACK時(shí),數(shù)據(jù)就會(huì)被TRUNCATE掉,其它的特性和會(huì)話(huà)級(jí)的臨時(shí)表一致。
事務(wù)級(jí)臨時(shí)表的創(chuàng)建方法:
復(fù)制代碼
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
或
CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
Table created
SQL INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------------
1 kerry
SQL COMMIT;
Commit complete
SQL SELECT * FROM TMP_TEST;
ID NAME
---------- ------------------------
SQL
復(fù)制代碼
3:關(guān)于臨時(shí)表只對(duì)當(dāng)前會(huì)話(huà)或事務(wù)可見(jiàn)。每個(gè)會(huì)話(huà)只能查看和修改自己的數(shù)據(jù)。
用DM用戶(hù)登錄數(shù)據(jù)庫(kù),打開(kāi)SESSION 1后,創(chuàng)建臨時(shí)表TMP_TEST
復(fù)制代碼
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
或
CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
Table created
SQL INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL SELECT * FROM TMP_TEST;
ID NAME
---------- ---------------------
1 kerry
SQL COMMIT;
Commit complete
SQL SELECT * FROM TMP_TEST;
ID NAME
---------- -----------------------
SQL
復(fù)制代碼
用sys用戶(hù)登錄數(shù)據(jù)庫(kù),打開(kāi)SESSION 2
SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TMP_TEST' --可以查到臨時(shí)表數(shù)據(jù)
SELECT * FROM DM.TMP_TEST; --查不到數(shù)據(jù),即使TMP_TEST臨時(shí)表存在數(shù)據(jù)。
臨時(shí)表與永久表區(qū)別
復(fù)制代碼
SQL SELECT TABLE_NAME, TABLESPACE_NAME,"LOGGING",
"TEMPORARY", DURATION, "MONITORING"
FROM DBA_TABLES WHERE TABLE_NAME IN ('TMP_TEST', 'TEST') ;
TABLE_NAME TABLESPACE_NAME LOGGING TEMPORARY DURATION MONITORING
------------- -------------- ------- --------- ----------- ---------
TEST TBS_EDS_DATA YES N YES
TMP_TEST NO Y SYS$SESSION NO
復(fù)制代碼
如上所示,臨時(shí)表是存儲(chǔ)在臨時(shí)表空間里面的,但是上面腳本可以看出,臨時(shí)表在數(shù)據(jù)字典中沒(méi)有指定其表空間,臨時(shí)表是NOLOGGING,DURATION為SYS$SESSION
臨時(shí)表的DML操作速度比較快,但同樣也是要產(chǎn)生 Redo Log ,只是同樣的DML語(yǔ)句,比對(duì) PERMANENT 的DML 產(chǎn)生的Redo Log 少其實(shí)在應(yīng)用中,往往會(huì)創(chuàng)建一個(gè)NOLOGGING的永久表(中間表)來(lái)保存中間數(shù)據(jù),從而代替臨時(shí)表,至于這這兩者有啥優(yōu)劣,真是很難說(shuō)清道明(歡迎大家探討)。
臨時(shí)表用途
什么時(shí)候使用臨時(shí)表?用臨時(shí)表和用中間表有啥區(qū)別呢?
我覺(jué)得是在需要的時(shí)候應(yīng)用,下面是David Dai關(guān)于臨時(shí)表的一個(gè)應(yīng)用說(shuō)明,我覺(jué)得非常形象的說(shuō)明了臨時(shí)表的應(yīng)用場(chǎng)景:對(duì)于一個(gè)電子商務(wù)類(lèi)網(wǎng)站,不同消費(fèi)者在網(wǎng)站上購(gòu)物,就是一個(gè)獨(dú)立的 SESSION,選購(gòu)商品放進(jìn)購(gòu)物車(chē)中,最后將購(gòu)物車(chē)中的商品進(jìn)行結(jié)算。也就是說(shuō),必須在整個(gè)SESSION期間保存購(gòu)物車(chē)中的信息。同時(shí),還存在有些消費(fèi)者,往往最終結(jié)賬時(shí)放棄購(gòu)買(mǎi)商品。如果,直接將消費(fèi)者選購(gòu)信息存放在最終表(PERMANENT)中,必然對(duì)最終表造成非常大的壓力。因此,對(duì)于這種案例,就可以采用創(chuàng)建臨時(shí)表(ON COMMIT PRESERVE ROWS)的方法來(lái)解決。數(shù)據(jù)只在 SESSION 期間有效,對(duì)于結(jié)算成功的有效數(shù)據(jù),轉(zhuǎn)移到最終表中后,ORACLE自動(dòng)TRUNCATE 臨時(shí)數(shù)據(jù);對(duì)于放棄結(jié)算的數(shù)據(jù),ORACLE 同樣自動(dòng)進(jìn)行 TRUNCATE ,而無(wú)須編碼控制,并且最終表只處理有效訂單,減輕了頻繁的DML操作的壓力。
1:當(dāng)處理某一批臨時(shí)數(shù)據(jù),需要多次DML操作時(shí)(插入、更新等),建議使用臨時(shí)表。
2:當(dāng)某些表在查詢(xún)里面,需要多次用來(lái)做連接時(shí)。(為了獲取目標(biāo)數(shù)據(jù)需要關(guān)聯(lián)A、B、C, 同時(shí)為了獲取另外一個(gè)目標(biāo)數(shù)據(jù),需要關(guān)聯(lián)D、B、C....)
關(guān)于臨時(shí)表和中間表(NOLOGGING,保存中間數(shù)據(jù),使用完后刪除)那個(gè)更適合用來(lái)存儲(chǔ)中間數(shù)據(jù),我個(gè)人更傾向于使用臨時(shí)表,而不建議使用中間表。
注意事項(xiàng)
1 ) 不支持 lob 對(duì)象,這也許是設(shè)計(jì)者基于運(yùn)行效率的考慮,但實(shí)際應(yīng)用中確實(shí)需要此功能時(shí)就無(wú)法使用臨時(shí)表了。這點(diǎn)網(wǎng)上很多資料都這么說(shuō),我沒(méi)有追查到底是那個(gè)版本不支持lob對(duì)象,至少在ORACLE 10g這個(gè)版本中,臨時(shí)表是支持lob對(duì)象的.
SQL CREATE GLOBAL TEMPORARY TABLE TMP_TEST
2 (
3 ID NUMBER ,
4 NAME CLOB
5 ) ON COMMIT PRESERVE ROWS;
Table created
SQL
SQL INSERT INTO TMP_TEST
2 SELECT 1, 'ADF' FROM DUAL;
1 row inserted
SQL SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
2 ) 不支持主外鍵關(guān)系
3 )臨時(shí)表不能永久的保存數(shù)據(jù)。
4 )臨時(shí)表的數(shù)據(jù)不會(huì)備份,恢復(fù),對(duì)其的修改也不會(huì)有任何日志信息
5 )臨時(shí)表不會(huì)有DML 鎖
DML locks are not acquired on the data of the temporary tables. The LOCK statement has no effect on a temporary table, because each session has its own private data.
6 )盡管對(duì)臨時(shí)表的DML操作速度比較快,但同樣也是要產(chǎn)生 Redo Log ,只是同樣的DML語(yǔ)句,比對(duì) PERMANENT 的DML 產(chǎn)生的Redo Log 少。請(qǐng)見(jiàn)官方文檔:
DML statements on temporary tables do not generate redo logs for the data changes.However, undo logs for the data and redo logs for the undo logs are generated. Data from the temporary table is automatically dropped in the case of session termination,either when the user logs off or when the session terminates abnormally such as during a session or instance failure.
7 ) 臨時(shí)表可以創(chuàng)建臨時(shí)的索引、視圖、觸發(fā)器。
8 ) 如果要DROP會(huì)話(huà)級(jí)別臨時(shí)表,并且其中包含數(shù)據(jù)時(shí),必須先截?cái)嗥渲械臄?shù)據(jù)。否則會(huì)報(bào)錯(cuò)。
SQL DROP TABLE TMP_TEST PURGE;
DROP TABLE TMP_TEST PURGE
ORA-14452: 試圖創(chuàng)建, 更改或刪除正在使用的臨時(shí)表中的索引
SQL TRUNCATE TABLE TMP_TEST;
Table truncated
SQL DROP TABLE TMP_TEST PURGE;
Table dropped
Oracle創(chuàng)建臨時(shí)表的語(yǔ)法如下:
CREATE GLOBAL TEMPORARY TABLE table
"(" column datatype [DEFAULT expr] [{ NULL | NOT NULL}]
[, column datatype [DEFAULT expr] [ {NULL | NOT NULL} ]... ")"
ON COMMIT {DELETE | PRESERVE } ROWS ;
在Oracle中,可以創(chuàng)建以下兩種臨時(shí)表:
1) 會(huì)話(huà)特有的臨時(shí)表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT PRESERVE ROWS;
2) 事務(wù)特有的臨時(shí)表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
Oracle中的臨時(shí)表用法匯總
說(shuō)明:下文中的一些說(shuō)明和示例代碼摘自CSDN,恕不一一指明出處,在此一并對(duì)相關(guān)作者表示感謝! 如果作者有異議,請(qǐng)來(lái)信說(shuō)明
1 語(yǔ)法 在Oracle中,可以創(chuàng)建以下兩種臨時(shí)表:
1) 會(huì)話(huà)特有的臨時(shí)表
CREATE GLOBAL TEMPORARY TABLE_NAME (column specification )
ON COMMIT PRESERVE ROWS;
2) 事務(wù)特有的臨時(shí)表
CREATE GLOBAL TEMPORARY TABLE_NAME (column specification )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的臨時(shí)表雖然是存在的,但是如果insert 一條記錄然后用別的連接登上去select,記錄是空的。
--ON COMMIT DELETE ROWS 說(shuō)明臨時(shí)表是事務(wù)指定,每次提交后ORACLE將截?cái)啾恚▌h除全部行)
--ON COMMIT PRESERVE ROWS 說(shuō)明臨時(shí)表是會(huì)話(huà)指定,當(dāng)中斷會(huì)話(huà)時(shí)ORACLE將截?cái)啾怼?/p>
2 動(dòng)態(tài)創(chuàng)建
create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as
v_num number;
begin
select count(*) into v_num from user_tables where table_name='T_TEMP';
--create temporary table
if v_num1 then
execute immediate 'CREATE GLOBAL TEMPORARY TABLE T_TEMP (
COL1 VARCHAR2(10),
COL2 VARCHAR2(10)
) ON COMMIT delete ROWS';
end if;
--insert data
execute immediate 'insert into t_temp values('''||v_col1||''','''||v_col2||''')';
execute immediate 'select col1 from t_temp' into v_num;
dbms_output.put_line(v_num);
execute immediate 'delete from t_temp';
commit;
execute immediate 'drop table t_temp';
end pro_temp;
測(cè)試:
15:23:54 SQL set serveroutput on
15:24:01 SQL exec pro_temp('11','22');
11
PL/SQL 過(guò)程已成功完成。
已用時(shí)間: 00: 00: 00.79
15:24:08 SQL desc t_temp;
ERROR:
ORA-04043: 對(duì)象 t_temp 不存在
3 特性和性能(與普通表和視圖的比較) 臨時(shí)表只在當(dāng)前連接內(nèi)有效臨時(shí)表不建立索引,
所以如果數(shù)據(jù)量比較大或進(jìn)行多次查詢(xún)時(shí),不推薦使用數(shù)據(jù)處理比較復(fù)雜的時(shí)候時(shí)表快,
反之視圖快點(diǎn)在僅僅查詢(xún)數(shù)據(jù)的時(shí)候建議用游標(biāo): open cursor for 'sql clause';
臨時(shí)表的創(chuàng)建
創(chuàng)建Oracle臨時(shí)表,可以有兩種類(lèi)型的臨時(shí)表:會(huì)話(huà)級(jí)的臨時(shí)表和事務(wù)級(jí)的臨時(shí)表。
1)會(huì)話(huà)級(jí)的臨時(shí)表因?yàn)檫@這個(gè)臨時(shí)表中的數(shù)據(jù)和你的當(dāng)前會(huì)話(huà)有關(guān)系,當(dāng)你當(dāng)前SESSION不退出的情況下,臨時(shí)表中的數(shù)據(jù)就還存在,而當(dāng)你退出當(dāng)前SESSION的時(shí)候,臨時(shí)表中的數(shù)據(jù)就全部沒(méi)有了,當(dāng)然這個(gè)時(shí)候你如果以另外一個(gè)SESSION登陸的時(shí)候是看不到另外一個(gè)SESSION中插入到臨時(shí)表中的數(shù)據(jù)的。即兩個(gè)不同的SESSION所插入的數(shù)據(jù)是互不相干的。當(dāng)某一個(gè)SESSION退出之后臨時(shí)表中的數(shù)據(jù)就被截?cái)啵╰runcate table,即數(shù)據(jù)清空)了。會(huì)話(huà)級(jí)的臨時(shí)表創(chuàng)建方法:Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) On Commit Preserve Rows;舉例create global temporary table Student(Stu_id Number(5),Class_id Number(5),Stu_Name Varchar2(8),Stu_Memo varchar2(200)) on Commit Preserve Rows ;
2)事務(wù)級(jí)臨時(shí)表是指該臨時(shí)表與事務(wù)相關(guān),當(dāng)進(jìn)行事務(wù)提交或者事務(wù)回滾的時(shí)候,臨時(shí)表中的數(shù)據(jù)將自行被截?cái)?,其他的?nèi)容和會(huì)話(huà)級(jí)的臨時(shí)表的一致(包括退出SESSION的時(shí)候,事務(wù)級(jí)的臨時(shí)表也會(huì)被自動(dòng)截?cái)啵?。事?wù)級(jí)臨時(shí)表的創(chuàng)建方法:Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) On Commit Delete Rows;舉例:create global temporary table Classes(Class_id Number(5),Class_Name Varchar2(8),Class_Memo varchar2(200)) on Commit delete Rows ;
3)、兩種不通類(lèi)型的臨時(shí)表的區(qū)別:語(yǔ)法上,會(huì)話(huà)級(jí)臨時(shí)表采用on commit preserve rows而事務(wù)級(jí)則采用on commit delete rows;用法上,會(huì)話(huà)級(jí)別只有當(dāng)會(huì)話(huà)結(jié)束臨時(shí)表中的數(shù)據(jù)才會(huì)被截?cái)啵沂聞?wù)級(jí)臨時(shí)表則不管是commit、rollback或者是會(huì)話(huà)結(jié)束,臨時(shí)表中的數(shù)據(jù)都將被截?cái)唷?/p>
例子:
1)、會(huì)話(huà)級(jí)(Session關(guān)閉掉之后數(shù)據(jù)就沒(méi)有了,當(dāng)Commit的時(shí)候則數(shù)據(jù)還在,當(dāng)Rollback的時(shí)候則數(shù)據(jù)也是一樣被回滾):
insert into student(stu_id,class_id,stu_name,stu_memo) values(1,1,'張三','福建');
insert into student(stu_id,class_id,stu_name,stu_memo) values(2,1,'劉德華','福州');
insert into student(stu_id,class_id,stu_name,stu_memo) values(3,2,'S.H.E','廈門(mén)');
SQL select *from student ;
STU_ID CLASS_ID STU_NAME STU_MEMO
------ -------- -------- --------------------------------------------------------------------------------
1 1 張三 福建
2 1 劉德華 福州
3 2 S.H.E 廈門(mén)
4 2 張惠妹 廈門(mén)
SQL commit;
Commit complete
SQL select * from student ;
STU_ID CLASS_ID STU_NAME STU_MEMO
------ -------- -------- --------------------------------------------------------------------------------
1 1 張三 福建
2 1 劉德華 福州
3 2 S.H.E 廈門(mén)
4 2 張惠妹 廈門(mén)
SQLinsert into student(stu_id,class_id,stu_name,stu_memo) values(4,2,'張惠妹','廈門(mén)');
1 row inserted
SQL select * from student ;
STU_ID CLASS_ID STU_NAME STU_MEMO
------ -------- -------- --------------------------------------------------------------------------------
1 1 張三 福建
2 1 劉德華 福州
3 2 S.H.E 廈門(mén)
4 2 張惠妹 廈門(mén)
4 2 張惠妹 廈門(mén)
SQL rollback ;
Rollback complete
SQL select * from student ;
STU_ID CLASS_ID STU_NAME STU_MEMO
------ -------- -------- --------------------------------------------------------------------------------
1 1 張三 福建
2 1 劉德華 福州
3 2 S.H.E 廈門(mén)
4 2 張惠妹 廈門(mén)
SQL
2)、事務(wù)級(jí)(Commit之后就刪除數(shù)據(jù)):本例子將采用以下的數(shù)據(jù):
insert into classes(Class_id,Class_Name,Class_Memo) values(1,'計(jì)算機(jī)','9608');
insert into classes(Class_id,Class_Name,Class_Memo) values(2,'經(jīng)濟(jì)信息','9602');
insert into classes(Class_id,Class_Name,Class_Memo) values(3,'經(jīng)濟(jì)信息','9603');
在一個(gè)SESSION中(比如SQLPLUS登陸)插入上面3條記錄,然后再以另外一個(gè)SESSION(用SQLPLUS再登陸一次)登陸,當(dāng)你select * from classes;的時(shí)候,classes表是空的,而你再第一次登陸的SQLPLUS中select的時(shí)候可以查詢(xún)到,這個(gè)時(shí)候你沒(méi)有進(jìn)行commit或者rollback之前你可以對(duì)剛才插入的3條記錄進(jìn)行update、delete等操作,當(dāng)你進(jìn)行commit或者rollback的時(shí)候,這個(gè)時(shí)候由于你的表是事務(wù)級(jí)的臨時(shí)表,那么在插入數(shù)據(jù)的session也看不到數(shù)據(jù)了,這個(gè)時(shí)候數(shù)據(jù)就已經(jīng)被截?cái)嗔恕?/p>
運(yùn)行結(jié)果如下:
SQL insert into classes(Class_id,Class_Name,Class_Memo) values(1,'計(jì)算機(jī)','9608');
1 row inserted
SQL insert into classes(Class_id,Class_Name,Class_Memo) values(2,'經(jīng)濟(jì)信息','9602');
1 row inserted
SQL insert into classes(Class_id,Class_Name,Class_Memo) values(3,'經(jīng)濟(jì)信息','9603');
1 row inserted
SQL update classes set class_memo ='' where class_id=3 ;
1 row updated
SQL select * from classes ;
CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------
1 計(jì)算機(jī) 9608
2 經(jīng)濟(jì)信息 9602
3 經(jīng)濟(jì)信息
SQL delete from classes where class_id=3 ;
1 row deleted
SQL select * from classes ;
CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------
1 計(jì)算機(jī) 9608
2 經(jīng)濟(jì)信息 9602
SQL commit;
Commit complete
SQL select *from classes ;
CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------
SQL
再重復(fù)插入一次,然后rollback。
SQL Rollback ;
Rollback complete
SQL select * from classes ;
CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------
SQL
臨時(shí)表的應(yīng)用
1)、當(dāng)某一個(gè)SQL語(yǔ)句關(guān)聯(lián)的表在2張及以上,并且和一些小表關(guān)聯(lián)??梢圆捎脤⒋蟊磉M(jìn)行分拆并且得到比較小的結(jié)果集合存放在臨時(shí)表中。
2)、程序執(zhí)行過(guò)程中可能需要存放一些臨時(shí)的數(shù)據(jù),這些數(shù)據(jù)在整個(gè)程序的會(huì)話(huà)過(guò)程中都需要用的等等。
5、注意事項(xiàng):
1)、臨時(shí)表的索引以及對(duì)表的修改、刪除等和正常的表是一致的。
2)、Oracle的臨時(shí)表是Oracle8i才支持的功能特性,如果你的Oracle版本比較低的話(huà),那么就可能沒(méi)有辦法用到了,如果你的Oracle版本是8i的話(huà),你還需要把$ORACLE_HOME/admin/${ORACLE_SID}/pfile目錄下的initORACLE_SID.ora初始參數(shù)配置文件的compatible修改為compatible = "8.1.0",我的服務(wù)器上就是這樣子配置的。當(dāng)然也可以修改為compatible = "8.1.6"
1、Oracle臨時(shí)表分兩種,事務(wù)級(jí)臨時(shí)表和會(huì)話(huà)級(jí)臨時(shí)表
2、事務(wù)級(jí)臨時(shí)表在事務(wù)結(jié)束后會(huì)被清空,會(huì)話(huà)級(jí)臨時(shí)表在事務(wù)結(jié)束后不會(huì)清空而是在回話(huà)結(jié)束會(huì)自動(dòng)清空。
3、如果是在存儲(chǔ)過(guò)程用臨時(shí)表并不需要從臨時(shí)表里把數(shù)據(jù)返回到存儲(chǔ)過(guò)程之外的用事務(wù)級(jí)臨時(shí)表即可;如果要從臨時(shí)表里把數(shù)據(jù)返回到存儲(chǔ)過(guò)程之外則需要用會(huì)話(huà)級(jí)臨時(shí)表(這個(gè)跟mssql不一樣,mssql用事務(wù)級(jí)臨時(shí)表也可以返回結(jié)果)
注:存儲(chǔ)過(guò)程里使用會(huì)話(huà)級(jí)臨時(shí)表時(shí),往臨時(shí)表里插入數(shù)據(jù)前要先清空臨時(shí)表內(nèi)的數(shù)據(jù)
Oracle創(chuàng)建臨時(shí)表的語(yǔ)法如下:
CREATE
GLOBAL
TEMPORARY
TABLE
table
"("
column
datatype
[DEFAULT
expr]
[{
NULL
|
NOT
NULL}]
[,
column
datatype
[DEFAULT
expr]
[
{NULL
|
NOT
NULL}
]...
")"
ON
COMMIT
{DELETE
|
PRESERVE
}
ROWS
;
在Oracle中,可以創(chuàng)建以下兩種臨時(shí)表:
1)
會(huì)話(huà)特有的臨時(shí)表
CREATE
GLOBAL
TEMPORARY
(
)
ON
COMMIT
PRESERVE
ROWS;
2)
事務(wù)特有的臨時(shí)表
CREATE
GLOBAL
TEMPORARY
(
)
ON
COMMIT
DELETE
ROWS;
CREATE
GLOBAL
TEMPORARY
TABLE
MyTempTable