create or replace function FN_1
 return integer is
  Result integer;
begin
  CREATE GLOBAL TEMPORARY TABLE AR_TEMPTAB --这何这里报错,不能创建临时表
 (
    CUSPN                VARCHAR2(50)          
  )ON COMMIT PRESERVE ROWS;
  insert AR_TEMPTAB(CUSPN)values('1');
  Result := 1;
  return(Result);
end FN_1;

解决方案 »

  1.   

    我在存储过程中发现只能用动态SQL来建表,估计函数也差不多。不如你用动态SQL试试
      

  2.   

    DDL语句要用动态sql,如:SQL> create or replace function FN_1
      2  return integer
      3  authid current_user
      4  as
      5  str   varchar2(1000);
      6  Result integer;
      7  begin
      8  str:='CREATE GLOBAL TEMPORARY TABLE AR_TEMPTAB ';
      9  str:=str||'(CUSPN  VARCHAR2(50))ON COMMIT PRESERVE ROWS';
     10  execute immediate str;
     11  str:='insert into AR_TEMPTAB(CUSPN) values(:v)';
     12  execute immediate str using '1';
     13  Result := 1;
     14  return(Result);
     15* end FN_1;
    SQL> /函数已创建。SQL> declare
      2  n  integer default 100;
      3  begin
      4  n:=FN_1;
      5  dbms_output.put_line('n='||n);
      6  end;
      7  /
    n=1PL/SQL 过程已成功完成。
    -----------------------------------
    虽然可以这么用,但从性能上考虑建议楼主不要用动态sql,
    另,最好不要把临时表单独建好后,在函数里调用。
      

  3.   

    在oracle中临时表是一个真实存在的表,你可以看到它的表结构的
      

  4.   

    为什么ORACLE中动态建立性能低,SQL SERVER好象不是的
      

  5.   

    TO: olivenan(风雪)
    SQL Server中的临时表也是一样, 只是存在于tempdb库中,不过把表名起了一个永不重复的别名.