カスタム関数を使用して、任意のタイプのコレクション (連想配列、ネストされたテーブル、VArray) を拡張できるかどうか疑問に思っています。
メンバー関数を使用して通常の型に対して実行できるのと同じスタイルでカスタム関数を定義できるようにしたいと考えています。これを使用して、たとえば、アイテムを連結してコレクションのコンテンツを文字列に変換する関数を作成したいと思います。
カスタム関数を使用して、任意のタイプのコレクション (連想配列、ネストされたテーブル、VArray) を拡張できるかどうか疑問に思っています。
メンバー関数を使用して通常の型に対して実行できるのと同じスタイルでカスタム関数を定義できるようにしたいと考えています。これを使用して、たとえば、アイテムを連結してコレクションのコンテンツを文字列に変換する関数を作成したいと思います。
いいえ、できません。あなたができることは、コレクションをこのような別のタイプにカプセル化することです
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;
私が知る限り、オラクルはコレクションのサブタイプにメソッドやカスタム関数を追加する方法を提供していません。私が考えることができる代替案は次のとおりです。
コレクションをラップする TYPE を定義してから、TYPE でメソッドを定義できます。
パッケージでコレクションのサブタイプを定義し、定義されたコレクションのサブタイプを操作するプロシージャ/関数をパッケージで作成できます。
幸運を祈ります。