Выбрать главу

C++ и С#, позволяют вам определять классы. Эти классы выступают в роли

шаблонов, из которых можно создавать объекты. Классы определяют атрибуты

и методы. Атрибуты используются для хранения состояния объекта,

а методы - для моделирования его поведения.

Объекты в базе данных стали доступны после выхода версии базы данных

Oracle 8. В последующих версиях происходило улучшение их функционала.

Наличие в базе данных объектов стало существенным успехом, так

как они позволили определять в базе данных собственные классы, известные

как объектные типы. Подобно классам в Java и С#, объектные типы

базы данных могут содержать атрибуты и методы. Иногда объектные типы

называют типами, определенными пользователем.

Простым примером объектного типа может быть тип, моделирующий

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

товара, а для скоропортящихся товаров - и число дней, которое товар

может находиться на полках, по истечении которого он должен быть снят

с продажи. Объектный тип product (товар) может содержать метод, показывающий

предельный срок употребления товара, исходя из срока хранения

продукта и текущей даты. Еще одним примером объектного типа может

служить тип, моделирующий человека; в подобном объектном типе

могут храниться атрибуты имени, фамилии, даты рождения и адреса. Адрес

сам по себе также может быть объектным типом с атрибутами типа

улица, город, штат и почтовый индекс. В этой главе приводятся примеры

объектных типов, представляющих товар, человека и почтовый адрес.

Кроме того, вы увидите, как создавать таблицы для этих объектных типов,

заполнять их объектами и манипулировать этими объектами в SQL и PL/

SQL.

Я разместил в папке SQL сценарий SQL?Рlus по имени object_schema.

sql, который создаёт пользователя по имени object_user с паролем object_

password. Этот сценарий также создаёт типы и таблицы, выполняет различные

выражения INSERT и создаёт PL/SQL код, показанный в первой

части этой главы. Вы должны запускать этот сценарий под пользователем

с привилегиями создания нового пользователя с привилегиями CONNECT,

RESOURCE и CREATE PUBLIC SYNONYM; для выполнения сценариев в своей базе

данных я загружаюсь под пользователем system. После того, как выполнение

сценария завершится, вы будете загружены под пользователем obj ect_

user.

Объекты базы данных 397

Создание объектных типов

Для создания объектного типа используется оператор CREATE TYPE. В следующем

примере оператор CREATE TYPE используется для создания объектного

типа t_address. Этот объектный тип используется для представления

адреса и содержит четыре атрибута с именами street, city, state и zip:

П CREATE TYPE t_aDDress AS OBJECT (

street VARCHAR2(15),

c ity VARCHAR2(15),

state VARCHAR2(2),

zip VARCHAR2(5)

);

/

Как можно видеть из предыдущего примера, для определения каждого

атрибута используется тип базы данных. Например, street определяется

как VARCHAR2 (15). Как вы вскоре увидите, тип атрибута сам может быть объектным

типом.

Следующий оператор создает объектный тип t_person. Обратите внимание,

что t_person использует для определения атрибута address объектный

тип t_add ress:

□ CREATE TYPE t_person AS OBJECT (

id NUMBER,

first_name VARCHAR2(10),

last_name VARCHAR2(10),

dob DATE,

phone VARCHAR2(12),

address t_address

);

/

Следующий пример создает объектный тип t_product, который будет

использоваться для представления товаров. Обратите внимание, что этот

тип определяет функцию get_sell_by_date() при помощи выражения

MEMBER FUNCTION:

□ 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, которое содержит код метода и создается оператором

398 Глава 12

CREATE TYPE BODY. В следующем примере для t_product создается тело. Оно

содержит определение кода для метода get_sell_by_date():

□ CREATE TYPE BODY t_product AS

—get_sell_by_date() показывает дату, до истечения которой

— товар должен быть продан

MEMBER FUNCTION get_sell_by_date() RETURN DATE IS

v_sell_by_date DATE;

BEGIN

-- вычислить предельную дату использования товара путем сложения атрибута

day_valid

— и текущей даты (SYSDATE)

SELECT days_valid + SYSDATE

INTO v_sell_by_date

FROM dual;

--показать предельную дату использования товара

RETURN v_sell_by_date;

END;