Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como trabalhar com matrizes ou coleções PL/SQL como parâmetros e, em seguida, juntá-los por índice


O tipo de coleção que você está usando é um varray, portanto, é indexado; você pode fazer:
FOR i IN 1..v_contacts_fname.COUNT
LOOP

  dbms_output.put_line(v_contacts_fname(i) ||', ' || v_contacts_lname(i));

END LOOP;

Adaptando seu código de exemplo:
DECLARE

PROCEDURE create_account(p_entity_id NUMBER
                         , p_sub_id NUMBER
                         , v_contacts_fname sys.odcivarchar2list
                         , v_contacts_lname sys.odcivarchar2list
                         )
  IS

  BEGIN

    dbms_output.put_line('Entity_id: ' || p_entity_id || ' - Sub_id: ' || p_sub_id);

    FOR i IN 1..v_contacts_fname.COUNT
    LOOP

      dbms_output.put_line(v_contacts_fname(i) ||', ' || v_contacts_lname(i));

    END LOOP;


END create_account;

BEGIN

  create_account(p_entity_id            => 550005
                     , p_sub_id         => 100051
                     , v_contacts_fname => sys.odcivarchar2list('dan','bob')
                     , v_contacts_lname => sys.odcivarchar2list('anderson','bebop')
      ) ;

END;
/

agora fica
Entity_id: 550005 - Sub_id: 100051
dan, anderson
bob, bebop


PL/SQL procedure successfully completed.

Você pode fazer uma verificação muito básica no início para verificar se o count de ambas as matrizes é o mesmo - se não, talvez lance uma exceção.

Se você quiser passar um único argumento de coleção, então esse argumento precisaria ser uma coleção de registros ou tipos de objetos, declarados no nível do esquema ou talvez em um pacote, dependendo de como você deseja usar o conteúdo (e, até certo ponto, , a versão do Oracle que você está usando). Parece que você não quer fazer isso embora.