Как отделить значения атрибута от XML с ORACLE - PullRequest
0 голосов
/ 20 сентября 2019

Здесь у меня есть код, который извлекает ставки из XML:

with tbl as
(
    select
        XMLType(
        '<exchange_rates>
            <rate units="1" code="AUD">2.6</rate>
            <rate units="1" code="THB">0.1</rate>
            <rate units="1" code="BRL">0.9</rate>
            <rate units="1" code="BGN">2.2</rate>
            <rate units="1" code="CAD">2.9</rate>
            <rate units="100" code="CLP">0.5</rate>
        </exchange_rates>'
        ) xml
    from
        t_temp
)
select
    extractValue(value(t), 'rate') result
from
    tbl t,
    table(XMLSequence(t.xml.extract('//rate'))) t;

Результат для этого кода:

RESULT
------
2.6
0.9
2.2
2.9
0.5

Все нормально, но я хотел бы также получить атрибутзначения и получить результат, как это:

Units Code RESULT
----- ---- ------
    1 AUD  2.6
    1 BRL  0.9
    1 BGN  2.2
    1 CAD  2.9
  100 CLP  0.5

Есть ли способ сделать это?

1 Ответ

2 голосов
/ 20 сентября 2019

Oracle-функции XML принимают выражения XPath, поэтому для идентификации атрибутов вы должны использовать синтаксис @ attributetename .Кроме того, вы можете использовать функцию XMLTABLE, чтобы сделать структуру немного проще / понятнее.

with tbl as
(
    select
        XMLType(
        '<exchange_rates>
            <rate units="1" code="AUD">2.6</rate>
            <rate units="1" code="THB">0.1</rate>
            <rate units="1" code="BRL">0.9</rate>
            <rate units="1" code="BGN">2.2</rate>
            <rate units="1" code="CAD">2.9</rate>
            <rate units="100" code="CLP">0.5</rate>
        </exchange_rates>'
        ) xmldata
    from
        dual
)
select units, code, rate
from   tbl,
       xmltable('/exchange_rates/rate' 
                      PASSING tbl.xmldata 
                      COLUMNS rate NUMBER PATH '.', 
                              code VARCHAR2(3) PATH './@code', 
                              units NUMBER PATH './@units');
+-------+------+------+
| UNITS | CODE | RATE |
+-------+------+------+
|     1 | AUD  |  2.6 |
|     1 | THB  |  0.1 |
|     1 | BRL  |  0.9 |
|     1 | BGN  |  2.2 |
|     1 | CAD  |  2.9 |
|   100 | CLP  |  0.5 |
+-------+------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...