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

типа в другой. В этом разделе вы увидите, как использовать 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’ )