リスト内の順序を維持したい場合は、次のようにすることができます。
SQL> create type user_va as varray(1000) of number;
2 /
Type created.
SQL> with users as (select /*+ cardinality(a, 10) */ rownum r, a.column_value user_id
2 from table(user_va(11, 0, 19, 5)) a)
3 select d.user_id, d.username
4 from dba_users d
5 inner join users u
6 on u.user_id = d.user_id
7 order by u.r
8 /
USER_ID USERNAME
---------- ------------------------------
11 OUTLN
0 SYS
19 DIP
5 SYSTEM
つまり、要素を varray に入れ、セットをマージする前に rownum を割り当てます。r
それによって、リスト内の順序を維持することができます。ヒントは、オプティマイザーに配列内の行数を伝えるだけです(cardinality
大まかに言えば、デッドオンである必要はありません。これがないと、8k 行が想定され、インデックス アプローチよりもフル スキャンが優先される場合があります)。
タイプを作成する特権がなく、これがアドホックなものである場合は、いくつかのパブリックなものがあります。
select owner, type_name, upper_bound max_elements, length max_size, elem_type_name
from all_Coll_types
where coll_type = 'VARYING ARRAY'
and elem_type_name in ('INTEGER', 'NUMBER');