如何使用嵌套表列从表复制数据

时间:2014-10-10 15:58:47

标签: oracle insert nested-table

我有一个表,其中一列作为嵌套表。

我想将此表的数据复制到另一个表。我们如何构建INSERT子句似乎具有挑战性:

考虑。作为嵌套表的字段是phone_list,其类型是用户定义的类型" TBL_PHONE_EXTN"这是" typ_phone_extn"。

的表格
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_list,那么这个组合给了我5条记录,我不能也不应该插入。

所以问题是,如何保持嵌套(嵌套表列)的原样并插入到新表中?好吧,CTAS可能是一个选项,但需要一个全新的表而不是INSERT。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用COLLECT function将unnested元素重新组合到嵌套表中,然后将其转换回实际的集合类型:

   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 datatypesORA-01031: insufficient privileges而不是ORA-00904

即使你对模式中的类型拥有特权,Oracle UDT也必须是完全相同的类型 - 它们不足以构造相同的。如果它们是ALL_OBJECTS中的不同条目,则它们不可互换。