4

次の例では、3つのアイテムでVARRAYを作成します。

TEST@XE> select t1, t2.* from
  2  (select 'X' as t1 from dual UNION select 'Y' from dual) t1,
  3  table (sys.odcivarchar2list('a', 'b', 'c'))             t2;

T1  COLUMN_VALUE
--- --------------------
X   a
X   b
X   c
Y   a
Y   b
Y   c

次の出力が欲しいのですが。

T1  INDEX COLUMN_VALUE
--- ----- --------------------
X   1     a
X   2     b
X   3     c
Y   1     a
Y   2     b
Y   3     c

sys.odcivarchar2listとして事前定義されていることに注意してくださいVARRAY(32767) OF VARCHAR2(4000);

4

3 に答える 3

2

私の知る限り、動作が保証されている純粋な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.
于 2012-05-12T21:21:06.037 に答える
1
 select t1, row_number() over ( partition by t1 order by t1), t2.* from
 (select 'X' as t1 from dual UNION select 'Y' from dual) t1,
 table (sys.odcivarchar2list('a', 'b', 'c'))             t2;
于 2012-05-12T09:48:01.840 に答える
0

なぜ誰もこれを思い付かなかったのだろうかと思っているので、私は自分の質問に答えています

select t1, t2.* from 
(select 'X' as t1 from dual UNION select 'Y' from dual) t1, 
(select ROWNUM rn, COLUMN_VALUE from table (sys.odcivarchar2list('a', 'b', 'c'))) t2

T1          RN COLUMN_VALUE
--- ---------- --------------------
X            1 a
X            2 b
X            3 c
Y            1 a
Y            2 b
Y            3 c

ただし、これが実際に100%機能することが保証されているかどうかは疑問です。

于 2012-05-14T08:37:29.300 に答える