我有一个接受文件夹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_;
有更好的方法吗?
答案 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>