2012-02-16 334 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;