2010-02-23 51 views
1

我有一個過程,接受文件夾ID的數組,並需要返回文檔ID的列表。文件夾與一對多關係中的文檔相關聯 - 每個文件夾都有許多文檔。具體來說,有一個文件表,其中有一個parent_folderid fk到文件夾表。PLSQL - 如何將值檢索到給定值的數組的集合?

這是我有:

PROCEDURE get_folder_documents_ (
    paa_folderids_i IN gtyp_folderids_table 
) IS                     
    lnt_temp_docids  &&MATTER_SCHEMA..docid_tab := &&MATTER_SCHEMA..docid_tab(); 
    lv_current_table_size NUMBER := gnt_documentids.COUNT; 
BEGIN              
    FOR i IN paa_folderids_i.FIRST .. paa_folderids_i.LAST 
    LOOP     
     SELECT documentid 
      BULK COLLECT INTO lnt_temp_docids 
      FROM t$documents 
     WHERE parent_folderid = paa_folderids_i(i); 

     FOR j IN 1 .. lnt_temp_docids.COUNT 
     LOOP             
      lv_current_table_size := lv_current_table_size + 1; 

      gnt_documentids.EXTEND(1);         
      gnt_documentids(lv_current_table_size) := lnt_temp_docids(j); 
     END LOOP; 
    END LOOP; 
END get_folder_documents_; 

有沒有更好的辦法?

回答

2

如果gtyp_folderids_table聲明爲SQL類型(而不是一個PL/SQL類型),你可以在SQL語句中通過table()功能像這樣使用它:

SELECT documentid 
     BULK COLLECT INTO gnt_documentids 
     FROM t$documents 
    WHERE parent_folderid in (select * from table(paa_folderids_i)); 

編輯

如果你想要一個PL/SQL的答案,在10g中有一個更有效的方法 - 或者至少需要更少的輸入方法;)。

Oracle引入了一些可以用於集合的整型集合運算符。下面的示例使用MULTISET UNION幾個收藏Munge時間進入一個...

SQL> set serveroutput on size unlimited 
SQL> 
SQL> declare 
    2  v1 sys.dbms_debug_vc2coll 
    3   := sys.dbms_debug_vc2coll('SAM I AM', 'FOX IN SOCKS'); 
    4  v2 sys.dbms_debug_vc2coll 
    5   := sys.dbms_debug_vc2coll('MR KNOX', 'GRINCH'); 
    6  v3 sys.dbms_debug_vc2coll 
    7   := sys.dbms_debug_vc2coll('LORAX', 'MAISIE'); 
    8  v_all sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll(); 
    9 begin 
10  dbms_output.put_line('V_ALL has '|| v_all.count() ||' elements'); 
11  v_all := v1 multiset union v2; 
12  dbms_output.put_line('V_ALL has '|| v_all.count() ||' elements'); 
13  v_all := v_all multiset union v3; 
14  dbms_output.put_line('V_ALL has '|| v_all.count() ||' elements'); 
15 end; 
16/
V_ALL has 0 elements 
V_ALL has 4 elements 
V_ALL has 6 elements 

PL/SQL procedure successfully completed. 

SQL> 

Find out more about collections in 10g