□ CALL product_package.delete_product(3);
Теперь, когда вы ознакомились со всеми методами в р roduct_package, настало
время увидеть две процедуры с именами p r o d u c t _ l i f e c y c le ( ) и
p r o d u c t_ l i fe c y c le 2 ( ), которые вызывают различные методы пакета. Обе
процедуры создаются при запуске сценария object_schema.sql.
Процедура productJifecycle()
Процедура p r o d u c t _ l ife c y c le ( ) определена следующим образом:
П CREATE PROCEDURE p ro d u c t_ life c y c le AS
- - объявление объекта
v_product t_product;
BEGIN
- - добавляем новый товар
product_package.insert_product(4, ' beef,
'25 lb pack of beef, 32, 10);
— отображаем товар
product_package.display_product(4);
- - получим новый продукт и сохраним его в v_product
SELECT product_package.get_product(4)
418 Глава 12
INTO v_product
FROM dual;
— изменим некоторые атрибуты v_product
v _ p ro d u c t .d e s c r ip t io n := '20 lb pack of beef';
v_pro du c t .p r ice := 36;
v_product .days_valid := 8;
— обновим товар
product.package.update_product(v_product);
- - отобразим товар
product.package.display_product(4) ;
- - удалим товар
product.package.delete_product(4);
END p r o d u c t . l i fe c y c le ;
/
Следующий пример вызывает product_lifecycle():
CALL p ro d u c t_ l ife c y c le ( ) ;
v.produc t.id=4
v.product.name=beef
v .produc t.de s c r ipt ion=25 lb pack of beef
v.produc t.pr ice=32
v.product.days_valid=10
S e l l by date=27-JUN-07
v.produc t.id=4
v.product.name=beef
v .produc t.des c r ipt ion=20 lb pack of beef
v .produc t.price=36
v.product.days_valid=8
S e l l by date=25-JUN-07
Процедура product_lifecycle2()
Процедура p r o d u c t_ l ife c y c le 2 ( ) использует объектную ссылку для доступа
к товару; p ro d u c t _ l i fe c y c le 2 ( ) определена следующим образом:
П CREATE PROCEDURE p ro d u c t_ l ife c y c le 2 AS
- - объявим объект
v.produc t t.product;
- - объявим объектную ссылку
v .p ro d u c t . re f REF t.product ;
BEGIN
— добавим новый товар
product.package.insert_produc t(4, ' beef,
'25 lb pack of be ef', 32, 10);
- - отобразим товар
product.package.display_product(4) ;
Объекты базы данных 419
— получим новую ссылку на товар и сохраним её в v_product_ref
SELECT product_package.get_product_ref(4)
INTO v_product_ref
FROM dual;
получим сам объект из v_product_ref при помощи следующего запроса
SELECT DEREF(v_product_ref)
INTO v_product
FROM dual;
- - изменим некоторые атрибуты v_product
v _pro du c t .d e s c r ipt io n := '20 lb pack of beef';
v_pro du c t .p r ice := 36;
v_product.days_valid := 8;
- - обновим товар
product_package.update_product(v_product);
- - отобразим товар
product_package.display_produc t(4);
— удалим товар
product_package.delete_product(4);
END pro d u c t_ life cy c le 2 ;
/
В этой процедуре необходимо отметить один момент: чтобы получить
объект из ссылки v_product_ref, вы должны использовать следующий запрос:
□ SELECT DEREF(v_product_ref)
INTO v_product
FROM dual;
Причина, по которой вы должны использовать этот запрос, заключается
в том, что вы не можете использовать DEREF( ) напрямую в коде PL/SQL.
Например, следующее выражение не будет компилироваться в PL/SQL:
□ v_product := DEREF(v_product_ref);
Следующий пример вызывает p r o d u c t _ l ife c y c le 2 ( ):
□ CALL p r o d u c t_ l ife c y c le 2 ( );
v_product.id=4
v_product.name=beef
v_product.description=25 lb pack of beef
v_product.price=32
v_product.days_valid=10
S e l l by date=27-JUN-07
v_product.id=4
v_product.name=beef
v_product.description=20 lb pack of beef
v_product.price=36
v_product.days_valid=8
S e l l by date=25-JUN-07
420 Глава 12
Наследование типов
С выпуском базы данных Oracle9i появилась возможность использовать
наследование объектного типа. Это позволяет определять иерархии типов
базы данных. Например, вы можете захотеть определить объектный
тип business_person и сделать так, чтобы этот тип наследовал существующие
атрибуты из t_pe rson. Тип business_pe rson может расширить t_pe rson
атрибутами для хранения названия должности этого лица и названия
компании, в которой он работает. Чтобы можно было наследовать из t_
person, при определении этого типа должна быть использована фраза NOT
FINAL:
□ CREATE TYPE t_person AS OBJECT (
id INTEGER,
first_name VARCHAR2(10),
last_name VARCHAR2(10),
dob DATE,
phone VARCHAR2(12),
address t_address,
MEMBER FUNCTION display_details RETURN VARCHAR2
) NOT FINAL;
/
Фраза NOT FINAL означает, что при определении других типов возможно
наследование из типа t_person. Значением по умолчанию является
FINAL, запрещающее наследование.
Следующее выражение создаёт тело для t_person. Обратите внимание,
что функция display_details() возвращает VARCHAR2, содержащий идентификатор
и имя человека:
□ CREATE TYPE BODY t_person AS
MEMBER FUNCTION display_details RETURN VARCHAR2 IS
BEGIN
RETURN 1 id=’ || id || ', name=’ || first_name || ‘ ‘ II last_name;
END;
END;
/
Примечание Автор предоставил в каталоге SQL сценарий SQL*Plus под названием object_
schema2.sql, который создает все элементы, показанные в этой и последующих секциях. Сценарий
object_schema2.sql можно выполнить, если вы работаете с базой данных OracleQi или с более