如题。

解决方案 »

  1.   

    create global temporary table tb --tb 表名
    (zi number,zi2 char(5) )
    ON COMMIT PRESERVE ROWS; 
    --ON COMMIT PRESERVE ROWS 表示会话中断 数据没有了
      

  2.   

    --创建临时表
    create global temporary table tmp(id number,name varchar2(20)) on commit delete rows;
    详细可参见:http://blog.csdn.net/wyzxg/archive/2007/11/13/1882347.aspx
      

  3.   

    oracle临时表一般不用删除的,只是其中的数据“临时”而已
      

  4.   

    先前 以为是这样 写的
    create table tb(zi number,zi2 char(5)) tablespace temp上网查了 不行  互相学习
      

  5.   

    这个可以不
    with tab as 
    (
    select chr(rownum) from dual connect by rownum <100
    )
      

  6.   

    -----“多次”:是在什么情况下的“多次”?是在同一会话、同一个存储过程中,还是在不同会话中?
    -- 示例如下:-------------------创建临时表-------------------------------------
    DROP TABLE mBlogreview_tmp_proc;
    Create Global Temporary Table mBlogreview_tmp_proc
    (rid NUMBER(18,0) ,
    reviewid NUMBER(18,0),
    blogid NUMBER(18,0),
    reviewownername  VARCHAR2(30),
    reviewcontent     VARCHAR2(4000),
    reviewcreationdate     VARCHAR2(30))
    On Commit preserve Rows;
    -------------创建包----------------------------------------------
    Create or replace package pkg_mBlogreview_se
    as
      type myrctype is ref cursor;
      procedure mBlogreview_se_proc(v_blogID number,v_page number default 1,v_pageSize number default 5,v_num out number,p_rc out myrctype);
    end pkg_mBlogreview_se;
    /--------------------------------------------------------------------
    create or replace package body pkg_mBlogreview_se
    as
      procedure mBlogreview_se_proc(v_blogID number,v_page number default 1,v_pageSize number default 5,v_num out number,p_rc out myrctype)
      is 
        sqlstr VARCHAR2(2000);
      begin
        sqlstr :=
       'INSERT INTO mBlogreview_tmp_proc(rid,reviewid,blogid,reviewownername,reviewcontent,reviewcreationdate)
         SELECT ROW_NUMBER() over(order by ReviewCreationDate desc) as rid, reviewid,BlogID,
         reviewownername,reviewContent,to_char(ReviewCreationDate,''YYYY-MM-DD HH24:MI:SS'') as reviewcreationdate
         FROM mvnforumBlogreview where blogid='''||v_blogID||'''';
         execute immediate sqlstr;
         select count(*) into v_num from mBlogreview_tmp_proc;
         sqlstr :='SELECT t.rid ,t.reviewid,t.blogid, t.reviewownername,t.reviewContent,t.reviewcreationdate from mBlogreview_tmp_proc t ';
         sqlstr :=sqlstr||' where t.rid>(:v_page-1)*:v_pageSize and t.rid <=:v_page*:v_pageSize';
        OPEN p_rc FOR sqlstr USING v_page, v_pageSize, v_page, v_pageSize;
        COMMIT;
      end mBLogreview_se_proc;
    end pkg_mBlogreview_se;
    /
    ---------------------------------------------------------------------------------
    set serveroutput on;
    var v_num number;
    var c_cur refcursor;
    exec pkg_mBlogreview_se.mBLogreview_se_proc(1244,1,5,:v_num,:c_cur); 
    print c_cur;
    print v_num;
      

  7.   

        指在同一个存储过程中!
        中间有多次commit操作!
      

  8.   

    http://blog.csdn.net/inthirties/archive/2009/05/29/4221938.aspx
      

  9.   


    参考我的blog:Oracle 临时表
    http://blog.csdn.net/tianlesoftware/archive/2009/10/21/4705283.aspx
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    Q Q 群:62697716
      

  10.   

    临时表有两种,create global temporary table table_name (a varchar2(2))            --on commit preserve rows;
               --on commit delete rows;
    第一种是执行commit后,临时表中数据还在,只有当前会话结束之后数据才删除,也就是说存储过程执行完成之后数据阐述,第二种是commit后,临时表数据就删除,你自己看情况选择哪种临时表合适。一般来说,存储过程中的临时表是为了解决复杂的业务逻辑,简化复杂的sql,提高执行效率,而且oracle中临时表用完是不用删除的,DB2则可以在存储过程中创建临时表,存储过程跑完系统就自动删除。
      

  11.   

    15:22:49   SQL>   create   or   replace   procedure   pro_temp(v_col1   varchar2,v_col2   varchar2)   as   
      15:23:01       2     v_num   number;   
      15:23:01       3     begin   
      15:23:01       4     select   count(*)   into   v_num   from   user_tables   where   table_name='T_TEMP';   
      15:23:01       5     --create   temporary   table   
      15:23:01       6     if   v_num<1   then   
      15:23:01       7         execute   immediate   'CREATE   GLOBAL   TEMPORARY   TABLE   T_TEMP   (   
      15:23:01       8           COL1     VARCHAR2(10),   
      15:23:01       9           COL2     VARCHAR2(10)   
      15:23:01     10           )   ON   COMMIT   delete     ROWS';   
      15:23:01     11     end   if;   
      15:23:01     12     --insert   data   
      15:23:01     13     execute   immediate   'insert   into   t_temp   values('''||v_col1||''','''||v_col2||''')';   
      15:23:03     14     execute   immediate   'select   col1   from   t_temp'   into   v_num;   
      15:23:36     15     dbms_output.put_line(v_num);   
      15:23:50     16     execute   immediate   'delete   from   t_temp';   
      15:23:54     17     commit;   
      15:23:54     18     execute   immediate   'drop   table   t_temp';   
      15:23:54     19     end   pro_temp;   
      15:23:54     20     /   
      

  12.   

    Oracle Temporary Tables(Oracle 临时表)1. 建立临时表语法A.ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法CREATE GLOBAL TEMPORARY TABLE TABLE_NAME-----(COUMNS …)-----AS SELECT … FROM TABLE… 
    ON COMMIT DELETE ROWS;当前session发出commit/rollback命令,则该事务周期发生的所有数据自动被Oracle删除(Oracle truncate table)。但不影响任何其他session的数据。B.ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法CREATE GLOBAL TEMPORARY TABLE TABLE_NAME-----(COUMNS …)-----AS SELECT … FROM TABLE…ON COMMIT PRESERVE ROWS;当前session结束(用户正常退出 / 用户不正常退出 / Oracle实例崩溃),Oracle对这个会话的中发生的数据进行删除(Oracle truncate table)。但不影响任何其他session的数据。2. 特点说明A.临时表数据自动清空后,但是临时表的结构以及元数据还存储在用户的数据字典中。表的定义对所有的会话可见B.临时表不需要DML锁C.可以索引临时表和在临时表基础上建立视图D.在临时表上的索引也是临时的,也是只对当前会话或者事务有效E.临时表可以拥有触发器F.可以用export和import工具导入导出临时表的定义,但是不能导出数据3. 使用技巧A.当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中B.程序执行过程中可能需要存放一些临时的数据,可以将这类数据放在临时表里非常方便C.存储过程中用到临时表:1> 在建立临时表前,应先加上对表名的判断Select count(*) into v_count from user_tables where table_name = ‘XXX’;If v_count=0 thenCreate global temporary table …在存储过程结束处,应该记得删除表execute immediate 'drop table t_temp';