【问题标题】:How to Copy data from table with a nested table column如何从具有嵌套表列的表中复制数据
【发布时间】:2014-10-10 15:58:47
【问题描述】:

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

我想将此表的数据复制到另一个。我们如何为此构建 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。任何帮助将不胜感激。

【问题讨论】:

  • 您的表格是如何创建的? INSERT INTO ... tbl_col SELECT tbl_col ... 应该正常工作。还是我错过了一些微妙之处?
  • 你确定你得到的是ORA-00904,而不是ORA-00932: inconsistent datatypesORA-01031: insufficient privileges?两种模式中的表是引用它们自己的对象/表类型还是共同的?

标签: oracle insert nested-table


【解决方案1】:

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

   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 中的不同条目,则它们不可互换。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多