问题 如何在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;  

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


9037
2018-02-16 11:56


起源

@tbone的答案显示了你应该做什么,但要解释你所看到的:你不能这样做,因为在程序编译时 temp 还不存在。编译器不会尝试解析动态SQL,尤其是因为它不知道它是否可以在运行时运行。这种方法的唯一方法是将插入转换为动态SQL;但这不是临时表在Oracle中的工作方式,所以不要这样做。 - Alex Poole
@Alex Poole:谢谢 - Rajaram Shelar
可能重复 Oracle 10中的本地临时表(针对存储过程的范围) - APC
此问题已在以下帖子中解决: stackoverflow.com/questions/18747649/... - user9253440


答案:


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

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

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

15
2018-02-16 12:05



但为什么?我发现它很奇怪。 I.E.我需要一个“虚拟”表。我可以在程序本身内创建它吗? - Revious
@ Gik25是否使用实际临时表或使用其他方法取决于您的具体情况。也许根据您的具体情况发布一个新问题,您很可能会收到一些好的回复。 - tbone
我第二个@Revious我需要在Proc中创建,使用和销毁临时表,Oracle不喜欢它,有什么想法吗? - ZeExplorer
如果在程序包中定义了此过程怎么办? - Himansz


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


0
2018-01-29 19:03



这在Oracle中通常是一种非常糟糕的做法。表格不会随便消失。为什么要添加额外(慢)代码,强制动态SQL无处不在,并失去配置管理的所有希望?无论如何,临时表几乎都没用。它们通常可以由常规表,内联视图或集合替换。 - Jon Heller
没关系,我是最近的MSSQL转换器。在上周,我对Oracles临时表的实现有了更好的理解。我使用Oracle越多,我就越喜欢它。 - swimswithbricks


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;

0
2018-06-23 03:48





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;
/

-1
2017-10-03 09:45



请包含一些解释和代码? - Ishita Sinha


用这个

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;

-2
2018-06-08 10:04



这实际上是糟糕的建议。创造临时。在插入/更新/删除它们的东西之外的表。 - Mat