如何插入用户定义的类型列表

时间:2015-12-15 15:32:09

标签: oracle

我有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;

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

2 个答案:

答案 0 :(得分:2)

您可以使用与以下内容类似的语法:

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

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

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;

答案 1 :(得分:0)

我创建了一个示例:

  • 创建多级用户定义类型

  • 插入包含这些类型的表格

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

  • 选择无变量

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

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

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

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

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

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

让我们找到类型PLACE_TYPE:

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

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

所以正确的路径是:

select a.birth_info.birth_place.city from customer_x a

enter image description here