2

以下に示す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 のメンバーをループしようとしましたが、一括バインド エラーがスローされます。

4

1 に答える 1

1

横結合を使用して、子オブジェクトのネストを解除できます。

SQL> WITH my_data AS (
  2     SELECT pname, child
  3       FROM TABLE(parent_arr(parent_typ('TEST1',
  4                                        child_arr(child_typ('C1', 1),
  5                                                  child_typ('C2', 2))),
  6                             parent_typ('TEST2',
  7                                        child_arr(child_typ('C3', 3),
  8                                                  child_typ('C4', 4)))))
  9  )
 10  SELECT my_data.pname, child.name, child.value
 11    FROM my_data, table(my_data.child) child;

PNAME    NAME       VALUE
-------- ----- ----------
TEST1    C1             1
TEST1    C2             2
TEST2    C3             3
TEST2    C4             4

これは、親とその子を結合する外部結合の形式です。

于 2011-02-16T09:25:51.297 に答える