PLSQL - Как извлечь значения в коллекцию, учитывая массив значений? - PullRequest
1 голос
/ 23 февраля 2010

У меня есть процедура, которая принимает массив идентификаторов папок и должна вернуть список идентификаторов документов. Папки связаны с документами в отношении «один ко многим» - для каждой папки существует множество документов. В частности, есть таблица документов, в которой есть таблица 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 Ответ

2 голосов
/ 24 февраля 2010

Если 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 объединяет несколько коллекций в одну ...

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>

Узнайте больше о коллекциях в 10g .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...