Когда вы вставляете строку в таблицу объектов, она попадает только в эту таблицу. Даже если это подтип.
Если вам нужны данные как person
, так и customer
, вам нужно две вставки. Но затем вы дублируете атрибуты клиентов!
Когда у вас есть иерархия типов, вы можете создать таблицу объектов на родительском объекте. И вставьте подтипы в это. Вам нужно только создать отдельную таблицу клиентов, если вы хотите вставить в нее только CustomerType
объектов.
Если вы вставите все объекты в таблицу person
, вы можете вытащить строки указанного c подтип с условием is of (<objecttype>)'
:
CREATE TYPE PersonType AS OBJECT (
PID VARCHAR2(5),
Name VARCHAR2(30),
Address VARCHAR2(35),
age NUMBER(3)
) NOT FINAL;
/
CREATE TYPE CustomerType UNDER PersonType (
CID VARCHAR2(20));
/
INSERT INTO Person VALUES(CustomerType('P2','Andy','Poland',21,'SS'));
INSERT INTO Person VALUES(PersonType('P3','Chris','Poland',21));
select * from person p;
PID NAME ADDRESS AGE
P2 Andy Poland 21
P3 Chris Poland 21
select * from person p
where value ( p ) is of ( CustomerType );
PID NAME ADDRESS AGE
P2 Andy Poland 21
Но, если честно, лучше хранить данные, используя обычные реляционные таблицы:
create table person (
pid varchar2(5)
primary key,
name varchar2(30),
address varchar2(35),
age number(3)
);
create table customer (
pid
references person ( pid )
not null,
cid varchar2(20)
);