PLSQL XMLTable XPath получает все теги самой глубины - PullRequest
0 голосов
/ 05 мая 2018

В PL / SQL есть способ получить все узлы самой глубокой глубины?

Пример 1:

<responseObject>
    <response>
        <value1>A</value1>
        <value2>B</value2>
        <error>A11</error>
    <response>
<responseObject>

Пример 2:

<responseObject>
    <response1>A</response1>
    <response2>B</response2>
    <response4>D</response4>
    <random>1</random>
<responseObject>

В примере 1 я хотел бы получить значение1, значение2 и ошибку. В примере 2 я хотел бы получить response1, response2, response4 и random. В настоящее время мой XPath настроен как '/responseObject/*/*', но во втором случае это не работает.

Пример кода:

DECLARE
  lxml xmltype;
begin
  lxml := 
  xmltype('<responseObject>
              <response>
                  <value1>A</value1>
                  <value2>B</value2>
                  <error>A11</error>
              <response>
           <responseObject>');

  FOR test IN (
    select tag,
           VALUE
    FROM   xmltable('responseObject/*/*'
             passing lxml
             columns
               tag VARCHAR2(128) path 'name()',
               VALUE VARCHAR2(128) path '.'
           ) t
  )
  LOOP
    dbms_output.put_line(test.tag || ' - ' || test.value);
  END LOOP;
end;

1 Ответ

0 голосов
/ 05 мая 2018

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( id, xml ) AS
SELECT 1, '<responseObject>
    <response>
        <value1>A</value1>
        <value2>B</value2>
        <error>A11</error>
    </response>
</responseObject>' FROM DUAL UNION ALL
SELECT 2, '<responseObject>
    <response1>A</response1>
    <response2>B</response2>
    <response4>D</response4>
    <random>1</random>
</responseObject>' FROM DUAL;

Запрос 1 :

SELECT id, x.*
FROM   TABLE_NAME t
       CROSS JOIN
       xmltable(
         '/responseObject//*[last()][not(*)]'
         passing XMLType( t.xml )
         COLUMNS
           tag   VARCHAR2(128) path 'name()',
           value VARCHAR2(128) path '.'
       ) x

Результаты

| ID |    TAG | VALUE |
|----|--------|-------|
|  1 |  error |   A11 |
|  2 | random |     1 |
...