2012-02-16 333 views
10

我想在存储过程创建临时表,并访问它在相同的,但我得到了错误ORA-00942:Table or view does not exists. 下面是我试过的程序,如何在oracle存储过程中创建和使用临时表?

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

@ tbone的答案显示了你应该做的事情,但是要解释你所看到的:你不能这样做,因为在编译过程时'temp'还不存在。编译器不会尝试解析动态SQL,至少因为它不知道它是否可以在运行时工作。这种方法可行的唯一方法是如果插入也转换为动态SQL;但这不是临时表在Oracle中的工作方式,因此不要这样做。 – 2012-02-16 12:25:47

+0

@Alex Poole:谢谢 – 2012-02-16 13:03:42

+0

[Oracle 10中的本地临时表(用于存储过程的范围)](http://stackoverflow.com/questions/1192265/local-temporary-table-in-oracle-10 - 存储过程的范围) – APC 2012-02-16 16:22:48

回答

14

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

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

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

但是为什么?我发现它很奇怪。 I.E.我需要一个“虚拟”表。我可以在程序本身内创建它吗? – Revious 2012-10-18 10:47:43

+1

@ Gik25无论您使用实际的临时表还是使用其他方法,都取决于您的具体情况。也许发布一个新的问题与你的具体情况,你很可能会得到一些很好的回应。 – tbone 2012-10-18 11:20:46

+2

I second @Revious 我需要在Proc中创建,使用和销毁临时表,Oracle不喜欢它,有什么想法吗? – ZeExplorer 2016-01-29 23:08:31

-1

使用此

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; 
+3

这实际上是一个坏建议。创建临时文件。表格之外的插入/更新/删除的东西。 – Mat 2013-06-08 10:10:20

0

我已编辑这个答案,因为它是错误的。我是一个最近的MSSQL转换器,因为oracle实现全局临时表的方式,如果你真的需要使用临时表,创建它们并让它们留在那里是一种方法。除非你专门在你的proc中使用动态sql(有趣的调试),否则你将无法成功编译你的包,除非引用的表已经存在。 Oracle验证您尝试编译的方法中引用的任何对象,这就是为什么您得到了942错误。我喜欢Oracle用这些全球临时表管理范围的方式。单就这个想法就把我卖了。

+0

这在Oracle中通常是非常糟糕的做法。桌子不会简单地消失。为什么要添加额外的(慢)代码,强制动态SQL到处,并且失去对配置管理的所有希望?无论如何,临时表几乎没有用处。它们通常可以由常规表,内联视图或集合取代。 – 2014-01-30 06:49:39

+0

没关系我的回答,我是一个最近的MSSQL转换。在上个星期,我对Oracle的临时表的实现有了更好的理解。我越使用Oracle,我越喜欢它。 – swimswithbricks 2014-02-04 16:57:05

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;