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

tladdressC 2 State Street’ , ‘ Beantown’ , ’MA’ , ‘ 12345’ )

)

INSERT INTO object_customers2 VALUES (

t_person2(2, ‘ Cynthia’ , ‘ Green’ , ‘ 05-FEB-1968’ , ‘ 800-555-1212 ,

t_address(‘ 3 Free Street’ , ‘ MiDDle Town’ , ’ CA’ , ’ 12345’ )

) - *

);

Следующий запрос использует > в секции WHERE:

П SELECT ос2. id , ос2.first_name, ос2.last_name, oc2.dob

FROM object_customers2 oc2

WHERE VALUE(oc2) >

t_person2(1, ‘ John’ , ‘ Brown’ , 01—PEB—1955 , 800-555-1211 ,

t_address(‘ 2 State Street’ , ‘ Beantown’ , ’ MA’ , ‘ 12345’ )

);

ID FIRST_NAME LAST_NAME DOB

1 Cynthia Green 05-FEB-68

При выполнении запроса база данных автоматически вызывает get_

string() для сравнения объектов в таблице object_customers2 с объектом

после знака > в секции WHERE. Функция get_string() возвращает объединение

атрибутов last_name и first_name объекта, и поскольку Green Cynthia

больше Brown John, именно она возвращается в качестве результата запроса.

Использование объектов в PL/SQL

Вы можете создавать и манипулировать объектами в PL/SQL. В этом разделе

вы увидите пакет product_package, который создаётся при запуске сценария

object_schema. sql; product_package содержит следующие методы.

■ Функцию get_products(), которая возвращает REF CURSOR, указывающий

на объекты в таблице object_products

■ Процедуру display_product ( ) , которая отображает атрибуты единичного

объекта в таблице object_products

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

■ Процедуру insert_product ( ) , которая добавляет объект в таблицу

obj ect_products

■ Процедуру update_product_price ( ) , которая обновляет атрибут price

объекта в таблице object_products

■ Функцию get_product ( ) , которая возвращает единичный объект из

таблицы object_ products

■ Процедуру update_product ( ) , которая обновляет все атрибуты объекта

в таблице object_products

■ Функцию get_product_ref ( ) , которая возвращает ссылку на единичный

объект из таблицы object_products

■ Процедуру delete_product ( ) , которая удаляет единичный объект из

таблицы object_ products

Сценарий object_product. sql содержит следующую спецификацию пакета:

□ CREATE PACKAGE product_package AS

TYPE t_ref_cursor IS REF CURSOR;

FUNCTION get_products RETURN t_ref_cursor;

PROCEDURE display_product(

p_id IN object_products.id%TYPE

);

PROCEDURE insert_product(

p_id IN object_products.id%TYPE,

p_name IN object_products.name%TYPE,

p_description IN object_products.description%TYPE,

p_price IN object_products.price%TYPE,

P_days_valid IN object_products.days_valid%TYPE

);

PROCEDURE update_product_price(

p_id IN object_products.id%TYPE,

p_factor IN NUMBER

);

FUNCTION get_product(

p_id IN object_products.id%TYPE

) RETURN t_product;

PROCEDURE update_product(

p_product t_product

);

FUNCTION get_product_ref(

p_id IN object_products.id%TYPE

) RETURN REF t_product;

PROCEDURE delete_product(

p_id IN object_products.id%TYPE

); END product_package;

/

В следующих разделах вы увидите методы, перечисленные в теле пакета

product_package.

412 Глава 12

Функция get_products()

Функция get.products ( ) возвращает REF CURS OR , который указывает на

объекты в таблице object.products; в теле product_package функция g et.

products ( ) определена следующим образом:

□ FUNCTION get_products

RETURN t_ref_cursor IS

— объявление объекта t_ref_cursor

v.products.ref.cursor t_ref_cursor;

BEGIN

— получим REF CURSOR

OPEN v_products_ref_cursor FOR

SELECT VALUE(op)

FROM object_products op

ORDER BY op.id;

-- возвратим REF CURSOR

RETURN v_products.ref_cur.sor;

END get.products;

Следующий запрос вызывает product_package. get_products(), чтобы получить

товары из object_products:

□ SELECT product.package.get.products

FROM dual;

GET_PRODUCTS

CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

VALUE(OP)(ID, NAME, DESCRIPTION, PRICE, DAYS_VALID)

_PR0DUCT(1, 'p a s t a ', ‘ 20 oz bag of pa s ta ’ , 3.95, 10)

T_PR0DUCT(2, ‘ s a rd in e s ’ , ‘ 12 oz box of s a rd in e s ’ , 2.99, 5)

Процедура display_product()

Процедура d isp la y _ p ro d u c t ( ) отображает атрибуты единичного объекта в

таблице o b je c t , products; d isp la y _ p ro d u c t ( ) в теле product.package определена

следующим образом:

□ PROCEDURE display_produc t(

p_id IN object.products.id%TYPE

) AS

- - определим объект типа t .p ro d u c t по имени v.product

v.produc t t .product ;

BEGIN

- - попытаемся получить товар и сохранить его в v.product

SELECT VALUE(op)

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

INTO v_product

FROM object_products op

WHERE id = p _ id ;

— отобразим атрибуты v_product

DBMS_OUTPUT.PUT_LINE('v_product.id=' ||

v_product .id) ;

DBMS_OUTPUT.PUT_LINE(' v_product.name=' ||

v_product.name);

DBMS_OUTPUT.PUT_LINE(' v_product. d e s c r ip t io n= ' ||

v _ p ro d u c t .d e s c r ip t io n ) ;

DBMS OUTPUT.PUT_LINE('v product . p r ice=' ||

v_produc t .pr ice) ;

DBMS_OUTPUT.PUT_LINE('v_product.days_valid=' I I

v_product.d a y s _ v a lid ) ;

- - вызовем v _produ c t .g e t_se ll_by_da te ( ) и отобразим дату

DBMS_OUTPUT.PUT_LINE(' S e l l by date=' ||

v_product.ge t_ se ll_ b y _d a te ( ));

END display_product;

Следующий пример вызывает product_package.display_product (1) для

извлечения из таблицы object_products товара № 1 :

□ SET SERVEROUTPUT ON

CALL product_package.display_product(1);

v_product.id=1

v_product.name=pasta

v_product.description=20 oz bag of pasta

v_product .pr ice=3.95

v_product.days_valid=10

S e l l by date=25-JUN-07

Процедура insert_product()