Как добавить значения в VARRAY с помощью цикла

У меня есть VARRAY, и я хочу добавить элементы в этот VARRAY с помощью цикла. Это то, что я пробовал до сих пор.

DECLARE
TYPE code_array_  IS VARRAY(26) OF VARCHAR2(6);
codes_ code_array_;

BEGIN
FOR i IN 1..26 LOOP    
    codes_(i) := dbms_random.string('U',6);
  END LOOP;
END;

Выше код дает мне ошибку

«ORA-06531: Ссылка на неинициализированный сборник»


person Dinidu Hewage    schedule 22.09.2016    source источник
comment
Вы уверены, что вам нужен varray, а не вложенная таблица? Является ли это ограничение в 26 настолько полезным, что оно компенсирует потерю функциональности, которую вы получаете с вложенными таблицами?   -  person William Robertson    schedule 22.09.2016
comment
@William_Robertson VArray поддерживает порядок элементов, а вложенные таблицы и ассоциативные массивы — нет. В приложениях, где необходим порядок элементов, единственным вариантом является varray.   -  person JeramieH    schedule 16.02.2018


Ответы (2)



Вы должны инициализировать массив с помощью конструктора и расширить его, прежде чем присваивать значения конкретным элементам переменной коллекции. В контексте PLSQL лучше использовать ассоциативные коллекции.

declare
    type code_array_ is varray(26) of varchar2(6);
    codes_ code_array_ := code_array_();
begin
    <<init_codes>> begin codes_.extend(26);
        for i in codes_.first..codes_.last loop codes_(i) := dbms_random.string('U',6);
    end loop; end init_codes;
end;
/

Или вы можете использовать sql для инициализации всей коллекции, например. что-то вроде этого:

declare
    type code_array_ is varray(26) of varchar2(6);
    codes_ code_array_;
begin
    select dbms_random.string('U',6) bulk collect into codes_ from dual connect by level<=26;
end;
/
person 0xdb    schedule 25.09.2016