как я могу выбрать атрибут XML из столбца oracle XMLTYPE? - PullRequest
0 голосов
/ 07 августа 2020

Я создаю таблицу в oracle 12 c вот так

CREATE TABLE Test_xml
    (
       xml_data                       SYS.XMLTYPE
    )

и вставляю такие данные XML в столбец xml_data

<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns="http://XXXXX.XXX/schema/1.0" name="ABC">
  <person>
    <name1 value="AAAA" />
    <name2 value="CCCC" />
    <name3 value="XXXX" />
  </person>
  <person>
    <name1 value="11111" />
    <name2 value="22222" />
    <name3 value="33333" />
  </person>
</persons>

, но когда я пытаюсь выбрать данные из таблицы по запросу

SELECT xt.*
FROM   Test_xml x,
       XMLTABLE('/persons/person'
         PASSING x.xml_data
         COLUMNS 
           name1  VARCHAR2(2000) PATH 'name1/@value'
         ) xt;

не исключено из запроса, как я могу выбрать имя1 из таблицы?

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Вы можете предоставить (в данном случае по умолчанию) пространство имен в качестве другого аргумента XMLTable:

SELECT xt.*
FROM   Test_xml x,
       XMLTABLE(
         xmlnamespaces(default 'http://XXXXX.XXX/schema/1.0'),
         '/persons/person'
         PASSING x.xml_data
         COLUMNS 
           name1  VARCHAR2(2000) PATH 'name1/@value'
         ) xt;
| NAME1 |
| :---- |
| AAAA  |
| 11111 |

db <> fiddle , показывающее ваш исходный запрос, @ Sayan's версия с подстановочными знаками (которая по какой-то причине получает нули, даже если она работает с CTE), и эта версия пространства имен по умолчанию.

1 голос
/ 07 августа 2020

Просто замените /persons/person на /*:persons/*:person

SELECT/*+ NO_XML_QUERY_REWRITE */ xt.*
FROM   Test_xml x,
       XMLTABLE('/*:persons/*:person'
         PASSING x.xml_data
         COLUMNS 
           name1  VARCHAR2(2000) PATH '*:name1/@value'
         ) xt;

Полный пример:

with test_xml(xml_data) as (
select xmltype(q'[<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns="http://XXXXX.XXX/schema/1.0" name="ABC">
  <person>
    <name1 value="AAAA" />
    <name2 value="CCCC" />
    <name3 value="XXXX" />
  </person>
  <person>
    <name1 value="11111" />
    <name2 value="22222" />
    <name3 value="33333" />
  </person>
</persons>]'
)
from dual
)
SELECT xt.*
FROM   Test_xml x,
       XMLTABLE('/*:persons/*:person'
         PASSING x.xml_data
         COLUMNS 
           name1  VARCHAR2(2000) PATH '*:name1/@value'
         ) xt;

NAME1
--------------------
AAAA
11111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...