CREATE TYPE food_ot AS OBJECT (
name VARCHAR2 (100),
food_group VARCHAR2 (100),
grown_in VARCHAR2 (100),
MEMBER FUNCTION price
RETURN NUMBER
)
NOT FINAL;
Type created.
CREATE OR REPLACE TYPE BODY food_ot
IS
MEMBER FUNCTION price
RETURN NUMBER
IS
BEGIN
RETURN (CASE self.food_group
WHEN 'PROTEIN' THEN 3
WHEN 'FRUIT' THEN 2
WHEN 'VEGETABLE' THEN 1
END);
END;
END;
Type created.
CREATE TYPE dessert_ot
UNDER food_ot (
contains_chocolate VARCHAR2 (1),
year_created NUMBER (4),
OVERRIDING MEMBER FUNCTION price
RETURN NUMBER
)
NOT FINAL;
Type created.
CREATE OR REPLACE TYPE BODY dessert_ot
IS
OVERRIDING MEMBER FUNCTION price
RETURN NUMBER
IS
multiplier NUMBER := 1;
BEGIN
RETURN 100;
END;
END;
Type created.
DECLARE
TYPE foodstuffs_nt IS TABLE OF food_ot;
fridge_contents foodstuffs_nt
:= foodstuffs_nt (food_ot ('Brussels Sprouts', 'VEGETABLE', 'Farm'),
dessert_ot ('Strawberries',
'FRUIT',
'Backyard',
'N',
2001));
BEGIN
FOR indx IN fridge_contents.FIRST .. fridge_contents.LAST
LOOP
DBMS_OUTPUT.put (
CASE
WHEN fridge_contents (indx) IS OF (ONLY food_ot)
THEN
'Food'
WHEN fridge_contents (indx) IS OF (ONLY dessert_ot)
THEN
'Dessert'
END
|| ' price:');
DBMS_OUTPUT.put_line (fridge_contents (indx).price ());
END LOOP;
END;
Statement processed.
Food price:1
Dessert price:100