create or replace procedure name_pro
as
  v_sql1 varchar2(4000);
  isExists number(2);
  cursor checkExists is select count(1) from all_tables where owner='ZHENYUAN' AND TABLE_NAME='TABLENAME';
begin
     open checkExists;
     fetch checkExists into isExists;
     if isExists=1 then
        execute immediate 'drop table temp_table_1';
     end if;     v_sql1 := 'CREATE GLOBAL TEMPORARY TABLE temp_table_1 ON COMMIT PRESERVE ROWS as select * from ...';
     execute immediate v_sql1;
    
end;跟表名没有关系,主要是思路,多谢各位

解决方案 »

  1.   

    然到我真的要断开连接之后手动的删除吗?这样太不方便了,记得sql server中对于会话的临时表对于其他会话没有影响的哦
      

  2.   

    GLOBAL TEMPORARY TABLE  是不必要用手工删除的, 你只需要指定参数是在transaction 后
    删除( On commit delete rows)还是session(On commit preserve rows) 结束后删除就可以自动删除了
      

  3.   

    1、GLOBAL TEMPORARY TABLE是不需要删除的
    2、在过程里,用动态sql来实现咯
      

  4.   

    oracle的临时表事实上和固定表区别不大。
    而且进程进行表的删除会造成很多碎片,使服务器性能下降。
    我看你的过程里面是建立临时表,而不是删除,删除表使用drop
      

  5.   

    临时表可以在不同会话中而不会发生冲突??针对这个问题,我又考虑了一下,是这样认为的:
    在存储过程中
    1。判断临时表是否存在,如果不存在创建;
    2。如果临时表存在,因为是不同的会话,是看不到其中的数据的,那么向其中插入数据(因为drop表是会引起并发问题的)
    这样考虑对吗?另外,大虾,如果方便,能不能给我一个相关的例子参考一下。。
    多谢了!
      

  6.   

    告诉楼主一件事,动态创建临时表,即:
    'CREATE GLOBAL TEMPORARY TABLE temp_table_1 ON COMMIT PRESERVE ROWS as select * from ...';与
    'CREATE GLOBAL TEMPORARY TABLE temp_table_1 ON COMMIT PRESERVE ROWS as select * from ... where 1=2'结果一样,没有数据的,只存在结构,想要数据,要多一个步骤:
    insert into temp_table_1 select * from ...;