SOS:关于Oracle存储过程中的临时表的用法
1、ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
2、ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
3、临时表(无论会话级还是事务级)中的数据都是会话隔离的,不同session之间不会共享数据。
4、在存储中使用事务级临时表时,注意commit前删除掉本事务的数据,否则可能会出现数据不断增加的情况(原因尚未搞明白)。
5、 两种临时表的语法:
    create global temporary table 临时表名 on commit preserve|delete rows;
用preserve时就是SESSION级的临时表,
用delete就是TRANSACTION级的临时表。我的需求是临时表仅仅在这次调用过程时有效,表也不需要保留,用preserve还是用delete。

解决方案 »

  1.   

    oracle 当中虽然临时表称为“临时”,但是这个临时指的是数据的临时,并不是说表的临时,这个临时表建立之后表就真是存在了,与sqlserver不同,sqlserver的临时表指的是表的临时。===> 因此你说表也不需要保留,是不太合逻辑的。用preserve 还是delete 看你的需求,如果你希望临时表中的数据在你的会话存在期间一直存在,那就用preserve
    否则用delete====>个人建议,直接用preserve就可以了。
         在一进入存储过程的时候 execute immedaite 'truncate table 临时表名';
         然后下面随便你怎么用了,不同的session调用互不干涉,当退出session之后数据被自动清掉。
      

  2.   

    如果都是临时的,那就用 with 吧-- 建立临时表
        with tmp_table as
           (select * from table)
    -- 后面随便怎么做了
        select * from tmp_table
              where XXX
      

  3.   

    如果用with是不是还是数据是临时的,如一楼所说,表还是实际存在的。
    另外我建的临时表是否还需要赋上访问的权限。
      

  4.   

    1、with as 需要紧着后面写sql,分开写是不行的
    2、临时表需要赋权。
      

  5.   


    with as 紧跟着 sql 这个没有问题,就想知道他存在周期是不是跟表一样,一直存在。
      

  6.   

    with 不是我想要的结果,用临时表就是想在当前过程都可以使用这个临时表,用完就干掉。
      

  7.   

    一个用户的数据不会超过一千条数据,用临时表的目的是从大数据表中将单个用户的数据提出来做写分类的统计,所以想到了临时表,但发现他这个跟MSSQL的临时表概念不一样。
      

  8.   

    这个没问题,表在那里就在那儿呗,不影响你什么事情,用就往里插入数据,不用就放着,没影响。
    oracle的临时表就这样,机制不同没必要往一起靠。