Лучший способ заполнить varray в различных блоках кода PL SQL - PullRequest
0 голосов
/ 19 марта 2019

Обычно я заполняю массивы так:

TYPE name_options IS VARRAY(6) OF VARCHAR2(300);
dd_name_options_c name_options;

dd_name_options_c := name_options(string1, string2, string3, string4);

Но что, если у меня есть два блока, которые генерируют строки, и я хочу сохранить все строки в одном массиве:

-- Block 1
....
dd_name_options_c := name_options(string1, string2, string3, string4);
....
-- Block 2
....
dd_name_options_c := name_options(string5, string6);

Итак, в итоге массив будет содержать 6 строк: строка1, строка2, строка3, строка4, строка5, строка6

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

что если у меня есть два блока, которые генерируют строки, и я хочу сохранить все строки в один массив

Если блоки являются отдельными программными модулями или иным образом отсоединены, может быть, даже могут быть выполнены в разных порядках, вам нужна некоторая логика, которая может сказать, заполнен ли целевой массив уже. Одним из решений является использование (частной) процедуры PL / SQL для управления этим.

procedure populate_varray 
     ( p_tgt in out name_options
       , p_new in name_options)
is
   n pls_integer;
begin
   if p_tgt is null 
         or p_tgt.count() = 0 
   then
     p_tgt := p_new;
   elsif  p_new is not null 
         and p_new.count() > 0
   then 
     n := p_tgt.count();
     for idx in 1 .. p_new.count() loop
       p_tgt.extend();
       p_tgt(n + idx) := p_new(idx);
     end loop;
   end if;
end populate_varray;

Примечание: не проверенный код, пожалуйста, прокомментируйте ниже, если есть ошибки:)

Вы бы назвали это так:

-- Block 1
....
populate_varray ( dd_name_options_c 
                  , name_options(string1, string2, string3, string4));
....
-- Block 2
....
populate_varray (dd_name_options_c  
                  , name_options(string5, string6) );
2 голосов
/ 19 марта 2019

вы можете использовать extend

declare
  TYPE name_options IS VARRAY(6) OF VARCHAR2(300);
  dd_name_options_c name_options;

begin
  dd_name_options_c := name_options('a', 'b', 'c', 'd');

  dd_name_options_c.Extend(2);
  dd_name_options_c(5) := 'e';
  dd_name_options_c(6) := 'f';

  dbms_output.put_line(dd_name_options_c.count());
end;
/
...