END;
/ - ‘
Функция get_sell_by_date() вычисляет и показывает дату, до которой
можно продавать товар, складывая значение атрибута days_valid с текущей
датой. Текущая дата получается из базы данных путем вызова встроенной
в базу данных функции SYSDATE().
Для типа можно создать синоним и общедоступный синоним. В следующем
примере для t_product создается общедоступный синоним t_pub_
product:
□ CREATE PUBLIC SYNONYM t_pub_product FOR t_product;
Использование DESCRIBE для получения информации
об объектных типах
Для получения информации об объектных типах можно использовать команду
DESCRIBE. Следующие примеры иллюстрируют применение DESCRIBE
для типов t_address, t_person и t_product:
□ DESCRIBE t_address
Name Null? Type
STREET VARCHAR2(15)
CITY VARCHAR2(15)
STATE CHAR(2)
ZIP VARCHAR2(5)
DESCRIBE t_person
Name Null? Type
ID NUMBER
Объекты базы данных 399
FIRST_NAME VARCHAR2(10)
LAST_NAME VARCHAR2(10)
DOB DATE
PHONE VARCHAR2(12)
ADDRESS T_ADDRESS
DESCRIBE t_product
Name Null? Type
ID NUMBER(38)
NAME VARCHAR2(10)
DESCRIPTION VARCHAR2(22)
PRICE NUMBER(5,2)
DAYSJ/ALID INTEGER
METHOD
MEMBER FUNCTION GET_SELL_BY_DATE RETURNS DATE
Можно установить глубину, на которую команда DESCRIBE показывает
информацию, используя команду SET DESCRIBE DEPTH. В следующем примере
глубина показа устанавливается равной 2 , а затем еще раз выполняется
команда DESCRIBE t_person. На этот раз показываются атрибуты адреса (адрес
имеет тип t_address):
□ SET DESCRIBE DEPTH 2
DESCRIBE t_person
Name Null? Type
ID NUMBER
FIRST NAME VARCHAR2(10)
LAST NAME VARCHAR2(10)
DOB DATE
PHONE VARCHAR2( 12)
ADDRESS T ADDRESS
STREET VARCHAR2(15)
CITY VARCHAR2(15)
STATE CHAR(2)
ZIP VARCHAR2(5)
Использование объектных типов для определения
объектов-столбцов и объектных таблиц
Теперь, когда вы увидели, как создавать объектные типы, давайте посмотрим,
как использовать эти типы в таблицах базы данных. Можно использовать
объектные типы для определения столбцов таблицы, и такие столбцы
известны как объекты-столбцы. Вы также можете использовать объектный
тип для определения целой строки в таблице; такая таблица известна
как объектная таблица. Наконец, вы можете использовать ссылку на объект
для доступа к конкретной строке в объектной таблице; ссылка на объект
400 Глава 12
аналогична указателю в C++. В этом разделе вы увидите примеры объектов-
столбцов, объектных таблиц и ссылок на объект.
Объекты-столбцы
В следующем примере создается таблица products, содержащая столбец
product типа t_product. Эта таблица содержит также столбец quantity_in_
stock, который используется для хранения количества товара, имеющегося
в настоящее время на складе:
□ CREATE TABLE products (
product t.product,
quantity_in_stock NUMBER
);
При добавлении строки в эту таблицу вы обязаны использовать конструктор
для указания значений атрибутов для нового объекта t_product;
напомню, тип t_product был создан при помощи следующего выражения:
□ CREATE TYPE t.product AS OBJECT (
id NUMBER,
name VARCHAR2(15),
description VARCHAR2(22),
PRICE number(5, 2),
days.valid NUMBER,
— get_sell_by_date() показывает дату, до истечения которой
-- товар должен быть продан
MEMBER FUNCTION get.sell.by.date RETURN DATE
);
/
Конструктор является встроенным типом объектного типа и имеет такое
же имя, что и объектный тип; конструктор принимает параметры, которые
используются для установки атрибутов нового объекта. Конструктор
для типа t.product называется t.product и принимает пять параметров,
по одному для установки каждого из атрибутов; например, t_product( 1 ,
pasta, 20 oz bag of pasta, 3.95, 10 ) создаёт новый объект t.product и
устанавливает его id равным 1 , name в pasta, description в 20 oz bag o f pasta,
price в 3.95 и days_valid в 10.
Следующие выражения INSERT добавляют две строки в таблицу products;
обратите внимание на использование конструктора t.product для передачи
значений атрибутов для объектов столбца product:
□ INSERT INTO products (
product,
quantity.in.stock
) VALUES (
t_product(1, ‘ pasta’ , ‘ 20 oz bag of pasta’ , 3.95, 10),
50
);
INSERT INTO products (
product,
Объекты базы данных 401
quantity_in_stock
) VALUES (
t_product(2 , 'sardines’ , ‘ 12 oz box of sardines’ , 2 .99, 5 ),
25
);
Следующий запрос выбирает эти строки из таблицы products; обратите
внимание, что атрибуты объектов столбца products отображаются внутри
конструктора для t_product:
□ PRODUCT( ID, NAME, DESCRIPTION, PRICE, DAYS_VALID)
QUANTITY_IN_STOCK
T_PR0DUCT(1, ‘ pasta’ , ‘ 20 oz bag of pasta’ , 3.95, 10)
50
T_PR0DUCT(2, ‘ sardines’ , '12 oz box of sardines’ , 2.99, 5)
25
Вы также можете получить из таблицы отдельный объект столбца. Чтобы
сделать это, вы должны указать псевдоним таблицы, посредством которого