типа в другой. В этом разделе вы увидите, как использовать CAST ( ) для
преобразования varray во вложенную таблицу и наоборот.
Использование CAST() для преобразования Varray во вложенную
таблицу
Следующие выражения создают и наполняют таблицу по имени custome rs_
with_varray2, которая содержит столбец addresses типа t_varray_address2:
□ CREATE TYPE t_varray_address2 AS VARRAY(3) OF t_address;
CREATE TABLE customers_with_varray2(
id INTEGER PRIMARY KEY,
first_name VARCHAR2(10),
last_name VARCHAR2 (10),
addresses t_varray_address2
INSERT INTO customers_with_varray2 VALUES (
1 , ' Jason’ , ‘ Bond’ ,
t_varray_address2 (
t_address(‘ 9 Newton Drive’ , ‘ Sometown’ , ‘WY’ , ’ 22123’ ),
t_address( ‘ 6 Spring Street’ , ‘ New City , CA , 77712 )
))
;
Следующий запрос использует CAST ( ) для передачи адресов varray для
покупателя №1 как вложенной таблицы. Обратите внимание, что адреса
появляются в конструкторе для типа T_NESTED_TABLE_Add ress, указывая на
преобразование элементов в этот тип:
□ SELECT CAST(cv.addresses AS t_nested_table address)
FROM customers_with_varray2 cv
WHERE cv.id = 1;
CAST(CV.ADDRESSESAST_NESTED_TABLE_ADDRESS) (STREET, CITY, STATE,
ZIP)
T_NESTED_TABLE_ADDRESS(
T_ADDRESS ( ' 9 Newton Drive’ , ‘ Sometown’ , ’WY’ , ‘ 22123’ ),
T_ADDRESS ( ‘ 6 Spring Street’ , ‘ New City’ , ‘ CA’ , ‘ 77712’ ) )
Использование CAST() для преобразования вложенной таблицы в
Varray
Следующий запрос использует CAST ( ) для передачи адресов для покупателя
№1 в customers_with_nested_table в качестве varray. Обратите внимание,
что адреса появляются в конструкторе для T_VARRAY_Add ress2:
Коллекции 461
□ SELECT CAST(cn.addresses AS t_varray_address2)
FROM customers_with_nested_table cn
WHERE cn.id = 1;
CAST(CN.AddressESAST_VARRAY_ADDRESS2)(STREET, CITY, STATE, ZIP)
T_VARRAY_ADDRESS2(
T_ADDRESS ('2 State Street’ , ‘ Beantown’ , ’ MA’ , ‘ 12345’ ),
T_ADDRESS ( ‘ 4 H ill Street’ , ‘ Lost Town’ , ‘ CA’ , ‘ 54321’ ) )
Использование коллекций в PL/SQL
Вы можете использовать коллекции в PL/SQL. В этом разделе вы увидите,
как выполнять следующие задачи в PL/SQL:
■ манипулирование массивами переменной длины;
■ манипулирование вложенными таблицами;
■ использование методов коллекций PL/SQL для доступа и манипулирования
коллекциями.
Все пакеты, которые вы увидите в этом разделе, создаются при запуске
сценария collection_schema.sql. Если вы выполняли любые из показанных
в предыдущих разделах этой главы выражений INSERT, UPDATE или DELETE,
перезапустите сценарий collection_schema.sql, чтобы ваши результаты
совпадали с результатами этого раздела.
Манипулирование массивами переменной длины
В этом разделе рассматривается пакет varray_package, в котором содержатся
следующие элементы:
■ тип REF CURSOR по имени t_ ref „cursor;
■ функция get_customers(), возвращающая объект t_ref_cursor, который
указывает на строки из таблицы customers_with_varray;
■ процедура insert_custorier(), добавляющая новую строку в таблицу
customers_with_varray.
В сценарии collection_schema. sql содержатся следующие спецификация
и тело пакета для varray_package:
D CREATE PACKAGE varray_package AS
TYPE t_ref_cursor IS REF CURSOR;
FUNCTION get_customers RETURN t_ref_cursor;
PROCEDURE insert_customer (
p_id IN customers_with_varray.id%TYPE,
p_first_name IN customers_with_varray. first_naine%TYPE,
p_last_name IN customers_with_varray.last_name%TYPE,
p_addresses IN customers_with_varray.addresses%TYPE
); END varray_package;
/
CREATE PACKAGE BODY varray_package AS
462 Глава 13
— функция ge t_ cu stom ers() возвращает REF CURSOR,
— который указывает на строки в customers_with_varray
FUNCTION get_customers
RETURN t_ r e f„ c u r s o r IS
— объявляем объект REF CURSOR
v _ cu stom e rs_ re f„cu rso r t_ re f„ c u r s o r ;
BEGIN
- - получить REF CURSOR
OPEN v_customers_ref_cursor FOR
SELECT *
FROM customers_with_varray;
— возвратить REF CURSOR
RETURN v_customers_ref_cursor;
END get_customers;
- - процедура in s e rt_ c u s tom e r() добавляет строку в
- - customers_with_varray
PROCEDURE insert_customer* (
p_id IN customers_with_varray.id%TYPE,
p_first_name IN customers_with_varray.first_name%TYPE,
p_last„name IN customers_with_varray.last_name%TYPE,
p_addresses IN customers_with_varray.addresses%TYPE
) IS
BEGIN
INSERT INTO customers_with_varray
VALUES (p_id, p_first_name, p_last_name, p_ add re sse s);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END insert_customer;
END varray_package;
/
В следующем примере вызывается insert_customer(), чтобы добавить
новую строку в таблицу customers_with_varray:
□ CALL va rra y_p a ck ag e .in se rt_cu stom e r(
2, ‘ Jam e s ', ' R e d ',
t_varray_add re ss(
‘ 10 Main S tre e t, Green Town, CA, 22212’ ,
‘ 20 S ta te S tre e t, Blue Town, FL, 22213’
))
;
C a ll completed.
Следующий пример вызывает get_customers() для выборки строк из
таблицы customers_with_varray:
□ SELECT varray_package.get_customers
FROM dual;
Коллекции 463
GET_CUSTOMERS
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
ID FIRST_NAME LAST_NAME
ADDRESSES
1 Steve Brown
T_VARRAY_ADDRESS ( ‘ 2 State Street, Beantown, MA, 12345',
‘ 4 Hill Street, Lost Town, CA, 54321’ )
2 John Smith
T_VARRAY_ADDRESS ( ‘ 1 High Street, Newtown, CA, 12347’ ,
‘ 3 New Street, Anytown, MI, 54323’ ,
‘ 7 Market Street, Main Town, MA, 54323’ )