PLSQL - 如何在给定值数组的情况下将值检索到集合中?

时间:2010-02-23 19:18:59

标签: sql oracle plsql

我有一个接受文件夹ID数组的过程,需要返回文档ID列表。文件夹与一对多关系中的文档相关联 - 每个文件夹都有许多文档。具体来说,有一个文件表,其中包含一个parent_folderid fk到文件夹表。

这就是我所拥有的:

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_;

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果gtyp_folderids_table被声明为SQL类型(而不是PL / SQL类型),您可以通过table()函数在SQL语句中使用它,如下所示:

    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将多个集合合并为一个...

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