使用成员函数扩展 Oracle 集合
Extend Oracle Collections with member functions
我想知道是否可以使用自定义函数扩展任何类型的集合(关联数组、嵌套 Table、VArray)。
我希望能够以与使用成员函数为常规类型定义相同的样式来定义自定义函数。使用这个,我想创建一个函数,例如通过连接它的项目将我的集合的内容转换为字符串。
据我所知,Oracle 不提供向集合子类型添加方法或自定义函数的方法。我能想到的替代方案是:
您可以定义一个包装集合的类型,然后在该类型上定义方法。
您可以在包中定义集合子类型,然后在包中创建 procedures/functions 来操作定义的集合子类型。
祝你好运。
不,这是不可能的。
你可以做的是像这样将集合封装成另一种类型
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;
我想知道是否可以使用自定义函数扩展任何类型的集合(关联数组、嵌套 Table、VArray)。
我希望能够以与使用成员函数为常规类型定义相同的样式来定义自定义函数。使用这个,我想创建一个函数,例如通过连接它的项目将我的集合的内容转换为字符串。
据我所知,Oracle 不提供向集合子类型添加方法或自定义函数的方法。我能想到的替代方案是:
您可以定义一个包装集合的类型,然后在该类型上定义方法。
您可以在包中定义集合子类型,然后在包中创建 procedures/functions 来操作定义的集合子类型。
祝你好运。
不,这是不可能的。 你可以做的是像这样将集合封装成另一种类型
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;