Процедура 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: