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

□ 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 или с более