不同代码块中填充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) );
通常我这样填充数组:
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) );