我已經創建了表“employe”和“medecin”,其中包含所有需要的型別,如下所示:
“medecin”表繼承自“employe”表
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”表中插入元素而不添加“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 ()));
uj5u.com熱心網友回復:
您使用create type tmedecin under temploye的 atmedecin具有父型別的所有屬性temploye以及子型別中定義的額外屬性。
如果要傳入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表,因為您可以將tmedecin型別插入EMPLOYEE表中:
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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461917.html
