在ORACLE存储过程中创建临时表
    在ORACLE存储过程中创建临时表
存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行
--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
CREATE OR REPLACE PROCEDURE temptest
(p_searchDate IN DATE)
IS
v_count INT;
str varchar2(300);
BEGIN
v_count := 0;
str:='drop table SETT_DAILYTEST';
execute immediate str;
str:='CREATE GLOBAL TEMPORARY TABLE SETT_DAILYTEST (
NACCOUNTID NUMBER not null,
NSUBACCOUNTID NUMBER not null)
ON COMMIT PRESERVE ROWS';
execute immediate str; ----使用动态SQL语句来执行
str:='insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance)';
execute immediate str;
END temptest;
上面建立一个临时表的存储过程
下面是执行一些操作,向临时表写数据。
CREATE OR REPLACE PROCEDURE PR_DAILYCHECK
(
p_Date IN DATE,
p_Office IN INTEGER,
p_Currency IN INTEGER,
P_Check IN INTEGER,
p_countNum OUT INTEGER)
IS
v_count INT;
BEGIN
v_count := 0;
IF p_Date IS NULL THEN
dbms_output.put_line('日期不能为空');
ELSE
IF P_Check = 1 THEN
insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
where dtdate = p_Date);
select
count(sd.naccountid) into v_count
from sett_subaccount ss,sett_account sa,sett_dailytest sd
where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
and rownum < 2;
COMMIT;
p_countNum := v_count;
dbms_output.put_line(p_countNum);
END IF;
IF P_Check = 2 THEN
insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
where dtdate = p_Date);
select
count(sd.naccountid) into v_count
from sett_cfsubaccount ss,sett_account sa,sett_dailytest sd
where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
and rownum < 2;
COMMIT;
p_countNum := v_count;
dbms_output.put_line(p_countNum);
END IF;
END IF;
END PR_DAILYCHECK;
需要创建一个临时表,请举例说明,谢谢! 
--------------------------- 
是TEMPORARY 
CREATE GLOBAL TEMPORARY TABLE flight_schedule ( 
startdate DATE, 
enddate DATE, 
cost NUMBER) 
--------------------------- 
create proecdure name_pro 
as 
str varchar2(100); 
begin 
str:='CREATE GLOBAL TEMPORARY TABLE TABLENAME ON COMMIT PRESERVE ROWS as select * from others_table'; 
execute immediate str; 
end; 
/ 
可以把临时表指定为事务相关(默认)或者是会话相关: 
ON COMMIT DELETE ROWS:指定临时表是事务相关的,Oracle在每次提交后截断表。 
ON COMMIT PRESERVE ROWS:指定临时表是会话相关的,Oracle在会话中止后截断表。 
================= 
可以创建以下两种临时表: 
1。会话特有的临时表 
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) 
ON COMMIT PRESERVE ROWS; 
======== 
对全局临时表的总结 
在临时表上的操作比在一般的表上的操作要快。因为: 
1创建临时表不需要往编目表中插入条目,临时表的使用也不需要访问编目表,因此也没有对编目表的争用。 
2仅有创建临时表的app才可存取临时表,所以在处理临时表时没有锁。 
3如果指定NOT LOGGED选项,在处理临时表时不记日志。所以如果有仅在数据库的一个会话中使用的大量临时数据,把这些数据存入临时表能大大提高性能。 
DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20)); 
在CONNECT RESET命令后,临时表不再存在。 
建临时表是动态编译的,所以对临时表的使用也必须放在DECLARE CURSER 后面 
CREATE PROCEDURE INSTT2(P1 INT, P2 CHAR(20)) 
BEGIN 
DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20)) % 
INSERT INTO SESSION.TT VALUES(P1, P2); 
BEGIN 
DECLARE C1 CURSOR WITH RETURN FOR SELECT * FROM SESSION.TT; 
END; 
END % 
2。事务特有的临时表 
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) 
ON COMMIT DELETE ROWS; 
在Oracle中,全局临时表并不会删除,实际上你只需要建立一次,以后直接应用就行了,这与MS和Sybase不一样。实际上在断开数据库连接时,临时表中数