我尝试使用子类型对象代替超类型对象,但它不起作用?

问题描述 投票:0回答:2

我创建了两个对象 T_PERSONS、T_BUSINESS_PERSON,其中 T_BUSINESS PERSON 是子类型,T_PERSONS 是超类型。

---创建 T_PERSONS 对象---

CREATE OR REPLACE
TYPE T_PERSONS AS OBJECT
( id integer,
 first_name varchar2(10),
 last_name varchar2(10),
 dob DATE,
 phone varchar2(12),
 address t_address,
 ) NOT FINAL;

---创建 T_BUSINESS_PERSON 对象---

CREATE TYPE t_business_person UNDER t_persons 
(title varchar2(20),
 company varchar2(20)
 );

现在我创建了一个对象表object_customers

CREATE TABLE object_customers OF t_persons

将数据插入 object_customers

 INSERT INTO object_customers VALUES
 (t_persons(1,'Jason','Bond','03-APR-1955','800-555-1211',
  t_address('21 New  Street','Anytown','CA','12345')
  ));

在这种情况下,数据已正确插入

 INSERT INTO object_customers VALUES
 (t_business_person(2,'Steve','Edwards','03-MAR-1955','800-555-1212',
  t_address('1 Market  Street','Anytown','VA','12345'),'Manager','XYZ Corp'
  ));

现在在这种情况下发生了错误

Error-attribute or element value is larger than specified in type.

请帮忙。

oracle-database plsql oracle11g
2个回答
0
投票

仅当您按如下方式创建表时,第二次插入才会起作用:

CREATE TABLE object_customers OF t_business_person;

单击此处了解有关NOTFINAL 条款的更多信息。


0
投票

您的设置看起来不错!为了确定起见,删除所有内容并从头开始重新创建类型和表可能会有所帮助。

对于之前的回复:不需要将object_customers定义为t_business_person。由于 t_persons 被标记为 NOT FINAL,因此它已经支持插入任何子类型,包括 t_business_person。如果您将表定义为 t_business_person,则会将该表限制为该特定子类型,从而限制了灵活性。

© www.soinside.com 2019 - 2024. All rights reserved.