2010-08-27 71 views
2

我有一個非常大的SQL語句,它返回一個id列表。我需要這個id列表作爲其他語句的基礎。像這樣:插入並從oracle中的表/數組中選擇

open crs_result1 for ' select * from ... where id in (select <ids> from <base_statement>) '; 
open crs_result2 for ' select * from ... where id in (select <ids> from <base_statement>) '; 
open crs_result3 for ' select * from ... where id in (select <ids> from <base_statement>) '; 
... 

當然,我不想每次選擇不同的選擇整個id列表。

所以,我的想法是使用一個表/數組:

TYPE gt_result_rec IS RECORD 
(
    id NUMBER 
); 
TYPE gt_result_tab IS TABLE OF gt_result_rec INDEX BY BINARY_INTEGER; 

t_results gt_result_tab; 

execute immediate 'insert into t_results select <ids> from <base_statement>'; 

而不是用它爲所有其他語句:

open crs_result1 for ' select * from ... where id in (select id from t_results) '; 
... 

但是,這並不真正發揮作用。

有誰知道這個問題或有更好的解決方案?

回答

2

類似的事情可以使用臨時表來實現,這樣的:

create global temporary table temp_ids(id number) on commit preserve rows ; 

...不是插入數據:

execute immediate 'insert into temp_ids(id) select id from <big statement>'; 
execute immediate 'insert into temp_ids(id) select id from <other big statement>'; 
execute immediate 'insert into temp_ids(id) select id from <other big statement>'; 

..finally你可以用你的想法:

open crs_result1 for ' select * from ... where id in (select id from temp_ids) '; 

使用TEPORARY TABLES達到EXECUTE IMMEDIATE將從相同的上下文中獲取數據,其中您的其他PL/SQL代碼運行。

如果你想使用TABLE OF RECORDS(table/array),你需要在PACKAGE(header,not BODY!)中聲明這個ARRAY,所以這個字段在EXECUTE IMMEDIATE的上下文中是可見的。 ARRAY必須公開可見。

相關問題