我的错误的过程:
create or replace procedure ProName
  is  
begin      
      ......       
      create global temporary table Tmp_EspecialUser (
                    EspecialUserID  varchar(11)  null,            
                    CutListID       varchar(11)  null,             
                    Detail          varchar(255) null
      ) on commit preserve rows ;   
      
      ...... 
                 
end proName;
---网友提出解决方案:--------------------------------------------------use dynamic sql:
execute immediate 'create ...';
通过!
---新问题--------------------------------------------------------------
但是我接下来就要对这个临时表进行很多操作那不是每个都得进行动态操作?
例如我要对那进行数据的插入,
然后对它定义游标对里面的数据进行分析。
如果每个操作都用execute immediate str;这种形式那不惨了呀?
有没有解决方案?谢谢

解决方案 »

  1.   

    我是说存储过程里不能直接调用数据库定义语句。需要动态SQL来执行。
    对应数据库操纵语句是可以直接写的,如:   INSERT INTO TABLE_NAME VALUES('AA',334);  SELECT AA INTO S_AA FROM TABLE_NAME;这些都可以还有什么疑问呢?
      

  2.   

    楼主的意思是随后的操作语句也是在这个存储过程中进行,当然也得使用动态SQL了。
    其实,这也没什么大不了的,为了通用性,也就是编写起来有点麻烦,可执行得一点也不麻烦吗。要不,你只能将你的临时表改为静态创建的了。
      

  3.   

    不同意楼上的!改为静态表的话,就是所有的会话(应用程序)公用一个表,多用户同时操作肯定是数据混乱。
    临时表的实质就是 为每个会话(应用程序) 都保存各自独立的数据。存储过程的话我觉得是每个用户的数据不同,故必须用临时表(附:我们现在的系统用的三层结构,多个客户端,应用层只有一个,所有只有一个会话与后台数据库通信,三层里面临时表好像发挥不了作用,这个我也没实际测试过。)楼主的情况 将临时表先创建好就行了,把你的create语句在sql plus里执行一遍就行了
    实际上如果你操作有水平的话,可改变临时表的字段,因为我们可将sql 语句写成字符串的形式来逃过oracle 对临时表的编绎检查(针对sql 语句能否对临时表操作)
      

  4.   

    临时表有两种类型,一种是基于session的,另外一种是基于事务的,你可以在建立临时表时指明基于事务的即可。
      

  5.   

    正如 JCC0128(看到delphi报表就想呕吐)所说,多用户同时操作肯定是数据混乱,但是把create语句在sql plus里执行一次后,把SQL plus关掉,那个临时表没有自动删除吗?还有,两个用户同时调用时不会对同一个临时表进行操作了吗?
     hushuangyang(hushuangyang) 所说的 指明基于事务的怎么写的?
    谢谢 !
      

  6.   

    除非你delete 临时表,即时你关闭oracle,重启计算机,临时表也不会消失,这就是oracle临时表的好处!它跟sql server临时表不一样。开始搞忘说这个特性了。
      

  7.   

    http://expert.csdn.net/Expert/topic/2076/2076788.xml?temp=.3047449给分