Ограничение подставляемости для конкретного подтипа
Итак, я могу отключить все уровни подставляемости, но что если необходимо отключить всю подставляемость кроме конкретного подтипа? Предположим, например, что я хочу создать PL/SQL коллекцию десертов, которая может содержать только пирожные. Или я хочу ввести правило в моей таблице meals, что все десерты должны быть пирожными. Oracle предоставляет предложение IS OF для этой цели. Вот новое объявление таблицы meals, в которой существует два различных типа ограничения подставляемости:
CREATE TABLE meal ( served_on DATE, appetizer food_t, main_course food_t, dessert dessert_t ) COLUMN appetizer NOT SUBSTITUTABLE AT ALL LEVELS, COLUMN dessert IS OF (ONLY cake_t) ;
И теперь я смогу добавлять только такие приемы пищи, в которых десерты объявлены как пирожные. Поэтому следующий INSERT отвергается:
SQL> BEGIN 2 -- This will no longer work. 3 INSERT INTO meal VALUES ( 4 SYSDATE, 5 food_t ('Shrimp cocktail', 6 'PROTEIN', 'Ocean'), 7 food_t ('Eggs benedict', 8 'PROTEIN', 'Farm'), 9 dessert_t ('Strawberries and cream', 10 'FRUIT', 'Backyard', 'N', 2001)); 11 END; 12 / BEGIN * ERROR at line 1: ORA-00932: inconsistent datatypes
Оператор IS OF type можно использовать только для того, чтобы ограничить объекты строки и столбца для одного подтипа, не для нескольких. Необходимо также использовать ключевое слово ONLY, даже если это единственная альтернатива, доступная сейчас. Вы можете использовать либо IS OF type, либо NOT SUBSTITUTABLE AT ALL LEVELS для ограничения объектного столбца, но нельзя использовать и то и другое для одного и того же столбца. Очевидно, что эти ограничения можно применять к различным столбцам, как показано раньше.