请问:如何可以像建SQL Server中临时表#temptable1这样在oracle中也建一个类似这样的临时表,没有实际产生物理表,可以在存储过程中使用。

解决方案 »

  1.   

    CREATE GLOBAL TEMPORARY TABLE TABLENAME (
       COL1  VARCHAR2(10),
       COL2  NUMBER
    ) ON COMMIT PRESERVE(DELETE) ROWS ;--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)其实可以用游标实现,用完后就可关闭,比起临时表.
      

  2.   

    每个SESSION向临时表中插入的数据只对该SESSION可见,所有DML操作也不产生REDO LOG在ON COMMIT DELETE ROWS情况下,只要哪个SESSION一COMMIT,则属于该SESSION的数据全部被删除掉在ON COMMIT PRESERVE ROWS情况下,到SESSION结束时,属于该SESSION的数据才被删除掉表结构会一直保留下来,对所有SESSION都是可见的
      

  3.   

    请问,如果我的临时表是在存储过程中创建的(on commit preserve rows),也在存储过程中我插入了我自己的数据,那是不是就是说,当存储过程结束后,系统会自己删除临时表的数据。换句话说,这里的会话指的就是存储过程???
      

  4.   

    SESSION通俗的说是指与数据库的一次连接.
    比如:
    用SQLPLUS登录到数据库,则建立好了一个SESSION,在此之后的所有操作都是属于此SESSION,当直到SQLPLUS退出时,SESSION关闭.所以,系统删除临时数据是在切断连接的时候,与存储过程是否结束没有关系.
      

  5.   

    在请问,下面是我在测试的存储过程create or replace procedure sp_temporary_table is
    sqlstr1 varchar2(1000);
    sqlstr2 varchar2(1000);
    begin
        sqlstr1 := 'CREATE GLOBAL TEMPORARY TABLE t_1 
        ( COL1 VARCHAR2(10),COL2  NUMBER ) ON COMMIT PRESERVE ROWS ';
        execute immediate sqlstr1;
    end sp_temporary_table;系统说我“权限不足”,我已经给了DBA的权限了,我要给什么权限才可以测试成功呢???
      

  6.   

    GRANT CREATE TABLE TO 你的用户;
    在存储过程中建表什么的,必需直接把权限给用户,用角色是不行的.