вы выбираете объект. Следующий запрос получает товар №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: