大家都知道,临时表分为事务级的和会话级的,如:
CREATE GLOBAL TEMPORARY TABLE admin_work_area--事务级
        (
        
          name varchar(20),
          v_count int
         
         )
      ON COMMIT DELETE ROWS;
      
CREATE GLOBAL TEMPORARY TABLE admin_work_area--会话级
(
            
  name varchar(20),
  v_count int
             
 )
 ON COMMIT PRESERVE ROWS;
但是我平时用到的都是会话级的,因为总要展示数据,会话级的能存住数据,不知道事务级的临时表都有哪些应用呢,请大家谈一下各自的认识或遇到使用事务级临时表的情况。

解决方案 »

  1.   

    会话级的临时表    
    CREATE GLOBAL TEMPORARY   (   )    
       ON COMMIT PRESERVE ROWS;    
       
    事务级的临时表    
    CREATE GLOBAL TEMPORARY   (   )    
       ON COMMIT DELETE ROWS;  --ON COMMIT DELETE ROWS     说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)    
       
    --ON COMMIT PRESERVE ROWS   说明临时表是会话指定,当中断会话时ORACLE将截断表。 
      

  2.   

      1 语法   在Oracle中,可以创建以下两种临时表: 
      1) 会话特有的临时表 
      CREATE GLOBAL TEMPORARY ( ) 
      ON COMMIT PRESERVE ROWS;   2) 事务特有的临时表 
      CREATE GLOBAL TEMPORARY ( ) 
      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 procedure 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'; 
      

  3.   

    4楼的大侠,你给的存储过程编译不过去呀,你帮看下是什么错误啊:
    SQL>  create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as 
      2    v_num number; 
      3   begin 
      4    select count(*) into v_num from user_tables where table_name='T_TEMP';   
      5    --create temporary table 
      6    if v_num<1 then 
      7    execute immediate 'CREATE GLOBAL TEMPORARY TABLE T_TEMP ( 
      8    COL1 VARCHAR2(10), 
      9    COL2 VARCHAR2(10) 
     10    ) ON COMMIT delete ROWS'; 
     11    end if;   
     12    --insert data 
     13    execute immediate 'insert into t_temp values('''  v_col1  ''','''  v_col2  ''')'; 
      
     14    execute immediate 'select col1 from t_temp' into v_num; 
     15    dbms_output.put_line(v_num); 
     16    execute immediate 'delete from t_temp'; 
     17    commit; 
     18    execute immediate 'drop table t_temp'; 
     19    end pro_temp; 
     20  /警告: 创建的过程带有编译错误。
      

  4.   

    SQL> show errors;
    PROCEDURE PRO_TEMP 出现错误:LINE/COL ERROR
    -------- -----------------------------------------------------------------
    2/2      PLS-00103: 出现符号 ""在需要下列之一时:
             begin function package pragma
             procedure subtype type use <an identifier>
             <a double-quoted delimited-identifier> form current cursor
             external language
    请问4楼的大侠不报这样的错误吗,你是怎么执行的呀