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

вы выбираете объект. Следующий запрос получает товар №1 из таблицы

products; обратите внимание на использование псевдонима таблицы

р для таблицы products, посредством которого указан атрибут id объекта

product в выражении WHERE:

□ SELECT p.product

FROM products p

WHERE p.product.id = 1;

PR0DUCT(ID, NAME, DESCRIPTION, PRICE, DAYS_VALID)

T_PR0DUCT(1, ‘ pasta’ , ‘ 20 oz bag of pasta’ , 3.95, 10)

Следующий запрос явно включает атрибуты id, name, price и days_valid

объекта product в выражении SELECT, а также quantity_in_stock:

□ SELECT p.product.id, p.product.name,

p.product.price, p.product.days_valid, p.quantity_in_stock

FROM products p

WHERE p.product.id = 1;

PRODUCT.ID PRODUCT.NA PRODUCT.PRICE PRODUCT. DAYSJ/ALID QUANTITY_IN_

STOCK

1 pasta 3.95 10 50

Объектный тип t_product содержит функцию по имени get_sell_by_

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

быть продан. Функция делает это, добавляя атрибут days_valid к текущей

дате, которая извлекается из базы данных при помощи функции SYSDATE().

Вы можете вызвать функцию get_sell_by_date() при помощи псевдонима

таблицы, как показано в следующем примере, который использует псевдоним

таблицы р для таблицы products:

402 Глава 12

□ SELECT p.pro du c t .g e t_ se ll_by_ d a te ( )

FROM products p;

P.PRODUCT

19-JUN-07

13-JUN-07

Разумеется, если вы запустите этот запрос, ваши даты будут отличаться,

потому что они рассчитываются с использованием SYSDATE(), которая показывает

текущие дату и время.

Следующее выражение UPDATE изменяет описание товара №1; обратите

внимание, что псевдоним таблицы р используется снова:

□ UPDATE products р

SET p.product.description = ‘ 30 oz bag of pasta’

WHERE p.product_id = 1;

1 row updated.

Следующее выражение DELETE удаляет товар №2:

□ DELETE FROM products p

WHERE p.product.id = 2;

1 row deleted.

ROLLBACK;

Примечание Если вы выполнили эти выражения UPDATE или DELETE, убедитесь, что вы

выполнили ROLLBACK, чтобы ваши результаты совпали с остальными результатами этой главы.

Объектные таблицы

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

а такую таблицу принято называть объектной таблицей. В следующем

примере создаётся объектная таблица object_products, которая хранит

объекты типа t_product. Обратите внимание на использование фразы

OF, которая идентифицирует такую таблицу как объектную:

□ CREATE TABLE object_products OF t_product;

При добавлении строки в объектную таблицу вы можете или использовать

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

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

таблице. Следующее выражение INSERT добавляет строку в таблицу object_

products при помощи конструктора для t_product:

□ INSERT INTO object_products VALUES (

t_product(1, 'pasta', '20 oz bag of pasta', 3.95, 10)

);

Следующее выражение INSERT опускает конструктор для t_product. Обратите

внимание, что значения атрибутов для t_product передаются таким

же путём, как это было бы в реляционной таблице:

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

□ INSERT INTO object_products (

id, name, description, price, days_valid

) VALUES (

2, ‘ sardines’ , ‘ 12 oz box of sardines’ , 2.99, 5

);

Следующий запрос извлекает эти строки из таблицы object_products:

П SELECT *

FROM object_products;

ID NAME DESCRIPTION PRICE DAYS_VALID

1 pasta 20 oz bag of pasta 3.95 10

2 sardines 12 oz box of sardines 2.99 .5

Вы можете указать индивидуальные атрибуты в запросе, например,

так:

□ SELECT id, name, price

FROM object_products op

WHERE id = 1; '

ID NAME PRICE

1 pasta 3.95

или так:

□ SELECT op.id, op.name, op.price

FROM object_products op

WHERE op.id = 1;

ID NAME PRICE

1 pasta 3.95

Вы можете использовать встроенную функцию VALUЕ() базы данных

Oracle для выбора строки из объектной таблицы. VALUEO рассматривает

строку как объект и возвращает атрибуты для объекта внутри конструктора

для объектного типа. VALUE() принимает параметр, содержащий псевдоним

таблицы, как показано в следующем примере:

□ SELECT VALUE(op)

FROM object_products op;

VALUE(0P)(ID, NAME, DESCRIPTION, PRICE, DAYS_VALID)

T_PR0DUCT(1, ‘ pasta’ , ‘ 20 oz bag of pasta’ , 3.95, 10)

T_PR0DUCT(2, ‘ sardines’ , ‘ 12 oz box of sardines’ , 2.99, 5)

Вы также можете добавить атрибут объекта после VALUE():

П SELECT VALUЕ(op) . id, VALUE(op).name, VALUE(op). price

FROM object_products op;

404 Глава 12

VALUE(OP). ID VALUE(OP).NAME VALUE(OP).PRICE

1 pasta 3.95

2 sardines 2.99

Следующее выражение UPDATE изменяет описание товара №1:

□ UPDATE object_products

SET description = '25 oz bag of pasta’

WHERE id = 1;

1 row updated.

Следующее выражение DELETE удаляет товар №2:

□ DELETE FROM object_products

WHERE id = 2;

1 row deleted.

ROLLBACK;

Давайте посмотрим-на~ более сложную объектную таблицу. Следующее

выражение CREATE TABLE создаёт объектную таблицу по имени object_

customers, которая хранит объекты типа t_person: