不同代码块中填充varray的最佳方式pl sql

The best way to fill varray in different code blocks pl sql

通常我这样填充数组:

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

我该怎么做?

你可以使用 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;
/

what if I have two blocks that generate strings and I want to save all the strings to one array

如果块是单独的程序单元或以其他方式断开连接,甚至可能以不同的顺序执行,则需要一些逻辑来判断目标数组是否已填充。一种解决方案是使用(私有)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) );