1

ネストされたテーブルとして列の 1 つを持つテーブルがあります。

このテーブルのデータを別のテーブルにコピーしたい。これに対して INSERT 句をどのように構成するかは難しいようです。

検討。ネストされたテーブルであるフィールドは、型が「typ_phone_extn」のテーブルであるユーザー定義型「TBL_PHONE_EXTN」である phone_list です。

CREATE OR REPLACE TYPE typ_phone_extn AS OBJECT
(phone_number VARCHAR2 (20), extension VARCHAR2 (10));
/

CREATE OR REPLACE TYPE tbl_phone_extn AS TABLE OF typ_phone_extn;
/

以下は明らかに失敗します: (ORA-00904: : 無効な識別子)

INSERT INTO sch2.sub_pat_address (
          pat_address_id,
          pat_id,
          **phone_list,**
          last_updated_by
)
   SELECT pat_address_id,
          pat_id,
          **phone_list,**
           last_updated_by
     FROM sch1.sub_pat_address ;

だから私は試します:

   SELECT pat_address_id,
          pat_id,
           **tbl_phone_extn(typ_phone_extn (phone_number,extension)),**
           last_updated_by
     FROM sch1.sub_pat_address, **table(phone_list)** ;

これが行うことは、ネストされたテーブルのネストを解除することです。つまり、特定の pat_address_id に 5 つの phone,extn の組み合わせの phone_list があった場合、これにより、挿入できない、また挿入すべきではない 5 つのレコードが得られます。

問題は、ネスト (ネストされたテーブルの列) をそのまま維持し、新しいテーブルに挿入する方法です。まあ、CTAS は 1 つのオプションかもしれませんが、それには INSERT の代わりにまったく新しいテーブルが必要です。どんな助けでも大歓迎です。

4

1 に答える 1

1

COLLECT関数を使用して、ネストされていない要素をネストされたテーブルに再構築し、それを実際のコレクション型にキャストできます。

   SELECT pat_address_id,
          pat_id,
           cast(collect(typ_phone_extn(phone_number,extension)) as tbl_phone_extn),
           last_updated_by
     FROM sch1.sub_pat_address, table(phone_list)
 GROUP BY pat_address_id, pat_id, last_updated_by;

そして、それをインサートに使用できます。

元の単純な挿入で問題が発生する唯一の理由は、各スキーマに独自の型があり、それらのテーブルが独自の型を使用して構築されている場合です。しかし、その後、ORA-00932: inconsistent datatypesorORA-01031: insufficient privilegesではなくを取得しますORA-00904

スキーマ全体のタイプに対する権限を持っている場合でも、Oracle UDT はまったく同じタイプでなければなりません。同じように構築されるだけでは十分ではありません。それらが異なるエントリである場合ALL_OBJECTS、それらは交換可能ではありません。

于 2014-10-10T17:36:37.987 に答える