以下に示すparent_arrと同様の入力を、ODP.Net経由でアプリケーション層からの入力として受け入れるプロシージャがあります。手順の最初のステップでは、配列のデータをグローバル一時テーブルに格納します。これにより、pl/sql ループではなくセット ロジックを使用して、次のいくつかのステップに進むことができます。配列にparent_typのメンバーが1つしかない限り、すべて問題ありません。ただし、複数のメンバーがある場合、ORA-01427 が発生します。単一行クエリは複数の行を返します。以下のクエリは、2 つのコレクションを返します。child.name と child.value を表示する単一の SQL ステートメントで、両方のコレクションのネストを解除する必要があります。どうすればそれができますか?
サンプル オブジェクト
create type child_typ is object( name varchar2(100), value number );
create type child_arr is table of dropme_child_typ;
create type parent_typ is object( pname varchar2(100), child dropme_child_arr );
create type parent_arr is table of dropme_parent_typ;
以下のクエリは、ORA-01427 をスローします。
select * from table(
select child
from table( parent_arr(
parent_typ( 'TEST1',
child_arr(
child_typ( 'C1', 1 ),
child_typ( 'C2', 2 ) ) ),
parent_typ( 'TEST2',
child_arr(
child_typ( 'C3', 3 ),
child_typ( 'C4', 4 ) ) ) ) ) );
このクエリは機能しますが、オブジェクト child_arr の列を返します
select child
from table( parent_arr(
parent_typ( 'TEST1',
child_arr(
child_typ( 'C1', 1 ),
child_typ( 'C2', 2 ) ) ),
parent_typ( 'TEST2',
child_arr(
child_typ( 'C3', 3 ),
child_typ( 'C4', 4 ) ) ) ) );
「子」の値にアクセスできないため、このクエリは失敗します
select child.name, child.value from
table( parent_arr(
parent_typ( 'TEST1',
child_arr(
child_typ( 'C1', 1 ),
child_typ( 'C2', 2 ) ) ),
parent_typ( 'TEST2',
child_arr(
child_typ( 'C3', 3 ),
child_typ( 'C4', 4 ) ) ) ) );
pl/sql ループを使用せずにこれを行う方法があることを教えてください (これが、これまで成功した唯一の方法です)。スピードは最も重要です。forall ステートメントを使用して、parent_arr のメンバーをループしようとしましたが、一括バインド エラーがスローされます。