Можно ли вставить в таблицу в СУБД ORACLE строку, которая была унаследована? - PullRequest
0 голосов
/ 22 апреля 2020

У меня только что был быстрый вопрос, у следующих трех таблиц есть наследование с использованием UNDER,

CREATE TYPE MenuType AS OBJECT(
 MenuCode VARCHAR2(5),
 Description VARCHAR2(20)) NOT FINAL;
/

CREATE TABLE Menu of MenuType (
MenuCode PRIMARY KEY);

CREATE TYPE VegetarianType UNDER MenuType (
 ProteinLevel VARCHAR2(20));
/

CREATE TABLE Vegetarian of VegetarianType;

CREATE TYPE LowFatType UNDER MenuType (
 KCal VARCHAR2(20));
/

CREATE TABLE LowFat of LowFatType;

Можно ли вставить в таблицу меню строку, представляющую вегетарианскую диету? или просто вставить строку в вегетарианскую таблицу?

Заранее спасибо,

Асан

1 Ответ

1 голос
/ 22 апреля 2020

Вам не нужны отдельные таблицы для подтипов, вы можете просто вставить их в таблицу MENU, а затем использовать функцию TREAT для преобразования в подтип при необходимости:

CREATE TYPE MenuType AS OBJECT(
 MenuCode VARCHAR2(5),
 Description VARCHAR2(20)
) NOT FINAL;
/

CREATE TYPE VegetarianType UNDER MenuType (
 ProteinLevel VARCHAR2(20)
);
/

CREATE TYPE LowFatType UNDER MenuType (
 KCal VARCHAR2(20)
);
/

CREATE TABLE Menu of MenuType (
  MenuCode PRIMARY KEY
);

Затем вы можете INSERT:

INSERT INTO Menu
VALUES ( VegetarianType( 'VEGE1', 'Vegetarian Meal 1', 'Lots of Protein' ) );

INSERT INTO Menu VALUES ( LowFatType( 'LFAT1', 'Low Fat Meal 1', '500kCal' ) );

Затем вы можете использовать TREAT для получения значений из полей подтипа:

SELECT m.*,
       TREAT( VALUE(m) AS VegetarianType ).ProteinLevel AS ProteinLevel,
       TREAT( VALUE(m) AS LowFatType ).KCal AS KCal
FROM   Menu m;

Какие выходные данные:

MENUCODE | DESCRIPTION       | PROTEINLEVEL    | KCAL   
:------- | :---------------- | :-------------- | :------
VEGE1    | Vegetarian Meal 1 | Lots of Protein | <em>null</em>   
LFAT1    | Low Fat Meal 1    | <em>null</em>            | 500kCal

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...