总结如下: 
DDL是一种消耗资源非常大的操作,运行时尽量不要使用DDL语句,应用程序需要的临时表应在运行之前就开始创建。不必在每个存储过程中创建一次。临时表总是存在的,他们作为对象存在于数据字典中,并且总是保持为空,直到有会话在其中放入数据 
1 创建临时表 
Sql代码 

1. create global temporary table 表名  
2. (  
3.   ID               VARCHAR2(100 CHAR),  
4.   NAME         VARCHAR2(100 CHAR)   
5. )  
6. on commit preserve rows;  
 2 创建存储过程 
 Sql代码  
1. create or replace procedure proc_XXX(  
2. mycur out SYS_REFCURSOR  
3. as  
4. TYPE My_CurType IS REF CURSOR;  
5. CUR_1 My_CurType;  
6. tempa varchar2;  
7. tempb varchar2;  
8. --此处可声明更多变更^_^  
9. begin  
10.    
11.     OPEN CUR_1 FOR  select * from 表名;  
12.     
13.     --使用前先清空  
14.     execute immediate 'truncate table  临时表表名';  
15.   
16.   LOOP  
17.   FETCH CUR_1 INTO  tempa;  
18.   EXIT WHEN CUR_1%NOTFOUND;  
19.       
20.       --进行相关的业务查询,将结果返回于更多变量上,插入临时表数据        
21.      tempa:='1';  
22.      tempb:='jack';  
23.      insert into 临时表表名(ID,NAME)values(tempa,tempb);   
24.      commit;    
25. end loop;      
26.   open mycur for  select * from  临时表表名;        
27.   CLOSE  CUR_1;  
28.   message :='查询临时表成功';  
29.   EXCEPTION  
30.   WHEN OTHERS THEN  
31.    message :='查询临时表失败';  
32. end  proc_XXX;


1 创建临时表,插入数据,返回结果集 
Sql代码 

 

1. CREATE OR REPLACE PROCEDURE Report_Month_Responsibility(  
2.  o_cur OUT SYS_REFCURSOR  
3. )  
4. IS  
5. STR VARCHAR2(200);  
6. tb_count INT;  
7. BEGIN  
8.   --先判断全局临时表是否存在,没存在则重新建立:  
9.   select count(*) into tb_count from dba_tables where table_name='REPROTTEST';  
10.   if tb_count=0 then  
11.     STR:=' CREATE GLOBAL TEMPORARY TABLE REPROTTEST(  
12.            ID INT,  
13.            ANAME VARCHAR2(20)  
14.     ) ON COMMIT PRESERVE ROWS';  
15.      execute immediate STR;  
16.   end if;  
17.     
18.   STR:='INSERT INTO REPROTTEST(ID,ANAME)  VALUES(1,''1'')';  
19.   execute immediate STR;  
20.   COMMIT;  
21.   STR:='SELECT * FROM REPROTTEST';  
22.   OPEN o_cur FOR STR; -- 给游标变量赋值  
23. END Report_Month_Responsibility;  
 2 调用存储过程 
 Sql代码  
1. CREATE OR REPLACE PROCEDURE proc_X()  
2. IS  
3.   v_ID INT;  
4.   v_ANAME VARCHAR2(20);        
5.    --定义游标:  
6.    v_account_cur SYS_REFCURSOR;  
7. BEGIN  
8.      --调用存储过程:  
9.        Report_Month_Responsibility(v_account_cur);         
10.        fetch v_account_cur into v_ID,v_ANAME;  
11.       --用循环显示游标中的记录:  
12.        while v_account_cur%found loop  
13.              dbms_output.put_line('The value of column ID is: '||v_ID);--打引列ID  
14.              dbms_output.put_line('The value of column ANAME is: '||v_ANAME);    
15.              --打引列ANAME            
16.              fetch v_account_cur into v_ID,v_ANAME;  
17.        end loop;  
18.        close v_account_cur;      
19.        execute immediate 'truncate TABLE REPROTTEST';     
20. end proc_X;

总结如下:
DDL是一种消耗资源非常大的操作,运行时尽量不要使用DDL语句,应用程序需要的临时表应在运行之前就开始创建。不必在每个存储过程中创建一次。临时表总是存在的,他们作为对象存在于数据字典中,并且总是保持为空,直到有会话在其中放入数据
1 创建临时表
Sql代码 

create global temporary table 表名 
 ( 
   ID               VARCHAR2(100 CHAR), 
   NAME         VARCHAR2(100 CHAR)  
 ) 
 on commit preserve rows; 2 创建存储过程
 Sql代码 
 create or replace procedure proc_XXX( 
 mycur out SYS_REFCURSOR 
 as 
 TYPE My_CurType IS REF CURSOR; 
 CUR_1 My_CurType; 
 tempa varchar2; 
 tempb varchar2; 
 --此处可声明更多变更^_^ 
 begin 
   
     OPEN CUR_1 FOR  select * from 表名; 
    
     --使用前先清空 
     execute immediate 'truncate table  临时表表名'; 
  
   LOOP 
   FETCH CUR_1 INTO  tempa; 
   EXIT WHEN CUR_1%NOTFOUND; 
      
       --进行相关的业务查询,将结果返回于更多变量上,插入临时表数据       
      tempa:='1'; 
      tempb:='jack'; 
      insert into 临时表表名(ID,NAME)values(tempa,tempb);  
      commit;   
 end loop;     
   open mycur for  select * from  临时表表名;       
   CLOSE  CUR_1; 
   message :='查询临时表成功'; 
   EXCEPTION 
   WHEN OTHERS THEN 
    message :='查询临时表失败'; 
 end  proc_XXX; 参考更多
 1 创建临时表,插入数据,返回结果集
 Sql代码 
 CREATE OR REPLACE PROCEDURE Report_Month_Responsibility( 
  o_cur OUT SYS_REFCURSOR 
 ) 
 IS 
 STR VARCHAR2(200); 
 tb_count INT; 
 BEGIN 
   --先判断全局临时表是否存在,没存在则重新建立: 
   select count(*) into tb_count from dba_tables where table_name='REPROTTEST'; 
   if tb_count=0 then 
     STR:=' CREATE GLOBAL TEMPORARY TABLE REPROTTEST( 
            ID INT, 
            ANAME VARCHAR2(20) 
     ) ON COMMIT PRESERVE ROWS'; 
      execute immediate STR; 
   end if; 
    
   STR:='INSERT INTO REPROTTEST(ID,ANAME)  VALUES(1,''1'')'; 
   execute immediate STR; 
   COMMIT; 
   STR:='SELECT * FROM REPROTTEST'; 
   OPEN o_cur FOR STR; -- 给游标变量赋值 
 END Report_Month_Responsibility; 2 调用存储过程
 Sql代码 
 CREATE OR REPLACE PROCEDURE proc_X() 
 IS 
   v_ID INT; 
   v_ANAME VARCHAR2(20);       
    --定义游标: 
    v_account_cur SYS_REFCURSOR; 
 BEGIN 
      --调用存储过程: 
        Report_Month_Responsibility(v_account_cur);        
        fetch v_account_cur into v_ID,v_ANAME; 
       --用循环显示游标中的记录: 
        while v_account_cur%found loop 
              dbms_output.put_line('The value of column ID is: '||v_ID);--打引列ID 
              dbms_output.put_line('The value of column ANAME is: '||v_ANAME);   
              --打引列ANAME           
              fetch v_account_cur into v_ID,v_ANAME; 
        end loop; 
        close v_account_cur;     
        execute immediate 'truncate TABLE REPROTTEST';    
 end proc_X;

作者“咫尺天涯”