2011-12-25 60 views
-1

我有一個PL/SQL過程,它創建一個臨時表,然後使用遊標從該臨時表中提取數據,處理數據,然後刪除臨時表。但是,如果表不存在於數據庫中,則Oracle不允許使用遊標。在Oracle中創建遊標之前創建表

請幫我解決這個問題。

+4

爲什麼創建並刪除臨時表而不是創建一次,並一遍又一遍地使用它們? - 如果您來自SQL Server後臺,Oracle則不同。臨時表是持有臨時數據的永久對象。 – 2011-12-26 02:29:04

回答

8

您的陳述不完全正確。您可以使用遊標進行非常隨意的查詢。請看下圖:

create or replace procedure fooproc 
IS 
    type acursor is ref cursor; 
    mycur acursor; 
    mydate date; 
BEGIN 
    execute immediate 'create global temporary table footmp (bar date) on commit delete rows'; 
    execute immediate 'insert into footmp values (SYSDATE)'; 
    open mycur for 'select * from footmp'; 
    loop 
     fetch mycur into mydate; 
     exit when mycur%notfound; 
     dbms_output.put_line(mydate); 
    end loop; 
    close mycur; 
    execute immediate 'drop table footmp'; 
END fooproc; 
/

(更多細節here - 尤其是,因爲在所有的表名是固定的,而不是會話相關的這短短的PROC是不是安全的)。

這是(相當)有點醜陋,我不建議你使用它 - 相反,你應該考慮是否需要該程序特定的臨時表。

this other article

不會動態創建它們[臨時表],不要動態創建它們,請 - 不要動態創建。

難道你不能使用全局臨時表嗎?你真的需要臨時表嗎? (即不使用select語句上的光標來填充表格)?

1

或者,如果您希望避免全局臨時表與「常規」永久表之間的差異,則可能會使用(關於臨時表數據可用性,生命期等,請參閱Oracle docs),只需首先創建表(nologging)。假設沒有其他人使用這個表格,你的過程可能在處理之前/之後截斷。