Извлечение значений узла в CLOB из XMLType в PL/SQL, а не в таблице

Предполагая, что у меня есть следующие данные XML, назначенные локальной переменной в PL/SQL типа CLOB, то есть:

l_clob := ‘<xml>
  <ticket_order>
    <table_no>1<table_no/>
    <waiter>Jack<waiter/>
    <total_people>12<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>4<table_no/>
    <waiter>Jackie<waiter/>
    <total_people>3<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>2<table_no/>
    <waiter>Sally<waiter/>
    <total_people>2<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>11<table_no/>
    <waiter>Mike<waiter/>
    <total_people>6<total_people/>
  </ticket_order>
</xml>';

Поэтому я не храню этот XML в столбце таблицы, так как хотел бы обрабатывать его только в рамках моей процедуры пакета PL/SQL.

Затем, используя указанную выше переменную l_clob, я выполняю следующее:

retrieve_all_table_no(p_response => SYS.XMLTYPE.CREATEXML(l_clob));

Теперь в моей процедуре:

retrieve_all_table_no(p_response in XMLType)

Как я могу извлечь для каждой строки все значения узлов в пределах <table_no>?

Опять же, это не исходит из таблицы, все делается в PL/SQL на лету.

Я ожидаю, что смогу получить доступ к каждому отдельному значению для обработки, то есть:

1
4
2
11

Я не могу использовать экстракт, так как это объединит все значения.


person tonyf    schedule 14.08.2019    source источник


Ответы (1)


Решил это следующим образом, где я бы изменил это при добавлении к моей процедуре, но это дало результат, который мне был нужен.

l_xmlType   XMLTYPE;

l_xmltype := SYS.XMLTYPE.CREATEXML(l_clob);  -- l_clob value from above

select x.*
from xmltable('xml/ticket_order'
    passing l_xmltype
    columns table_no number path 'table_no'
) x;
person tonyf    schedule 14.08.2019