Вам нужно немного изучить использование Oracle XMLTYPE, но здесь есть быстрая функция из пакета, над которым я сейчас работаю, который показывает использование .existsnode для проверки того, что узел существует, и .extract для извлечения информация
FUNCTION parse_order_by_xml (p_xml_document IN XMLTYPE) RETURN varchar2
IS
/*** xml document structure *** start
<?xml version="1.0"?>
<OrderByClause>
<OrderBy>
<ColumnName>ELECTOR_ID</ColumnName>
<Order>Asc</Order>
</OrderBy>
<OrderBy>
<ColumnName>CREATED_TS</ColumnName>
<Order>Desc</Order>
</OrderBy>
</OrderByClause>
*** xml document structure *** end ***/
l_order_by_string varchar2(3000) := 'ORDER BY ';
l_index number;
BEGIN
l_index := 1;
WHILE (p_xml_document.existsnode('/OrderByClause/OrderBy[' || to_char(l_index) || ']') = 1) LOOP
l_order_by_string := l_order_by_string
|| p_xml_document.extract('/OrderByClause/OrderBy[' || to_char(l_index) || ']/ColumnName/text()').getStringVal()
|| ' '
|| p_xml_document.extract('/OrderByClause/OrderBy[' || to_char(l_index) || ']/Order/text()').getStringVal()
|| ',';
l_index := l_index + 1;
END LOOP;
l_order_by_string := REGEXP_REPLACE(l_order_by_string, ',$');
RETURN l_order_by_string;
END parse_order_by_xml;