如何将项目插入到 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