.NET- India Ответов: 1

Генерировать столбцы столбец таблицы, имеющий XML-строку


В столбце таблицы у меня есть данные, приведенные ниже

& lt;PivotSet>
< item>
&ЛТ;колонка имя = "РНО"и GT;1&ЛТ;/колонки&ГТ;
<имя столбца = "мин(INSGRP)"&ГТ;рекорд - 001&ЛТ;/колонки&ГТ;
< / item>
< item>
<имя столбца = "РНО"и GT;2&ЛТ;/колонки&ГТ;
&ЛТ;колонка имя = "Мин(INSGRP)"&ГТ;рекорд - 002&ЛТ;/колонки&ГТ;
< / item>
< item>
<имя столбца = "РНО"и GT;3&ЛТ;/колонки&ГТ;
&ЛТ;колонка имя = "Мин(INSGRP)"&ГТ;рекорд - 003&ЛТ;/колонки&ГТ;
< / item>
< item>
&ЛТ;колонка имя = "РНО"и GT;4&ЛТ;/колонки&ГТ;
&ЛТ;колонка имя = "Мин(INSGRP)"&ГТ;рекорд - 004&ЛТ;/колонки&ГТ;
< / item>
< item>
<имя столбца = "РНО"и GT;5&ЛТ;/колонки&ГТ;
<имя столбца = "мин(INSGRP)"&ГТ;рекорд - 005&ЛТ;/колонки&ГТ;
< / item>
< item>
<имя столбца = "РНО"и GT;6&ЛТ;/колонки&ГТ;
<имя столбца = "мин(INSGRP)"и GT;запись - 006&ЛТ;/колонки&ГТ;
< / item>
&ЛТ;/PivotSet и GT;"&ГТ;

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

Столбцы могут быть динамическими, то есть могут быть другими 1 или 2 или.....

Результат должен быть показан следующим образом
РНО MIN(INSGRP)
1 запись-001
2 Запись-002
3 запись-003
4 Запись-004
5 запись - 005
6 Запись-006

Что я уже пробовал:

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

Afzaal Ahmad Zeeshan

Вам нужно использовать какой-то Xml-парсер. Есть много доступных.

1 Ответов

Рейтинг:
2

Wendelius

Вы можете использовать XMLTABLE для извлечения значений из XML. Если данные находятся в varchar, сначала измените их в запросе на XMLTYPE.

Рассмотрим следующий пример

Создайте тестовую таблицу

CREATE TABLE XmlTestData (
   TheData varchar2(2000)
);

Добавьте тестовую строку
INSERT INTO XmlTestData (TheData)
VALUES ('<PivotSet>
<item>
<column name = "RNO">1</column>
<column name = "MIN(INSGRP)">Record- 001</column>
</item>	
<item>
<column name = "RNO">2</column>
<column name = "MIN(INSGRP)">Record- 002</column>
</item>
<item>
<column name = "RNO">3</column>
<column name = "MIN(INSGRP)">Record- 003</column>
</item>
<item>
<column name = "RNO">4</column>
<column name = "MIN(INSGRP)">Record- 004</column>
</item>
<item>
<column name = "RNO">5</column>
<column name = "MIN(INSGRP)">Record- 005</column>
</item>
<item>
<column name = "RNO">6</column>
<column name = "MIN(INSGRP)">Record- 006</column>
</item>
</PivotSet>');

COMMIT;

Выполните запрос, который использует следующую логику:

- выберите данные из таблицы
- дополнительный каждый элемент в виде отдельной строки
- извлечение столбцов из одного элемента

SELECT TO_NUMBER(extractvalue(res.RNO, 'text()'))      AS RNO,
       TO_CHAR(extractvalue(res.MIN_INSGRP, 'text()')) AS MIN_INSGRP
FROM XmlTestData xtd,
     XMLTABLE('/PivotSet/item'
              PASSING XMLTYPE(xtd.TheData) 
              COLUMNS XmlItem XMLTYPE PATH 'column' 
              ) items,
     XMLTABLE('/'
              PASSING items.XmlItem 
              COLUMNS 
                 RNO        XMLTYPE PATH 'column[@name="RNO"]/text()',
                 MIN_INSGRP XMLTYPE PATH 'column[@name="MIN(INSGRP)"]/text()'
              ) res;

В результате получается
RNO   MIN_INSGRP
---   ----------
1     Record- 001
2     Record- 002
3     Record- 003
4     Record- 004
5     Record- 005
6     Record- 006


Maciej Los

Хорошо объяснил!
5.

Wendelius

Спасибо!

.NET- India

Спасибо за ваш ответ. но я хочу, чтобы он был в Столбцах, как показано выше.

Wendelius

Ну, вчера ваш выходной пример был другим, таким же, как и в моем ответе...

Если вам нужно иметь данные в отдельных столбцах, то количество столбцов не может быть динамическим. Таким образом, вам в основном нужно решить, сколько столбцов у вас есть в результирующем наборе до вы запускаете запрос. Количество столбцов не может быть разным в разных строках.

Wendelius

Я восстановил исходную версию вопроса.

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