Классика баз данных - статьи

       

Я могу также использовать преимущества


Я могу также использовать преимущества подставляемости в PL/SQL блоках. В следующем коде, я объявляю еду, но инициализирую ее десертом, более конкретным типом еды.

DECLARE mmm_good food_t := dessert_t ( 'Super Brownie', 'CARBOHYDRATE', 'my oven', 'Y', 1994); BEGIN DBMS_OUTPUT.PUT_LINE ( mmm_good.name); END; /

А вот пример подставляемости в PL/SQL коллекциях:

DECLARE TYPE foodstuffs_nt IS TABLE OF food_t; fridge_contents foodstuffs_nt := ( food_t ( 'Eggs benedict', 'PROTEIN', 'Farm'), dessert_t ( 'Strawberries and cream', 'FRUIT', 'Backyard', 'N', 2001), cake_t ( 'Chocolate Supreme', 'CARBOHYDRATE', 'Kitchen', 'Y', 2001, 8, 'Happy Birthday, Veva')); BEGIN FOR indx IN fridge_contents.FIRST .. fridge_contents.LAST LOOP DBMS_OUTPUT.PUT_LINE ( fridge_contents(indx).name); END LOOP; END; /

Теперь рассмотрим вставки, которые не работают. Допустим, я создал объектную таблицу десертов:

CREATE TABLE sweet_nothings OF dessert_t; /

Если теперь я попытаюсь вставить объект типа еда, Oracle выдаст ошибку, как показано ниже:

BEGIN INSERT INTO sweet_nothings VALUES (dessert_t ( 'Jello', 'PROTEIN', 'bowl', 'N', 1887 ) ); INSERT INTO sweet_nothings VALUES (food_t ( 'Brussel Sprouts', 'VEGETABLE', 'farm' ) ); END; / PL/SQL: ORA-00932: inconsistent datatypes

Я получил эту ошибку потому, что любой десерт является едой, но не любая еда является десертом. Я не могу вставить объект типа food_t в столбец типа dessert_t.

Теперь рассмотрим аналогичную ситуацию, в PL/SQL. Я объявляю в своей программе объект типа еда и инициализирую его десертом. Обратите внимание, что я указал Y или "Yes, it sure does!" ("Да, конечно, содержит!") для атрибута contains_chocolate (содержит_шоколад). Однако, если я попытаюсь в своем коде указать этот атрибут, характерный для десерта, PL/SQL выдаст мне ошибку.

SQL> DECLARE 2 -- Опять я подставляю, но на этот раз 3 -- я пытаюсь получить доступ к атрибуту десерта. 4 mmm_good food_t := 5 dessert_t ( 6 'Super Brownie', 7 'CARBOHYDRATE', 8 'my oven', 'Y', 1994); 9 BEGIN 10 DBMS_OUTPUT.PUT_LINE ( 11 mmm_good.contains_chocolate); 12 END; 13 / mmm_good.contains_chocolate); * ERROR at line 11: ORA-06550: line 11, column 16: PLS-00302: component 'CONTAINS_CHOCOLATE' must be declared

Как вы можете заметить, типы являются, как правило, подставляемыми (то есть, вы можете подставить подтип для его супертипа). Преимущества подставляемости можно использовать в объектных типах, объявленных как атрибуты объектных типов, столбцы таблицы или строки в таблицах и коллекциях.

В описании самого объектного типа Oracle не предоставляет никакого способа для отключения подставляемости; любой объектный тип является теоретически или потенциально подставляемым. С другой стороны, Oracle предлагает способ ограничить подставляемость и даже сделать ее невозможной при объявлении использования этого объектного типа.


Содержание  Назад  Вперед