因为 tmp 表本身是不存在,要动态创建才有,所以操作原先不存的对象也要动态.把: INSERT INTO tmp VALUES(1); 改成
EXECUTE IMMEDIATE 'INSERT INTO tmp VALUES(1)'; 就可以了.

解决方案 »

  1.   

    按 chanet(牧师) 所说就ok但我也提醒一下,你所建的是transaction级的临时表,你事务结束后,也就是commit之后,临时表的数据就会被自动清空,要注意!!你可以考虑建session级别的临时表!!
      

  2.   

    很多的,我们公司开发的碰到许多的定制复杂报表的问题就是通过存储过程+临时表+excel来解决
      

  3.   

    在oracle数据库里不建议动态创建临时表.如果需要使用临时表,就先把它创建好,这和sqlserver是有差别的,你可以看相关的文档。
      

  4.   

    再补充一下:Oracle's temporary tables are similar to temp tables in those 
    other databases the main exception being that they are 'statically' defined.  
    You create them once per database, not once per stored procedure in the 
    database.  They always exist but appear empty until you put data in them.  They 
    may be SESSION based (data survives a commit but not a disconnect/reconnect).  
    They may be TRANSACTION based (data disappears after a commit).
      

  5.   

    同意zzzstar(辰星)的说法CREATE GLOBAL TEMPORARY TABLE tmp(a number) ON COMMIT PRESERE ROWS ;preserve就是session级的,这个临时表针对每个session都会分配一块空间,session之间的数据没有任何联系,都是相对独立的。session断了,临时表中的数据也会自动消失。delete是事务级的,只要做了commit或rollback,数据就消失了。
      

  6.   

    在Oracle8i中,可以创建以下两种临时表: 
    1。会话特有的临时表 
    CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification> ) 
    ON COMMIT PRESERVE ROWS; 2。事务特有的临时表 
    CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification> ) 
    ON COMMIT DELETE ROWS; 
    CREATE GLOBAL TEMPORARY TABLE MyTempTable 
    所建的临时表虽然是存在的,但是你试一下insert 一条记录然后用别的连接登上去select,记录是空的,明白了吧。
    下面两句话再贴一下: 
    --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行) 
    --ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
      

  7.   

    在存储过程创建一个临时表,与表空间管理有关系
    记得以前测试过,是这样:
    字典管理+永久  (EXTENT MANAGEMENT  DICTIONARY  +PERMANENT )
    本地管理+临时  (EXTENT MANAGEMENT  LOCAL  + TEMPORARY )
      

  8.   

    那哪个方案比较好呢,是在执行procedure的时候建临时表,还是已经建好表,对这个表进行操作比较好呢。