2015-04-08 2 views
0

Мне интересно, возможно ли расширить любые типы коллекций (Ассоциативный массив, вложенную таблицу, VArray) с помощью пользовательских функций.Расширение коллекций Oracle с функциями-членами

Я хочу, чтобы определить пользовательские функции в том же стиле, я могу сделать это для обычных типов, используя функции-члены. Используя это, я хотел бы создать функцию, которая, например, переводит содержимое моей коллекции в строку символов, путем согласования ее элементов.

ответ

3

Нет, это невозможно. Что вы можете сделать, это инкапсулировать коллекцию в другой тип, как этот

create or replace type my_array as table of varchar2(10); 
/
create or replace type my_array_type as object (
arr my_array, member function do_something return varchar2) 
/
create or replace type body my_array_type is 
member function do_something return varchar2 is 
l_temp varchar2(32767); 
begin 
for i in arr.first .. arr.last 
loop 
    l_temp:=l_temp||arr(i); 
end loop; 
return l_temp; 
end; 

end; 

/

Теперь вы можете попробовать свои функции конкатенации из:

declare 
temp_array my_array:=my_array(); 
test_array my_array_type:=my_array_type(null); 
result_string varchar2(32767); 

begin 
temp_array.extend(3); 
temp_array(1):='a'; 
temp_array(2):='b'; 
temp_array(3):='c'; 

test_array:=my_array_type(temp_array); 
result_string :=test_array.do_something; 
dbms_output.put_line(result_string); 

end; 
1

Насколько я знаю, Oracle не предоставляет способ добавления методов или настраиваемых функций в подтип коллекции. Альтернативы я могу думать о том, являются:

  1. Вы можете определить тип, который оборачивает коллекцию, а затем определить методы этого типа.

  2. Вы можете определить подтип коллекции в пакете, а затем создать процедуры/функции в пакете, которые управляют определенным подтипом коллекции.

Удачи.

Смежные вопросы