私の知る限り、動作が保証されている純粋なSQLソリューションはありません。VARCHAR2のVARRAYをオブジェクトのVARRAYに変換するには、おそらくPL/SQL関数を作成する必要があります。
以下のPL/SQLソリューションであっても、確実に機能するとは言えません。PL / SQL言語リファレンスには、コンストラクタ内の項目の順序が常にインデックスの順序と一致することを明示的に示しているものは何も見つかりません。しかし、例は順序が保持されていることを意味し、それが真実でなかった場合、私が今までに遭遇したであろうあらゆる種類の奇妙なバグを引き起こすでしょう。
私の例はネストされたテーブルでは機能しない可能性があることに注意してください。マニュアルから:
「データベースからVARRAYを保存および取得する場合、そのインデックスと要素の順序は安定しています。」...「ネストされたテーブルをデータベースに格納および取得するときに、ネストされたテーブルのインデックスと行の順序が安定しない場合があります。」
SQL> create or replace type varchar2_with_index as object
2 (
3 id number,
4 value varchar2(4000)
5 );
6 /
Type created.
SQL> create or replace type varchar2_with_index_varray as
2 varray(32767) of varchar2_with_index;
3 /
Type created.
SQL> create or replace function add_index(p_list in sys.ODCIVarchar2List
2 ) return varchar2_with_index_varray as
3 v_new_list varchar2_with_index_varray := varchar2_with_index_varray();
4 begin
5 for i in 1 .. p_list.count loop
6 v_new_list.extend;
7 v_new_list(v_new_list.count) := varchar2_with_index(i, p_list(i));
8 end loop;
9 return v_new_list;
10 end;
11 /
Function created.
SQL> column value format a6
SQL> select t1, t2.* from
2 (select 'X' as t1 from dual UNION select 'Y' from dual) t1,
3 table (add_index(sys.odcivarchar2list('a', 'b', 'c'))) t2;
T ID VALUE
- ---------- ------
X 1 a
X 2 b
X 3 c
Y 1 a
Y 2 b
Y 3 c
6 rows selected.