當前位置:首頁 » 存儲配置 » oracle存儲過程創建臨時表

oracle存儲過程創建臨時表

發布時間: 2022-09-26 00:46:30

㈠ oracle 在存儲過程中動態的建一個臨時表使用和在資料庫里寫死一個臨時表使用兩者有什麼區別

我們仍使用實驗 05中的環境,略去准備數據的過程。

我們仍然使用兩個會話,一個會話 run,用於運行主 sql;另一個會話 ps,用於進行 performance_schema 的觀察:

主會話線程號為 29,

可以看到寫入的線程是 page_clean_thread,是一個刷臟操作,這樣就能理解數據為什麼是慢慢寫入的。

也可以看到每個 IO 操作的大小是 16K,也就是刷數據頁的操作。


結論:

我們可以看到,

1. MySQL 會基本遵守 max_heap_table_size 的設定,在內存不夠用時,直接將表轉到磁碟上存儲。

2. 由於引擎不同(內存中表引擎為 heap,磁碟中表引擎則跟隨 internal_tmp_disk_storage_engine 的配置),本次實驗寫磁碟的數據量和實驗 05中使用內存的數據量不同。

3. 如果臨時表要使用磁碟,表引擎配置為 InnoDB,那麼即使臨時表在一個時間很短的 SQL 中使用,且使用後即釋放,釋放後也會刷臟頁到磁碟中,消耗部分 IO。

㈡ oracle存儲過程中臨時表的使用,該怎麼處理

1、Oracle臨時表分兩種,事務級臨時表和會話級臨時表
2、事務級臨時表在事務結束後會被清空,會話級臨時表在事務結束後不會清空而是在回話結束會自動清空。
3、如果是在存儲過程用臨時表並不需要從臨時表裡把數據返回到存儲過程之外的用事務級臨時表即可;如果要從臨時表裡把數據返回到存儲過程之外則需要用會話級臨時表(這個跟mssql不一樣,mssql用事務級臨時表也可以返回結果)
註:存儲過程里使用會話級臨時表時,往臨時表裡插入數據前要先清空臨時表內的數據

㈢ oracle中,存儲過程建的臨時表

create table tmp_臨時表 as select * from 表名 ;// 這邊是創建臨時表再將數據添加到臨時表

insert into tmp_臨時表 select * from 表名 ; // 和上面的一樣,但是這個是臨時表已經存在新增數據

㈣ oracle存儲過程中臨時表的使用,該怎麼處理

1、Oracle臨時表分兩種,事務級臨時表和會話級臨時表
2、事務級臨時表在事務結束後會被清空,會話級臨時表在事務結束後不會清空而是在回話結束會自動清空。
3、如果是在存儲過程用臨時表並不需要從臨時表裡把數據返回到存儲過程之外的用事務級臨時表即可;如果要從臨時表裡把數據返回到存儲過程之外則需要用會話級臨時表(這個跟mssql不一樣,mssql用事務級臨時表也可以返回結果)
註:存儲過程里使用會話級臨時表時,往臨時表裡插入數據前要先清空臨時表內的數據

㈤ ORACLE存儲過程創建臨時表並插入數據。

存儲過程創建表後,在編譯階段資料庫中並沒有該表。這時向表中插入數據,會提示表不存在。所以,插入語句要賦值到變數里,通過e來執行。

㈥ oracle中的臨時表

臨時表就是用來暫時保存臨時數據(亦或叫中間數據)的一個資料庫對象,它和普通表有些類似,然而又有很大區別。它只能存儲在臨時表空間,而非用戶的表空間。ORACLE臨時表是會話或事務級別的,只對當前會話或事務可見。每個會話只能查看和修改自己的數據。

ORACLE臨時表有兩種類型:會話級的臨時表和事務級的臨時表。
1)ON COMMIT DELETE ROWS
它是臨時表的默認參數,表示臨時表中的數據僅在事物過程(Transaction)中有效,當事物提交(COMMIT)後,臨時表的暫時段將被自動截斷(TRUNCATE),但是臨時表的結構 以及元數據還存儲在用戶的數據字典中。如果臨時表完成它的使命後,最好刪除臨時表,否則資料庫會殘留很多臨時表的表結構和元數據。
2)ON COMMIT PRESERVE ROWS
它表示臨時表的內容可以跨事物而存在,不過,當該會話結束時,臨時表的暫時段將隨著會話的結束而被丟棄,臨時表中的數據自然也就隨之丟棄。但是臨時表的結構以及元數據還存儲在用戶的數據字典中。如果臨時表完成它的使命後,最好刪除臨時表,否則資料庫會殘留很多臨時表的表結構和元數據。
1:會話級的臨時表的數據和你當前會話有關系,當前SESSION不退出的情況下,臨時表中的數據就還存在,臨時表的數據只有當你退出當前SESSION的時候才被截斷(TRUNCATE TABLE),如下所示:
會話級別的臨時表創建:
復制代碼
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>
復制代碼

2:事務級的臨時表(默認),這種類型的臨時表與事務有關,當進行事務提交或者事務回滾的時候,臨時表的數據將自行截斷,即當COMMIT或ROLLBACK時,數據就會被TRUNCATE掉,其它的特性和會話級的臨時表一致。
事務級臨時表的創建方法:
復制代碼
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>
復制代碼

3:關於臨時表只對當前會話或事務可見。每個會話只能查看和修改自己的數據。
用DM用戶登錄資料庫,打開SESSION 1後,創建臨時表TMP_TEST

復制代碼
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>
復制代碼

用sys用戶登錄資料庫,打開SESSION 2
SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TMP_TEST' --可以查到臨時表數據
SELECT * FROM DM.TMP_TEST; --查不到數據,即使TMP_TEST臨時表存在數據。

臨時表與永久表區別
復制代碼
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
復制代碼

㈦ oracle使用存儲過程創建臨時表提示ORA-24344: success with compilation error

str:='INSERTINTOTEMP_ACTIVITY(
SELECT
TO_CHAR(A1."FEndTime",'YYYY')||'年'||TO_CHAR(A1."FEndTime",'MM')||'月'||TO_CHAR(A1."FEndTime",'DD')||'日'AS"ActivityDate",
A2."FName"AS"ActivityUser",
A1."FSFPlan"AS"ActivityPLan",
A3."FName"AS"ActivityCustomer",
A1."FDescription"AS"Activity",
A1."FAttainment"AS"Attainment",
A1."FDescriptios"AS"Descriptios"
FROM"TcActivity"A1
LEFTJOIN"TsUser"A2ONA2."FId"=A1."FUserId"
LEFTJOIN"YstCustomer"A3ONA3."FId"=A1."FCustomerId")';

把這個sql 輸出來看看,多了一個「(」。

㈧ ORACLE 存儲過程中創建了臨時表,但是查詢該臨時表時,編譯 提示『表或者視圖不存在』,求高手解答。

當然會報這個錯誤了,編譯的時候沒有這個對象(select * from PRTLSTDEL_TMP)肯定會出錯,編譯不成功就不能執行,不能執行這個臨時表就創建不了。

怎麼會有這么奇葩的需求?

你要把select * from PRTLSTDEL_TMP這里也變成動態的才行

就算改好了成功了, 你的程序也只能執行一次,因為"v_sqlcreate := 'create global temporary table PRTLSTDEL_TMP(" 會報對象已存在

熱點內容
監控腳本實用 發布:2022-11-30 14:14:28 瀏覽:376
九陰真經顯血腳本 發布:2022-11-30 14:14:22 瀏覽:195
浪潮伺服器mgn口地址 發布:2022-11-30 14:13:41 瀏覽:818
linux鎖屏設置 發布:2022-11-30 14:08:20 瀏覽:894
演算法轉讓 發布:2022-11-30 14:07:24 瀏覽:22
我的世界為什麼從伺服器斷開連接 發布:2022-11-30 14:07:04 瀏覽:427
怎麼擠出母乳存儲袋中的空氣 發布:2022-11-30 14:05:32 瀏覽:31
linuxbin文件 發布:2022-11-30 14:01:19 瀏覽:479
購物網站源碼php 發布:2022-11-30 13:58:15 瀏覽:472
python執行java 發布:2022-11-30 13:56:23 瀏覽:940