каждой группы товаров. Обратите внимание, что товары группируются по
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