我有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;
但是对于较大的列大小表来说这是一个问题。有没有办法解决这个问题?
答案 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
<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;
要查找列的当前值,请使用表 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>
&#13;
让我们找到类型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>
&#13;
所以正确的路径是:
select a.birth_info.birth_place.city from customer_x a