Использование SQL для извлечения значений из xml CLOB

В настоящее время я пытаюсь выяснить, как извлечь некоторые значения с помощью plsql из значения xml CLOB, которое хранится в моей базе данных.

Мое значение CLOB выглядит следующим образом:

<map>
  <entry>
    <string>HeaderOne</string>
    <string>
        <linked-hash-map>
            <entry>
                <string>ID</string>
                <string>81</string>
            </entry>
            <entry>
                <string>Name</string>
                <string>John</string>
            </entry>
            <entry>
                <string>SecondName</string>
                <string>Smith</string>
            </entry>
            <entry>
                <string>Age</string>
                <string>15</string>
            </entry>
        </linked-hash-map>
    </string>
  </entry>
  <entry>
    <string>HeaderTwo</string>
    <string>
        <linked-hash-map>
            <entry>
                <string>ID</string>
                <string>81</string>
            </entry>
            <entry>
                <string>ZIP</string>
                <string>99999</string>
            </entry>
            <entry>
                <string>Gender</string>
                <string>M</string>
            </entry>
        </linked-hash-map>
    </string>
  </entry>
</map>

Я пробовал использовать метод EXTRAC (xmltype (myclob), как описано здесь: Извлечь данные из XML Clob с помощью SQL из Oracle Database

Однако в моем случае это не сработает, потому что тег <string> не включает идентификатор, такой как «имя» или «ключ», а вместо этого перечисляет другую запись <string> над фактическим значением. Т.е. <string>ID</string> - это параметр, поскольку обычно используется <string name='ID'>81</string>, где «81» в данном случае - это фактическое значение, которое я хочу извлечь.

Параметры могут быть перечислены в xml в любом порядке, однако я знаю имя из параметра, который хочу извлечь. Итак, мой вопрос: есть ли способ извлечь, например, значение из записи <string>Name</string> (в данном случае «Джон», однако это может быть любое значение)


person SQLNewbie    schedule 31.03.2016    source источник
comment
Таким образом, порядок <string> элементов внутри <entry> будет определять, является ли это именем атрибута или значением?   -  person ruudvan    schedule 31.03.2016
comment
Да, вы правильно предполагаете   -  person SQLNewbie    schedule 01.04.2016


Ответы (1)


Вы можете поискать способы PIVOT вывода, если хотите, но вот начало того, как вы будете читать такой XML -

Для простоты предположим, что XML находится внутри переменной my_xml типа XMLTYPE.

SELECT header_string, attribute_name, attribute_value
  FROM (WITH xm AS (SELECT my_xml AS x FROM DUAL)
        SELECT header_string, linked_hash_map
          FROM xm,
               XMLTABLE (
                  '//map/entry'
                  PASSING xm.x
                  COLUMNS header_string VARCHAR2 (100) PATH 'string[1]',
                          linked_hash_map XMLTYPE PATH 'string[2]/linked-hash-map'))
       l,
       XMLTABLE (
          '//linked-hash-map/entry'
          PASSING l.linked_hash_map
          COLUMNS attribute_name VARCHAR2 (100) PATH 'string[1]',
                  attribute_value VARCHAR2 (100) PATH 'string[2]');

Я должен упомянуть, что по возможности ищите способы улучшить схему XML. Из вопроса кажется, что вы уже знаете, что лучший способ - использовать пару ключ-значение, где имя ключа - это не фактические данные, а свойство элемента (если не само имя элемента).

Кроме того, не используйте EXTRACT или EXTRACTVALUE, эти функции устарели Oracle. Вместо этого используйте XMLTABLE или XMLQUERY.

person ruudvan    schedule 31.03.2016
comment
Спасибо за ответ, проверю позже и доложу о результатах! - person SQLNewbie; 01.04.2016