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

<id>1</id>

<address>

<T_ADDRESS>

<STREET>2 State Street</STREET>

<CITY>Beantown</CITY>

<STATE>MA</STATE>

<ZIP>12345</ZIP>

</T_ADDRESS>

</aDDress>

Можно создавать XML для коллекций, как показано в следующем примере,

в котором создается соединение от имени пользователя collection_

user и выбираются столбцы id и addresses покупателя №1, хранящиеся в

таблице customers_with_nested_table (столбец addresses хранит объект типа

t_nested_table_address, который является вложенной таблицей объектов

t_address):

□ CONNECT col.lection_user/collection_password

SELECT XMLELEMENT(" id ” , id) || XMLELEMENT(”addresses", addresses)

AS xml_object customer

FROM customers_with_nested_table

WHERE id = 1;

XML_OBJECT_CUSTOMERS

<id>1</id>

<addresses>

<T_NESTED_TABLE_ADDRESS>

<T_ADDRESS>

<STREET>2 State Street</STREET><CITY>Beantown</CITY>

<STATE>MA</STATE><ZIP>12345</ZIP>

</T_ADDRESS>

<T_ADDRESS>

<STREET>4 Hill Street</STREET>

<CITY>Lost Town</CITY>

<STATE>CA</STATE>

<ZIP>54321</ZIP>

</T_ADDRESS>

</T_NESTED_TABLE_ADDRESS>

</addresses>

628 Глава 17

XMLATTRIBUTESO

XMLATTRIBUTES( ) используется совместно с ХМLELEMENT( ) для назначения атрибутов

элементов XML, выбранных с помощью ХМLELEMENT(). В следующем

примере устанавливается соединение от имени пользователя store и

используется XMLATTRIBUTESO для установки имен атрибутов элементов

customer_id, first_name, last_name и dob:

□ CONNECT store/store_password

SELECT XMLELEMENT(

’’customer” ,

XMLATTRIBUTES(

customer_id AS "id",

first_name || ’ ’ II last_name AS "name” ,

T0_CHAR(dob, ’MM/DD/YYYY’ ) AS "dob”

)) AS xml_customers

FROM customers

WHERE customer_id IN (1, 2);

XML_CUSTOMERS

<customer id=” 1” name=”John Brown” dob=”01/01/1965”x/customer>

<customer id=”2” name=”Cynthia Green” dob=”02/05/1968”></customer>

Обратите внимание, что атрибуты id, name и dob возвращаются внутри

customer.

XMLFORESTO

XMLFOREST( ) используется для создания «леса» элементов XML. XMLFORESTO

соединяет вместе элементы XML, избавляя вас от необходимости использования

оператора соединения 11 со множественными вызовами

XMLELEMENTO. Следующий пример использует XMLFORESTO для выборки

customer_id, phone и dob покупателей №1 и №2:

□ SELECT XMLELEMENT(

"customer” ,

XMLFOR EST(

customer_id AS " id ” ,

phone AS "phone” ,

T0_CHAR(dob, ‘ MM/DD/YYYY’ AS ”dob”

)) AS xml_customers

FROM customers

WHERE customer_id IN (1, 2);

XML_CUSTOMERS

<customer>

<id>1</id>

<phone>800-555-1211</phone>

<dob>01/01/1965</dob>

</customer>

XML и база данных Oracle 629

<customer>

<id>2</id>

<phone>800-555-1212</phone>

<dob>02/05/1968</dob>

</customer>

Следующая команда устанавливает параметр SQITPlus LONG в 500, так

что вы сможете увидеть все XML, возвращаемые последующими запросами

(LO N G определяет максимальную длину текстовых данных, отображаемых

SQI?Plus):

П SET LONG 500

Следующий запрос помещает имя покупателя внутрь тэга элемента

customer, используя XMLATTRIBUTES():

□ SELECT XMLELEMENT(

"customer” ,

XMLATTRIBUTES(first_name || ’ ’ II last_name AS ’’name” ),

XMLF0REST(phone AS "phone” , T0_CHAR(dob, ’ MM/DD/YYYY’ ) AS ”dob")

) AS xml_customers

FROM customers

WHERE customer_id IN (1, 2);

XML_CUST0MERS

<customer name=”John Brown”>

<phone>800-555-1211</phone>

<dob>01/01/1965</dob>

</customer>

<customer name=”Cynthia Green”>

<phone>800-555-1212</phone>

<dob>02/05/1968</dob>

</customer>

XMLAGG()

XMLAGG() служит для создания леса элементов XML из коллекции элементов

XML. Обычно XMLAGG() используется для группировки XML вместе в общем

списке элементов внутри одного родителя, или для выборки данных из коллекций.

Можно использовать выражение запроса GROUP BY для группировки

возвращаемого набора строк в несколько групп, а также можно использовать

выражение ORDER BY функции XMLAGG() для сортировки строк.

По умолчанию ORDER BY сортирует результаты в порядке возрастания,

однако можно добавить DESC после списка столбцов для сортировки строк

в порядке убывания. Можно добавлять ASC для явного указания сортировки

в порядке возрастания. Можно также добавить NULLS LAST для помещения

пустых значений в конец списка результатов.

Следующий пример выбирает значения покупателя first_name и last_

name и возвращает их в список по имени customer_list. Обратите внимание,

что ORDER BY используется с XMLAGGO для сортировки результатов по

столбцу first_name. ASC добавлен явно для указания возрастающего порядка

сортировки:

630 Глава 17

□ SELECT XMLELEMENT(

”customer_list” ,

XMLAGG(

XMLELEMENT("customer” , first_name || ’ ’ II last_name)

ORDER BY first_name ASC

)) AS xml_customers

FROM customers

WHERE customer_id IN (1, 2);

XML_CUSTOMERS

<customer_list>

<customer>Cynthia Green</customer>

<customer>John Brown</customer>

</customer_list>

В следующем примере выбирается product_type_id и средняя цена для