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

Процедура inser t_produc t () добавляет объект в таблицу object_products;

in s e r t_ p ro d u c t ( ) в теле product_package определена следующим образом:

□ PROCEDURE inser t_product (

p_id IN object_products.id%TYPE,

p_name IN object_products.name%TYPE,

p_des c ript ion IN object_products.description%TYPE,

p_price IN object_products.price%TYPE,

p_days_valid IN object_products.days_valid%TYPE

) AS

- - создадим объект типа t_product по имени v_product

v_product t_product :=

t_product (

p_id, p_name, p_des c ription, p_price, p_days_valid

);

BEGIN

414 Глава 12

— добавим v_product в таблицу object_products

INSERT INTO object_products VALUES (v_product);

COMMIT;

EXCEPTION

WHEN OTHERS THEN

ROLLBACK;

END inser t_product;

Следующий пример вызывает product_package. in s e r t_ p ro d u c t ( ) для добавления

нового объекта в таблицу object_products:

□ CALL product_package.insert_product(3, ’ s a l s a ' ,

‘ 15 oz j a r of s a l s a ’ , 1.50, 20);

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

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

object_products; update_product_price () определена в теле product,

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

□ PROCEDURE update_product_price(

p_id IN object_products . iti%TYPE,

p_fac tor IN NUMBER

) AS

- - объявим объект типа t_product по имени v_product

v_product t_product;

BEGIN

— попытаемся выбрать товар для обновления

- - и сохранить товар в v_product

SELECT VALUE(op)

INTO v_product

FROM object_products op

WHERE id = p_id

FOR UPDATE;

- - отобразим текущую цену v_product

DBMS_OUTPUT.PUT_LINE(’ v _ p r o d u c t .p r i c e=’ | |

v _ p ro d u c t .p r i c e ) ;

- - умножим v _ pro du c t .p r ice на p_fac tor

v _pro du c t .p r ice := v _ pro du c t .p r ice *p_factor;

DBMS_OUTPUT.PUT_LINE(' New v_product. p r ice=' ||

v_produc t .pr ice) ;

— обновим товар в таблице object_products

UPDATE object_products op

SET op = v_product

WHERE id = p_id;

COMMIT;

EXCEPTION

WHEN OTHERS THEN

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

ROLLBACK;

END update_product_price;

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

для обновления цены товара №3 в таблице object_products:

□ CALL product_package.update_product_price(3, 2.4);

v_product.price=1 .5

New v_product.price=3. 6

Функция get_product()

Функция get_p roduct ( ) возвращает единичный объект из таблицы obj ect_

products; get product() определена в теле product_package следующим образом:

□ FUNCTION get_product(

p_id IN object_products.id%TYPE

) RETURN t_product IS

-- объявим объект типа t_product по имени v_product

v_product t_product;

BEGIN

— получим товар и сохраним его в v_product

SELECT VALUE(op)

INTO v_product

FROM object_products op

WHERE op.id = p_id;

-- вернём v_product

RETURN v_product;

END get_product;

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

товар №3 из таблицы object_products:

□ SELECT product_package.get_product(3)

FROM dual;

PRODUCT_PACKAGE.GET_PR0DUCT(3) (ID, NAME, DESCRIPTION

T_PR0DUCT(3, ‘ salsa’ , ‘ 15 oz jar of salsa’ , 3.6, 20)

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

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

object_ products; update_product ( ) определена в теле product_package следующим

образом:

□ PROCEDURE update_product(

p_product IN t_product

) AS

BEGIN

416 Глава 12

-- обновим товар в таблице object_products

UPDATE object_products op

SET op = p_product

WHERE id = p_product.id;

COMMIT;

EXCEPTION

WHEN OTHERS THEN

ROLLBACK;

END update_product;

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

обновить товар №3 в таблице object_products:

□ CALL product_package.update_product(t_product(3, ‘salsa’,

‘25 oz jar of salsa’, 2.70, 15));

Функция get_product_ref()

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

таблицы object_products; get_product_ref() определена в теле product_

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

□ FUNCTION get_product_ref(

p_id IN object_products.id%TYPE

) RETURN REF t_product IS

-- объявим ссылку на t_product

v_product_ref REF t_product;

BEGIN

-- получим REF для товара

— и сохраним её в v_product_ref

SELECT REF(op)

INTO v_product_ref

FROM object_products op

WHERE op.id = p_id;

-- вернём v_product_ref

RETURN v_product_ref;

END get_product_ref;

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

получить ссылку на товар №3 из таблицы object_products:

□ SELECT product_package.get_product_ref(3)

FROM dual;

PRODUCT_PACKAGE.GET_PRODUCT_REF(3)

000028020956DBE8BEFDEF4D5BA8C806A7B31B49DF916CDB2CAC1B46E9808BA181F9F276

0F0100

033D0002

Следующий пример снова вызывает product_package.get_product_ref(),

на этот раз с использованием DEREF(), чтобы получить сам товар:

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

□ SELECT DEREF(product_package.get_product_ref(3))

FROM dual;

DEREF(PRODUCT_PACKAGE.GET_PR0DUCT_REF(3)) (ID, NAME,

T_PR0DUCT(3, ‘ s a l s a ’ , ‘ 25 oz j a r of s a l s a ’ , 2.7, 15)

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

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

products; de le te_ prod uc t ( ) определена в теле product_package следующим

образом:

□ PROCEDURE delete_product(

p_id IN object_products.id%TYPE

) AS

BEGIN

- - удалим товар

DELETE FROM object_products op

WHERE o p . id = p_id;

COMMIT; . -

EXCEPTION

WHEN OTHERS THEN

ROLLBACK;

END delete_product;

Следующий пример вызывает product_package. de le te _ prod uc t ( ), чтобы

удалить товар №3 из таблицы object_products: