2014-07-02 3 views
0

У меня есть таблица Oracle, которая хранит много данных в формате XML в CLOB. Например, он сопоставляет статусные целые числа с персонализированными именами состояний. Вот некоторые упрощенным XML:Создать представление Oracle XML

<metadata> 
    <states> 
     <state status="0" label="New" /> 
     <state status="1" label="Data-Entry" /> 
     <state status="25" label="Approve-Data" /> 
    </states> 
</metadata> 

Я написал запрос в экстракте сказал имя XML из базы данных и определить статус придан статус целое число от 25:

select id As METADATA_ID, EXTRACTVALUE(xmltype(XML_STRING), '/metadata/states/state[@status="25"]/@label') from metadata; 

Результат: 342, "Approve-Data". Все идет нормально. В приведенном выше запросе создается список всех разных меток для этого состояния. То, что я хотел бы сделать, хотя, чтобы создать представление со следующими столбцами:

METADATA_ID | STATUS_NUM | LABEL 
342    0     "New" 
342    1     "Data-Entry" 
342    25    "Approve-Data" 
674    3     "Something-Else" 
674    6     "More-Data" 

Таким образом, я мог смотреть на все различные отображения для различных идентификаторов метаданных и выполнять нормальный Oracle присоединяется. Есть ли способ сделать это, учитывая, что в номерах статуса есть пробелы?

+0

Я не уверен, что это возможно с прямым SQL. Вы можете использовать PL/SQL и перебирать диапазон возможных значений состояния. –

ответ

1

Отличные новости! Я нашел решение с использованием XMLTABLE (пожалуйста, прошу прощения за мою произвольную практику капитализации):

select 
    m.id as metadata_id, x.* 
FROM 
    metadata m, 
    XMLTABLE('/metadata/states/state' 
     PASSING xmltype(m.xml_string) 
     COLUMNS status_id INTEGER PATH '@status', 
       status_label VARCHAR(32) PATH '@label') x; 
0

Вам как-то нужно умножить одну строку на число тегов состояния, которые у нее есть.

первое решения,

Внести изменения в EXTRACTVALUE так, что он будет возвращать @ статус/этикетку; @ статус/этикетку; например 0/New; 1/Data-Entry; 25/Approve-data

существует проблема выбора разделителей /; так что у вас их нет на вашем лейбле.

Тогда convert string to table

второе решение

Create numbers table и присоединиться к нему со своим столом. то вместо того, чтобы использовать state[@status="25"]state[i], где я буду поступать из таблицы чисел

3rd Раствора

после первой ссылке в этом ответе вы можете найти пример с XMLSEQUENCE для извлечения строк

Смежные вопросы