如何在oracle存储过程中创建和使用临时表?

时间:2012-02-16 11:56:08

标签: oracle

我想在存储过程中创建临时表并以相同的方式访问它但我收到错误ORA-00942:Table or view does not exists. 以下是我尝试的程序,

Create procedure myproc
  IS
  stmt varchar2(1000);
  BEGIN
  stmt:='CREATE GLOBAL TEMPORARY table temp(list if columns) ON COMMIT DELETE ROWS';

  execute immediate stmt;

  insert into temp values('list of column values');

 END;  

这是我用来创建临时表的方式,但是我遇到了错误,有没有其他方法可以执行此任务?

5 个答案:

答案 0 :(得分:16)

首先创建它(一次,在您的程序之外),然后在您的过程中使用它。您不希望(尝试)在每次调用过程时创建它。

create global temporary table tmp(x clob)
on commit delete rows;

create or replace procedure...
-- use tmp here
end;

答案 1 :(得分:0)

我已经编辑了这个答案,因为它错了。我是最近的MSSQL转换器,并且由于oracle实现全局临时表的方式,如果你真的需要使用临时表,创建它们一次并留下它们就可以了。除非你在procs中独家使用动态sql(有趣的调试),否则除非引用的表已经存在,否则你将无法成功编译包。 Oracle验证您尝试编译的方法中引用的任何对象,这就是您收到942错误的原因。我喜欢Oracle使用这些全局临时表管理范围的方式。仅此一点,就把这个想法卖给了我。

答案 2 :(得分:0)

Create or replace procedure myprocedure
is 
   stmt varchar2(1000);
   stmt2 varchar2(1000);
begin
    stmt := 'create global temporary table temp(id number(10))';
    execute immediate stmt;
    stmt2 := 'insert into temp(id) values (10)';
    execute immediate stmt2;
end;

答案 3 :(得分:-1)

CREATE OR REPLACE PROCEDURE myproc IS
BEGIN

    CREATE GLOBAL TEMPORARY TABLE temp (id NUMBER(10)) ON COMMIT DELETE ROWS AS
        SELECT 10 FROM dual;

END;
/

答案 4 :(得分:-2)

使用此

Create of replace procedure myprocedure
is 
   stmt varchar2(1000);
   stmt2 varchar2(1000);
begin
    stmt := 'create global temporary table temp(id number(10))';
    execute immediate stmt;
    stmt2 := 'insert into temp(id) values (10)';
    execute immediate stmt2;
end;