如何将项目插入到 oracle 数据库中的继承 table?
How to insert items into inherited table in oracle database?
我已经创建了 table“employe”和“medecin”,其中包含所有需要的类型,
像这样:
“medecin”table 继承自“employee”table
create type temploye as object( NUM_EMP Number(7),
NOM_EMP varchar2(30),
PRENOM_EMP varchar2(30),
ADRESSE_EMP varchar2(100),
TEL_EMP varchar2(10)
) not final;
/
create type tmedecin under temploye( NUM_MED number(7),
SPECIALITE varchar2(40),
medecin_soigne t_set_ref_soigne,
directeur_service t_set_ref_service
)not final;
/
CREATE TABLE EMPLOYE of temploye (NUM_EMP primary key);
/
-- Table MEDECIN
create table MEDECIN of tmedecin
(
constraint pk_NUM_MED primary key(NUM_MED),
SPECIALITE check(SPECIALITE IN ('Anesthésiste','Cardiologue','Généraliste','Orthopédiste'))
)
nested table medecin_soigne store as table_medecin_soigne,
nested table directeur_service store as table_directeur_service;
/
有没有办法在“medecin”table中插入元素而不添加“employe”的属性,我做的时候出错了,它说我需要指定所有参数。
我做了这样的事情:
INSERT INTO EMPLOYE VALUES (temploye(4,'BOUROUBI','Taous','Lotissement Dauphin n°30 DRARIA/ALGER','021356085'));
INSERT INTO MEDECIN VALUES (tmedecin(4,
'Orthopédiste', T_SET_REF_SOIGNE(), T_SET_REF_SERVICE ()));
您使用了 create type tmedecin under temploye
,因此 tmedecin
具有父类型 temploye
的所有属性以及 sub-type.[=27 中定义的额外属性=]
如果你想传入一个tmedecin
类型那么你需要声明所有的属性:
INSERT INTO MEDECIN VALUES (
tmedecin(
4,
'NOM',
'PRENOM',
'ADRESSE',
'TEL',
4,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
)
);
但您可以将它们声明为 NULL
:
INSERT INTO MEDECIN VALUES (
tmedecin(
NULL,
NULL,
NULL,
NULL,
NULL,
5,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
)
);
或者,您可以使用 INSERT
并命名列,而不是传入 TYPE
:
INSERT INTO MEDECIN (
NUM_MED,
SPECIALITE,
medecin_soigne,
directeur_service
) VALUES (
6,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
);
(这将使用默认值隐式创建其他列,除非另有说明,否则默认值为 NULL
。)
但是
您不需要 MEDECIN
table,因为您可以将 tmedecin
类型插入 EMPLOYEE
table:
INSERT INTO EMPLOYE VALUES (
tmedecin(
5,
'NOM',
'PRENOM',
'ADRESSE',
'TEL',
5,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
)
);
甚至可以使用以下方法创建类似的约束:
ALTER TABLE employe ADD CONSTRAINT employe__spceialite__chk CHECK (
OBJECT_VALUE IS NOT OF (tmedecin)
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Anesthésiste'
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Cardiologue'
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Généraliste'
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Orthopédiste'
);
CREATE UNIQUE INDEX test_uk1 ON employe(
TREAT(OBJECT_VALUE AS tmedecin).NUM_MED
);
db<>fiddle here
我已经创建了 table“employe”和“medecin”,其中包含所有需要的类型, 像这样:
“medecin”table 继承自“employee”table
create type temploye as object( NUM_EMP Number(7),
NOM_EMP varchar2(30),
PRENOM_EMP varchar2(30),
ADRESSE_EMP varchar2(100),
TEL_EMP varchar2(10)
) not final;
/
create type tmedecin under temploye( NUM_MED number(7),
SPECIALITE varchar2(40),
medecin_soigne t_set_ref_soigne,
directeur_service t_set_ref_service
)not final;
/
CREATE TABLE EMPLOYE of temploye (NUM_EMP primary key);
/
-- Table MEDECIN
create table MEDECIN of tmedecin
(
constraint pk_NUM_MED primary key(NUM_MED),
SPECIALITE check(SPECIALITE IN ('Anesthésiste','Cardiologue','Généraliste','Orthopédiste'))
)
nested table medecin_soigne store as table_medecin_soigne,
nested table directeur_service store as table_directeur_service;
/
有没有办法在“medecin”table中插入元素而不添加“employe”的属性,我做的时候出错了,它说我需要指定所有参数。 我做了这样的事情:
INSERT INTO EMPLOYE VALUES (temploye(4,'BOUROUBI','Taous','Lotissement Dauphin n°30 DRARIA/ALGER','021356085'));
INSERT INTO MEDECIN VALUES (tmedecin(4,
'Orthopédiste', T_SET_REF_SOIGNE(), T_SET_REF_SERVICE ()));
您使用了 create type tmedecin under temploye
,因此 tmedecin
具有父类型 temploye
的所有属性以及 sub-type.[=27 中定义的额外属性=]
如果你想传入一个tmedecin
类型那么你需要声明所有的属性:
INSERT INTO MEDECIN VALUES (
tmedecin(
4,
'NOM',
'PRENOM',
'ADRESSE',
'TEL',
4,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
)
);
但您可以将它们声明为 NULL
:
INSERT INTO MEDECIN VALUES (
tmedecin(
NULL,
NULL,
NULL,
NULL,
NULL,
5,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
)
);
或者,您可以使用 INSERT
并命名列,而不是传入 TYPE
:
INSERT INTO MEDECIN (
NUM_MED,
SPECIALITE,
medecin_soigne,
directeur_service
) VALUES (
6,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
);
(这将使用默认值隐式创建其他列,除非另有说明,否则默认值为 NULL
。)
但是
您不需要 MEDECIN
table,因为您可以将 tmedecin
类型插入 EMPLOYEE
table:
INSERT INTO EMPLOYE VALUES (
tmedecin(
5,
'NOM',
'PRENOM',
'ADRESSE',
'TEL',
5,
'Orthopédiste',
T_SET_REF_SOIGNE(),
T_SET_REF_SERVICE ()
)
);
甚至可以使用以下方法创建类似的约束:
ALTER TABLE employe ADD CONSTRAINT employe__spceialite__chk CHECK (
OBJECT_VALUE IS NOT OF (tmedecin)
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Anesthésiste'
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Cardiologue'
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Généraliste'
OR TREAT(OBJECT_VALUE AS tmedecin).SPECIALITE = 'Orthopédiste'
);
CREATE UNIQUE INDEX test_uk1 ON employe(
TREAT(OBJECT_VALUE AS tmedecin).NUM_MED
);
db<>fiddle here