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.