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

創建臨時表存儲

發布時間: 2022-09-12 00:33:34

1. oracle 怎麼在存儲過程中創建一個臨時表,在裡面插入數據,再查找這個臨時表的所有數據,最後drop這個表。

Oracle
的臨時表的
處理機制,

sql
Server
的不一樣。
假如你的臨時表的結構不是每次執行都發生變化的話
那麼就是事先
通過
CREATE
GLOBAL
TEMPORARY
TABLE
語句,把臨時表建立好。
存儲過程裡面,就根據需要,
執行
INSERT
/
SELECT
之類的操作就可以了

2. 在存儲過程中創建臨時表,並對臨時表進行操作!在線等答案!

創建臨時表與正常表一樣,操作也一樣。只是不用刪除,執行完成後就自動沒有了
CREATE TABLE #TMP(FIELD1 INT,FIELD2 VARCHAR(30))

CREATE TABLE ##TMP(FIELD1 INT,FIELD2 VARCHAR(30))

3. 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。

4. 關於在存儲過程中建立臨時表

你試過了嗎?
這樣建是允許的!!不過這樣建的表屬於本地臨時表。當存儲過程完成時,將自動刪除在存儲過程中創建的本地臨時表。
可能是被刪了你沒看到
--------
CREATE
PROCEDURE
dbo.Test2
AS
CREATE
TABLE
#t(x
INT
PRIMARY
KEY);
INSERT
INTO
#t
VALUES
(2);
SELECT
Test2Col
=
x
FROM
#t;
GO
CREATE
PROCEDURE
dbo.Test1
AS
CREATE
TABLE
#t(x
INT
PRIMARY
KEY);
INSERT
INTO
#t
VALUES
(1);
SELECT
Test1Col
=
x
FROM
#t;
EXEC
Test2;
GO
CREATE
TABLE
#t(x
INT
PRIMARY
KEY);
INSERT
INTO
#t
VALUES
(99);
GO
EXEC
Test1;
GO
這是個例子你可以運行了看看結果!!

5. oracle存儲中創建並查詢臨時表

Oracle中的臨時表用法匯總

說明:下文中的一些說明和示例代碼摘自CSDN,恕不一一指明出處,在此一並對相關作者表示感謝! 如果作者有異議,請來信說明

1 語法 在Oracle中,可以創建以下兩種臨時表:
1) 會話特有的臨時表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification> )
ON COMMIT PRESERVE ROWS;
2) 事務特有的臨時表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification> )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的臨時表雖然是存在的,但是如果insert 一條記錄然後用別的連接登上去select,記錄是空的。

--ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交後ORACLE將截斷表(刪除全部行)
--ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。

2 動態創建
create or replace procere 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_num<1 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;

測試:

15:23:54 SQL> set serveroutput on
15:24:01 SQL> exec pro_temp('11','22');
11

PL/SQL 過程已成功完成。

已用時間: 00: 00: 00.79
15:24:08 SQL> desc t_temp;
ERROR:
ORA-04043: 對象 t_temp 不存在

3 特性和性能(與普通表和視圖的比較) 臨時表只在當前連接內有效臨時表不建立索引,
所以如果數據量比較大或進行多次查詢時,不推薦使用數據處理比較復雜的時候時錶快,
反之視圖快點在僅僅查詢數據的時候建議用游標: open cursor for 'sql clause';

臨時表的創建
創建Oracle臨時表,可以有兩種類型的臨時表:會話級的臨時表和事務級的臨時表。
1)會話級的臨時表因為這這個臨時表中的數據和你的當前會話有關系,當你當前SESSION不退出的情況下,臨時表中的數據就還存在,而當你退出當前SESSION的時候,臨時表中的數據就全部沒有了,當然這個時候你如果以另外一個SESSION登陸的時候是看不到另外一個SESSION中插入到臨時表中的數據的。即兩個不同的SESSION所插入的數據是互不相乾的。當某一個SESSION退出之後臨時表中的數據就被截斷(truncate table,即數據清空)了。會話級的臨時表創建方法: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)事務級臨時表是指該臨時表與事務相關,當進行事務提交或者事務回滾的時候,臨時表中的數據將自行被截斷,其他的內容和會話級的臨時表的一致(包括退出SESSION的時候,事務級的臨時表也會被自動截斷)。事務級臨時表的創建方法: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)、兩種不通類型的臨時表的區別:語法上,會話級臨時表採用on commit preserve rows而事務級則採用on commit delete rows;用法上,會話級別只有當會話結束臨時表中的數據才會被截斷,而且事務級臨時表則不管是commit、rollback或者是會話結束,臨時表中的數據都將被截斷。

例子:
1)、會話級(Session關閉掉之後數據就沒有了,當Commit的時候則數據還在,當Rollback的時候則數據也是一樣被回滾):
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','廈門');
SQL> select *from student ;

STU_ID CLASS_ID STU_NAME STU_MEMO
------ -------- -------- --------------------------------------------------------------------------------
1 1 張三 福建
2 1 劉德華 福州
3 2 S.H.E 廈門
4 2 張惠妹 廈門

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 廈門
4 2 張惠妹 廈門
SQL>insert into student(stu_id,class_id,stu_name,stu_memo) values(4,2,'張惠妹','廈門');

1 row inserted

SQL> select * from student ;

STU_ID CLASS_ID STU_NAME STU_MEMO
------ -------- -------- --------------------------------------------------------------------------------
1 1 張三 福建
2 1 劉德華 福州
3 2 S.H.E 廈門
4 2 張惠妹 廈門
4 2 張惠妹 廈門

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 廈門
4 2 張惠妹 廈門

SQL>
2)、事務級(Commit之後就刪除數據):本例子將採用以下的數據:
insert into classes(Class_id,Class_Name,Class_Memo) values(1,'計算機','9608');
insert into classes(Class_id,Class_Name,Class_Memo) values(2,'經濟信息','9602');
insert into classes(Class_id,Class_Name,Class_Memo) values(3,'經濟信息','9603');
在一個SESSION中(比如SQLPLUS登陸)插入上面3條記錄,然後再以另外一個SESSION(用SQLPLUS再登陸一次)登陸,當你select * from classes;的時候,classes表是空的,而你再第一次登陸的SQLPLUS中select的時候可以查詢到,這個時候你沒有進行commit或者rollback之前你可以對剛才插入的3條記錄進行update、delete等操作,當你進行commit或者rollback的時候,這個時候由於你的表是事務級的臨時表,那麼在插入數據的session也看不到數據了,這個時候數據就已經被截斷了。
運行結果如下:
SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(1,'計算機','9608');

1 row inserted

SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(2,'經濟信息','9602');

1 row inserted

SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(3,'經濟信息','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 計算機 9608
2 經濟信息 9602
3 經濟信息

SQL> delete from classes where class_id=3 ;

1 row deleted

SQL> select * from classes ;

CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------
1 計算機 9608
2 經濟信息 9602
SQL> commit;

Commit complete

SQL> select *from classes ;

CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------

SQL>
再重復插入一次,然後rollback。
SQL> Rollback ;

Rollback complete

SQL> select * from classes ;

CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------

SQL>

臨時表的應用
1)、當某一個SQL語句關聯的表在2張及以上,並且和一些小表關聯。可以採用將大表進行分拆並且得到比較小的結果集合存放在臨時表中。
2)、程序執行過程中可能需要存放一些臨時的數據,這些數據在整個程序的會話過程中都需要用的等等。
5、注意事項:
1)、臨時表的索引以及對表的修改、刪除等和正常的表是一致的。
2)、Oracle的臨時表是Oracle8i才支持的功能特性,如果你的Oracle版本比較低的話,那麼就可能沒有辦法用到了,如果你的Oracle版本是8i的話,你還需要把$ORACLE_HOME/admin/${ORACLE_SID}/pfile目錄下的init<ORACLE_SID>.ora初始參數配置文件的compatible修改為compatible = "8.1.0",我的伺服器上就是這樣子配置的。當然也可以修改為compatible = "8.1.6"

6. mysql臨時表創建後存放在那裡怎樣給某一個資料庫創建臨時表

MySQL 需要創建隱式臨時表來解決某些類型的查詢。往往查詢的排序階段需要依賴臨時表。例如,當您使用 GROUP BY,ORDER BY 或DISTINCT 時。這樣的查詢分兩個階段執行:首先是收集數據並將它們放入臨時表中,然後是在臨時表上執行排序。
對於某些 UNION 語句,不能合並的 VIEW,子查詢時用到派生表,多表 UPDATE 以及其他一些情況,還需要使用臨時表。如果臨時表很小,可以到內存中創建,否則它將在磁碟上創建。MySQL 在內存中創建了一個表,如果它變得太大,就會被轉換為磁碟上存儲。內存臨時表的最大值由 tmp_table_size 或 max_heap_table_size 值定義,以較小者為准。MySQL 5.7 中的默認大小為 16MB。如果運行查詢的數據量較大,或者尚未查詢優化,則可以增加該值。設置閾值時,請考慮可用的 RAM 大小以及峰值期間的並發連接數。你無法無限期地增加變數,因為在某些時候你需要讓 MySQL 使用磁碟上的臨時表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,則即使大小小於配置的閾值,也會在磁碟上創建臨時表。

7. sql如何創建臨時表

網上其實很多相關文章,你可以搜一下,並不一定需要在這里提問。
轉帖一篇給你吧

drop table #Tmp --刪除臨時表#Tmp
create table #Tmp --創建臨時表#Tmp
(
ID int IDENTITY (1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
WokNo varchar(50),
primary key (ID) --定義ID為臨時表#Tmp的主鍵
);
Select * from #Tmp --查詢臨時表的數據
truncate table #Tmp --清空臨時表的所有數據和約束

相關例子:

Declare @Wokno Varchar(500) --用來記錄職工號
Declare @Str NVarchar(4000) --用來存放查詢語句
Declare @Count int --求出總記錄數
Declare @i int
Set @i = 0
Select @Count = Count(Distinct(Wokno)) from #Tmp
While @i < @Count
Begin
Set @Str = 'Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str(@i) + 'id from #Tmp)'
Exec Sp_ExecuteSql @Str,N'@WokNo Varchar(500) OutPut',@WokNo Output
Select @WokNo,@i --一行一行把職工號顯示出來
Set @i = @i + 1
End

臨時表
可以創建本地和全局臨時表。本地臨時表僅在當前會話中可見;全局臨時表在所有會話中都可見。
本地臨時表的名稱前面有一個編號符 (#table_name),而全局臨時表的名稱前面有兩個編號符 (##table_name)。

SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

如果本地臨時表由存儲過程創建或由多個用戶同時執行的應用程序創建,則 SQL Server 必須能夠區分由不同用戶創建的表。為此,SQL
Server 在內部為每個本地臨時表的表名追加一個數字後綴。存儲在 tempdb 資料庫的 sysobjects 表中的臨時表,其全名由
CREATE TABLE 語句中指定的表名和系統生成的數字後綴組成。為了允許追加後綴,為本地臨時表指定的表名 table_name 不能超過
116 個字元。

除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:

當存儲過程完成時,將自動除去在存儲過程中創建的本地臨時表。由創建表的存儲過程執行的所有嵌套存儲過程都可以引用此表。但調用創建此表的存儲過程的進程無法引用此表。

所有其它本地臨時表在當前會話結束時自動除去。

全局臨時表在創建此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 語句的生存周期內保持。換言之,當創建全局臨時表的會話結束時,最後一條引用此表的 Transact-SQL 語句完成後,將自動除去此表。

存儲過程或觸發器中創建的本地臨時表與在調用存儲過程或觸發器之前創建的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪
個表解析該查詢。嵌套存儲過程同樣可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為是針對該嵌套過程所
創建的表,例如:

CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO

下面是結果集:

(1 row(s) affected)

Test1Col
-----------
1

(1 row(s) affected)

Test2Col
-----------
2

當創建本地或全局臨時表時,CREATE TABLE 語法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定
FOREIGN KEY 約束,該語句將返回警告信息,指出此約束已被忽略,表仍會創建,但不具有 FOREIGN KEY 約束。在 FOREIGN
KEY 約束中不能引用臨時表。

考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地創建索引時,或多個存儲過程或函數需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。

8. SQL 存儲過程和在存儲過程中創建臨時表

把你所有涉及的表自段發上來
你這樣怎麼給你寫啊
ha是哪個表的自段啊
需求明確了給你寫
才20分也太少了吧
這個工作量可不小哦
想當初我給人寫這么左右的存儲過程
拿了500塊人民幣呢呢
呵呵!
建立臨時表只是在表的前面加一個#,其它都輿建立實表相同,建立過程我相信你都知道了,就不用我多說了
Egg:
create
table
#temp
(id
int,
name
varchar(50)
)

9. GreatDB資料庫對臨時表存儲機制是怎樣的

GreatDB臨時表存儲在默認存儲引擎(一般是InnoDB);如果創建臨時表的時候,明確聲明類型為HEAP,則GreatDB會在內存中創建該臨時表Heap方式,指定存放在內存中,如果超過默認配置的大小(可配置),會轉存儲為磁碟臨時表,提交或會話結束結束後釋放臨時表存儲空間

10. 存儲過程中的臨時表是怎麼生成的

不知道樓主的需求如何一般沒必要創建臨時表,處理數據後又它drop。存儲過程中要用到的表應該會經常用到。就讓它存在吧,用完用 truncate table 清理數據就可以了。空表不會占很多資源。 我們就是這樣做的。

熱點內容
php解壓程序 發布:2025-01-15 17:06:22 瀏覽:140
刷助力腳本 發布:2025-01-15 17:02:31 瀏覽:519
c盤里的用戶文件夾可以刪除 發布:2025-01-15 16:56:45 瀏覽:949
虛幻4編譯到哪裡 發布:2025-01-15 16:50:19 瀏覽:754
透明度漸變android 發布:2025-01-15 16:45:08 瀏覽:834
dos連接oracle資料庫 發布:2025-01-15 16:41:39 瀏覽:904
網路配置比較低怎麼做 發布:2025-01-15 16:35:38 瀏覽:361
android彈出鍵盤監聽 發布:2025-01-15 16:35:11 瀏覽:207
uz畫圖編程 發布:2025-01-15 16:32:44 瀏覽:883
ppt怎麼解壓 發布:2025-01-15 16:14:58 瀏覽:849