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

каждой группы товаров. Обратите внимание, что товары группируются по

product_type_id при помощи оператора запроса GROUP BY, а для размещения

строки с пустым р rod uct_ty pe_id в конце списка возвращаемых результатов

во фразе ORDER BY функции XMLAGG( ) используется NULLS LAST:

□ SELECT XMLELEMENT(

“product_list” ,

XMLAGG(

XMLELEMENT(

“product_type_and_avg” , product_type_id || ‘ ‘ II AVG(price)

) ORDER BY product_type_id NULLS LAST

)) AS xml_products

FROM products

GROUP BY product_type_id;

XML_PRODUCTS

<product_list>

<product_type_and_avg>1 24.975</product_type_and_avg>

<product_type_and_avg>2 26.22</product_type_and_avg>

<product_type_and_avg>3 13.24</product_type_and_avg>

<product_type_and_avg>4 13.99</product_type_and_avg>

<product_type_and_avg> 13.49</product_type_and_avg>

</product_list>

Примечание Можно также размещать пустые строки первыми, указав n u lls f i r s t в выражении

ORDER BY функции XMLAGG().

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

со значениями product_type_id 1 и 2, и товары группируются по product,

type_id:

□ SELECT XMLELEMENT(

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

“products_in_group” ,

XMLATTRIBUTES(product_type_id AS “prd_type_id” ),

XMLAGG(

XMLELEMENT(“name” , name)

)) AS xml_products

FROM products

WHERE product_type_id IN (1, 2)

GROUP BY product_type_id;

XML_PRODUCTS

<products_in_group prd_type_id=” 1”>

<name>Modern Science</name>

<name>Chemistry</name>

</products_in_group>

<products_in_group prd_type_id=”2”>

<name>Supernova</name>

<name>2412</name>

</products_in_group>

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

collection_user и выбираются адреса покупателя №1 из customers_with_

nested_table:

□ CONNECT collection_user/collection_password

SELECT XMLELEMENT(“customer” ,

XMLAGG(

XMLELEMENT(“addresses” , addresses)

)) AS xml_customer

FROM customers_with_nested_table

WHERE id = 1;

XML_CUSTOMER

<customer>

<aDDresses>

<T_NESTED_TABLE_ADDRESS>

<T_ADDRESS>

<STREET>2 State Street</STREET>

<CITY>Beantown</CITY>

<STATE>MA</STATE>

<ZIP>21345</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>

632 Глава 17

</addresses>

</customer>

XMLCOLATTVAL()

XMLCOLATTVAL() используется для создания фрагмента XML и последующего

расширения результирующего XML. Каждый фрагмент XML имеет столбец

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

имени атрибута.

В следующем примере осуществляется подключение под пользователем

store и выбираются значения customer_id, dob и phone для покупателей

№1 и №2:

□ CONNECT store/store_password

SELECT XMLELEMENT(

“customer” ,

XMLCOLATTVAL(

customer_id AS “ id ” ,

dob AS “dob” ,

phone AS “phone”

) ' ‘

) AS xml_customers

FROM customers

WHERE customer_id IN (1, 2);

XML CUSTOMERS

<customer>

ccolumn name

<column name

<column name

</customer>

<customer>

ccolumn name

ccolumn name

ccolumn name

c/customer>

“id ”>1c/column>

“dob”>1965-01-01c/column>

“phone”>800-555-121lc/column>

“ id ”>2c/column>

“dob”>1968-02-05c/column>

“phone”>800-555-1212c/column>

XMLCONCAT()

XMLCONCAT ( ) используется для соединения последовательности элементов в

каждой строке. Следующий пример соединяет элементы XML значений

first_name, last_name и phone для покупателей №1 и №2:

□ SELECT XMLCONCAT(

XMLELEMENT( « f i r s t name», first_name),

XMLELEMENT(«last name», last_name),

XMLELEMENT(«phone», phone),

) AS xml_customers

FROM customers

WHERE customer_id IN (1, 2);

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

XML_CUSTOMERS

< firs t name>John</first name>

<last name>Brown</last name>

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

< fir s t name>Cyntia</first name>

<last name>Green</last name>

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

XMLPARSE()

XMLPARSE() используется для разбора и создания XML из вычисляемого результата

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

выражение преобразуется в пустое значение, то ХМLPARSE( ) возвращает

также пустое значение. Необходимо указать один из следующих параметров

перед выражением:

■ CONTENT, этот параметр означает, что выражение должно возвращать

корректное значение XML;

■ DOCUMENT, этот параметр означает, что выражение должно возвращать

XML документ с одним корневым узлом.

Можно также добавлять WELLFORMED после выражения, означающее гарантию

того, что Ваше выражение преобразуется в хорошо сформированный

XML документ. Это также означает, что база данных не будет проводить

проверку правильности вашего выражения.

Следующий пример разбирает выражение, содержащее сведения о покупателе:

□ SELECT XMLPARSE(

CONTENT

'<customer><customer_id>1</customer_id><name>John Brown</name></

customers

WELLFORMED