【问题标题】:How to Insert Into User Defined Type Column Table如何插入到用户定义类型的列表中
【发布时间】:2018-04-19 10:14:09
【问题描述】:

我有 oracle 用户定义的类型和表,其中这些类型作为列。我正在尝试将简单数据插入到具有用户定义类型列的表中。但我得到无效的标识符错误。我找到了一种成功插入的方法。但我需要简单的方法。或者,也许我在开始创建表格时做错了什么。

CREATE OR REPLACE TYPE SCHEMA.A_TYPE as object
(
    column1 varchar2(4),
    column2 varchar2(5)
)

create table SCHEMA.TABLE1
(
    recordid     NUMBER,
    typedata     SCHEMA.A_TYPE
);

首先我尝试插入喜欢

insert schema.table1(recordid, typedata.column1, typedata.column2) 
values (1, 'aaaa', 'bbbbb');

但我得到 typedata.column1、typedata.column2 列名的无效标识符。

然后我像这样插入

declare
   v_type  schema.a_type := new  schema.a_type('aaaa', 'bbbbb');
begin
   insert into scheme.table1(recordid, typedata)
   values (1, v_type);
   commit;
end;

但是对于较大的列大小的表来说这是一个问题。有什么办法可以解决这个问题吗?

【问题讨论】:

  • 我不确定“较大列大小表的问题”是什么意思。您的第二个 insert 声明是正确的。我不确定您在尝试增加尺寸时遇到了什么问题。
  • 我的意思是类型可以有更多的列。当我从 db 导出数据时,它给了我插入脚本,就像我给出的第一个插入语句一样。我需要将其转换为第二个工作插入语句。这需要时间。实际上,我在表格中使用了不止一种类型。
  • 听起来您在说真正的问题是您用于导出数据的任何方法都会生成不正确的insert 语句。您究竟是如何生成声明的?您使用的是 Oracle 工具吗?我的猜测是,您使用的任何工具/方法都不是为了支持表中的对象类型而构建的。
  • insert into table1 values (1, a_type('aaaa', 'bbbbb')); 更简单。
  • 感谢所有 cmets。 @JustinCave,我使用 PL/SQL 开发人员 v11.0.3。据我了解,它不支持对象类型表。我也有 Oracle SQL Developer v1.5.5,它支持表中的对象类型。它填补了账单:)。谢谢。

标签: oracle


【解决方案1】:

您可以使用类似于以下的语法:

insert into schema.table1(recordid, typedata)
values ( 1, schema.a_type('aaaa','bbbbb'));

要记住的是,要插入对象类型数据,您需要使用对象构造函数。您也可以将其扩展到其他形式的插入语句:

insert into schema.table1(recordid, typedata)
  select rownum, schema.a_type(owner, object_name)
    from all_objects
   where length(owner) <=4
     and length(object_name) <= 5;

【讨论】:

    【解决方案2】:

    我已经创建了一个示例:

    • 创建多级用户定义类型

    • 插入到具有这些类型的表中

    • 如何找到类型属性的路径

    • 选择不带变量

    • 你可以找到一张附有类型结构的图片。


    create or replace type place_type as object
    (city varchar2(20),
    street varchar2(20));
    
    create or replace type birth_type as object
    (birth_place place_type,
    zipcode number);
    
    create or replace type name_type as object
    (fi_name varchar2(20),
    la_name varchar2(20));
    
    create table customer_x
    (birth_info birth_type,
    cust_name name_type);
    
    INSERT INTO customer_x VALUES 
    (birth_type(place_type('London', 'Magic Str.'), 5400), name_type('Henry', 'Big'));
    
    select * from customer_x
    

    <table style="width:70%">
      <tr>
        <td><b>BIRTH_INFO<b></td>
        <td><b>CUST_NAME<b></td>
      </tr>
      <tr>
        <td>[SCHEMA1.BIRTH_TYPE]</td>
        <td>[SCHEMA1.NAME_TYPE]</td>
      </tr>
    </table>

    要查找列的当前值,请使用表 USER_TYPE_ATTR

    select type_name, attr_name, attr_type_name
    from user_type_attrs
    where type_name = 'BIRTH_TYPE' 
    

    <table style="width:70%">
      <tr>
        <td><b>TYPE_NAME<b></td>
        <td><b>ATTR_NAME<b></td>
        <td><b>ATTR_TYPE_NAME<b></td> 
      <tr>
        <td>BIRTH_TYPE</td>
        <td>ZIPCODE</td> 
        <td>NUMBER</td>
      </tr>
      <tr>
        <td>BIRTH_TYPE</td>
        <td>BIRTH_PLACE</td> 
        <td>PLACE_TYPE</td>
      </tr>
    </table>

    让我们找到类型 PLACE_TYPE:

    select type_name, attr_name, attr_type_name
    from user_type_attrs
    where type_name = 'PLACE_TYPE'
    

    <table style="width:70%">
      <tr>
        <td><b>TYPE_NAME<b></td>
        <td><b>ATTR_NAME<b></td>
        <td><b>ATTR_TYPE_NAME<b></td>
      </tr>
      <tr>
        <td>PLACE_TYPE</td>
        <td>CITY</td>
        <td>VARCHAR2</td>
      </tr>
      </tr>
        <td>PLACE_TYPE</td>
        <td>STREET</td>
        <td>VARCHAR2</td>
      </tr>
    </table>

    所以正确的路径是:

    select a.birth_info.birth_place.city from customer_x a
    

    enter image description here

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2022-11-17
      • 2018-09-25
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      相关资源
      最近更新 更多