<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 и средняя цена для