Типът колекция, който използвате, е променлива, така че е индексирана; можете да направите:
FOR i IN 1..v_contacts_fname.COUNT
LOOP
dbms_output.put_line(v_contacts_fname(i) ||', ' || v_contacts_lname(i));
END LOOP;
Адаптиране на вашия примерен код:
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;
/
сега получава
Entity_id: 550005 - Sub_id: 100051
dan, anderson
bob, bebop
PL/SQL procedure successfully completed.
Можете да направите много елементарна проверка в началото, за да проверите дали count
и от двата масива е едно и също - ако не, тогава може би хвърлете изключение.
Ако искате да предадете един аргумент за колекция, тогава този аргумент ще трябва да бъде колекция от типове записи или обекти, декларирани или на ниво схема, или може би в пакет, в зависимост от това как искате да използвате съдържанието (и до известна степен , версията на Oracle, която използвате). Все пак изглежда, че не искате да правите това.