В PL / SQL довольно редко используется VARRAY
, так как вам нужно указать максимальную длину.Гораздо более распространено использование коллекций, основанных на вложенных таблицах или ассоциативных массивах.
Если вы хотите использовать коллекции VARRAY
, вы можете сделать что-то вроде
create type float_array
is varray(3) of binary_float;
/
create table foo (
col1 number
);
/
create or replace procedure varray_proc( p_in_arr in float_array,
p_out_arr out float_array )
as
begin
for i in 1 .. p_in_arr.count
loop
insert into foo( col1 )
values( p_in_arr(i) );
end loop;
select col1*2
bulk collect into p_out_arr
from foo;
end;
/
Вы можете позвонитьпроцедура из PL / SQL
SQL> declare
2 l_in_arr float_array := float_array( 1.1, 2.2, 3.3 );
3 l_out_arr float_array;
4 begin
5 varray_proc( l_in_arr,
6 l_out_arr );
7 for i in 1 .. l_out_arr.count
8 loop
9 dbms_output.put_line( l_out_arr(i) );
10 end loop;
11 end;
12 /
2.20000005E+000
4.4000001E+000
6.5999999E+000
PL/SQL procedure successfully completed.
Было бы гораздо более распространенным объявить и использовать тип вложенной таблицы, который в итоге будет выглядеть почти точно так же, как код VARRAY
, только без ограничения длины
create type float_nt
is table of binary_float;
create or replace procedure varray_proc( p_in_arr in float_nt,
p_out_arr out float_nt )
as
begin
for i in 1 .. p_in_arr.count
loop
insert into foo( col1 )
values( p_in_arr(i) );
end loop;
select col1*2
bulk collect into p_out_arr
from foo;
end;
/
Если вы хотите сохранить порядок элементов массива
create table bar (
col1 number,
order_by number
);
create or replace procedure varray_proc( p_in_arr in float_nt,
p_out_arr out float_nt )
as
begin
for i in 1 .. p_in_arr.count
loop
insert into bar( col1, order_by )
values( p_in_arr(i), i );
end loop;
select col1*2
bulk collect into p_out_arr
from bar
order by order_by;
end;
/