我有一個PL/SQL過程,它創建一個臨時表,然後使用遊標從該臨時表中提取數據,處理數據,然後刪除臨時表。但是,如果表不存在於數據庫中,則Oracle不允許使用遊標。在Oracle中創建遊標之前創建表
請幫我解決這個問題。
我有一個PL/SQL過程,它創建一個臨時表,然後使用遊標從該臨時表中提取數據,處理數據,然後刪除臨時表。但是,如果表不存在於數據庫中,則Oracle不允許使用遊標。在Oracle中創建遊標之前創建表
請幫我解決這個問題。
您的陳述不完全正確。您可以使用遊標進行非常隨意的查詢。請看下圖:
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是不是安全的)。
這是(相當)有點醜陋,我不建議你使用它 - 相反,你應該考慮是否需要該程序特定的臨時表。
不會動態創建它們[臨時表],不要動態創建它們,請 - 不要動態創建。
難道你不能使用全局臨時表嗎?你真的需要臨時表嗎? (即不使用select語句上的光標來填充表格)?
或者,如果您希望避免全局臨時表與「常規」永久表之間的差異,則可能會使用(關於臨時表數據可用性,生命期等,請參閱Oracle docs),只需首先創建表(nologging)。假設沒有其他人使用這個表格,你的過程可能在處理之前/之後截斷。
爲什麼創建並刪除臨時表而不是創建一次,並一遍又一遍地使用它們? - 如果您來自SQL Server後臺,Oracle則不同。臨時表是持有臨時數據的永久對象。 – 2011-12-26 02:29:04