1

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

我想将此表的数据复制到另一个。我们如何为此构建 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,extn 组合这给了我 5 个我不能也不应该插入的记录。

所以问题是,如何保持嵌套(嵌套表列)原样并插入到新表中?好吧,CTAS 可能是一种选择,但这需要一个全新的表而不是 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 回答