在oracle儲存過程中建立臨時表

2021-09-04 02:27:06 字數 2706 閱讀 7556

首先需要對oracle中臨時表有個大概的了解:

1簡介 

oracle資料庫除了可以儲存永久表外,還可以建立臨時表temporary tables。這些臨時表用來儲存乙個會話session的資料, 

或者儲存在乙個事務中需要的資料。當會話退出或者使用者提交commit和回滾rollback事務的時候,臨時表的資料自動清空, 

但是臨時表的結構以及元資料還儲存在使用者的資料字典中。 

臨時表只在oracle8i以及以上產品中支援。 

2詳細介紹 

oracle臨時表分為 會話級臨時表 和 事務級臨時表。 

會話級臨時表是指臨時表中的資料只在會話生命週期之中存在,當使用者退出會話結束的時候,oracle自動清除臨時表中資料。 

事務級臨時表是指臨時表中的資料只在事務生命週期中存在。當乙個事務結束(commit or rollback),oracle自動清除臨時表中資料。 

臨時表中的資料只對當前session有效,每個session都有自己的臨時資料,並且不能訪問其它session的臨時表中的資料。因此, 

臨時表不需要dml鎖.當乙個會話結束(使用者正常退出 使用者不正常退出 oracle例項崩潰)或者乙個事務結束的時候,oracle對這個會話的 

表執行 truncate 語句清空臨時表資料.但不會清空其它會話臨時表中的資料. 

你可以索引臨時表和在臨時表基礎上建立檢視.同樣,建立在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效. 

臨時表可以擁有觸發器. 

3建立臨時表 

臨時表的定義對所有會話session都是可見的,但是表中的資料只對當前的會話或者事務有效. 

建立方法: 

1) on commit delete rows 定義了建立事務級臨時表的方法.

create global temporary table admin_work_area 

(startdate date,

enddate date,

class char(20))

on commit delete rows;

2)on commit preserve rows 定義了建立會話級臨時表的方法.

create global temporary table admin_work_area 

(startdate date,

enddate date,

class char(20))

on commit preserve rows;

example:

會話1:

sql> drop table admin_work_area; 

sql> create global temporary table admin_work_area

(startdate date,

enddate date,

class char(20))

on commit preserve rows;

sql> insert into permernate values(2);

sql> insert into admin_work_area values(sysdate,sysdate, 'session temperary ');

sql> commit;

sql> select * from permernate;

a ----------

sql> select * from admin_work_area;

startdate enddate class

---------- ---------- --------------------

17-1?? -03 17-1?? -03 session temperary

會話2:

sql> select * from permernate;

a ----------

sql> select * from admin_work_area;

未選擇行.

會話2看不見會話1中臨時表的資料.

在oracle的儲存過程中,不能直接使用ddl語句,比如create、alter、drop、truncate等。

那如果我們想在儲存過程中建立一張臨時表就只能使用動態sql語句了:

create or replace procedure pro as

str_sql varchar2(100);

begin

-- 建立臨時表

str_sql := 'create global temporary table temp_table (

col1 varchar2(10),

col2 number

) on commit preserve rows';

execute immediate str_sql;

-- 使用臨時表

str_sql := 'insert into temp_table(col1, col2) values(''a'', 1)';

execute immediate str_sql;

-- 刪除臨時表

str_sql := 'drop table temp_table';

execute immediate str_sql;

end;

在ORACLE儲存過程中建立臨時表

create procedure pro asstr varchar2 100 begin str create global temporary table tablename col1 varchar2 10 col2 number on mit preserve rows execute im...

在ORACLE儲存過程中建立臨時表

create procedure pro asstr varchar2 100 begin str create global temporary table tablename col1 varchar2 10 col2 number on commit preserve rows execute...

在ORACLE儲存過程中建立臨時表

在oracle儲存過程中建立臨時表 儲存過程裡不能直接使用ddl語句,所以只能使用動態sql語句來執行 on commit delete rows 說明臨時表是事務指定,每次提交後oracle將截斷表 刪除全部行 on commit preserve rows 說明臨時表是會話指定,當中斷會話時or...