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()