Я предполагаю, что вы дали значимые имена атрибутам вашего типа.В этом случае вы возвращаете не восемь чисел, а четыре пары чисел.Это предполагает возможный способ улучшения вещей.Может ли это действительно решить вашу проблему, будет зависеть от точных деталей вашей ситуации (которую вы не предоставили).
Вот тип, представляющий эти пары чисел, и тип вложенной таблицы, который мы можем использовать для обработки массива.
create or replace type pay_pair as object
( pay_cat varchar2(4)
, fed number
, reg number )
/
create or replace type pay_pair_nt as table of pay_pair
/
Это функция, которая заполняет массив четырьмя парами чисел.В отсутствие какого-либо фактического бизнес-правила я использовал самый простой пример.
create or replace function get_pay_pairs
return pay_pair_nt
is
return_value pay_pair_nt;
begin
select
pay_pair (
case col1
when 1 then 'one'
when 2 then 'nach'
when 3 then 'upl'
when 4 then 'two'
else null;
end
, fed
, pay )
bulk collect into return_value
from v23;
return return_value;
end;
/
Если вам нужна подпись исходного типа, вы можете переписать свою функцию следующим образом:
create or replace function get_pay_fine
return PAY_FINE_FR_12_
is
return_value PAY_FINE_FR_12_;
l_array pay_pair_nt;
begin
l_array := get_pay_pairs;
for i in 1..4 loop
case l_array(i).pay_cat
when 'one' then
return_value.fed1 := l_array(i).fed;
return_value.reg1 := l_array(i).reg;
when 'nach' then
return_value.fed_nach := l_array(i).fed;
return_value.reg_nach := l_array(i).reg;
when 'upl' then
return_value.fed_upl := l_array(i).fed;
return_value.reg_upl := l_array(i).reg;
else
return_value.fed2 := l_array(i).fed;
return_value.reg2 := l_array(i).reg;
end case;
end loop;
return return_value;
end;
Повторюсь, это демонстрация доступных методов, а непредложенное решение.Суть в том, как ваш взгляд предоставляет значения.