Oracle SQL: данные не будут вставлены в супер таблицу - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать два класса, Персоны и Клиенты. Клиенты, являющиеся подклассом людей. Когда я пытаюсь вставить значения в таблицу «Клиенты», хотя я вижу значение, вставленное в таблицу «Клиенты», я не понимаю, почему оно не будет вставлено в таблицу «Персоналы», так как это суперкласс клиентов. Есть ли способ, которым я могу вставить в подкласс через суперкласс или наоборот? Вот мой код

CREATE TYPE PersonType AS OBJECT (
 PID VARCHAR2(5),
 Name VARCHAR2(30),
 Address VARCHAR2(35),
 age NUMBER(3)
 ) NOT FINAL;
/
CREATE TABLE Person of PersonType;
/
 CREATE TYPE CustomerType UNDER PersonType (
 CID VARCHAR2(20));
/
CREATE TABLE Customer of CustomerType;
/
INSERT INTO Customer VALUES(CustomerType('P2','Andy','Poland',21,'SS','C9'));
/
SELECT * FROM Person;

1 Ответ

0 голосов
/ 01 мая 2020

Когда вы вставляете строку в таблицу объектов, она попадает только в эту таблицу. Даже если это подтип.

Если вам нужны данные как 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)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...