2016-10-20 8 views
1

Я использовал метод EXTRACT для извлечения значений из столбца типа XML в базе данных Oracle 11g.oracle XMLTABLE не работает должным образом

Если моя таблица имеет 10 строк, , как ЭКСТРАКТ используются в выбранном пункте, когда я поставил некоторые условия в XPATH как

'/Items/OperatingSystem/@Version[contains(.,"4.04")]' 

В возвращенных строках, он показывает нуль, если выражение XPATH является не соответствует, но показывает все 10 строк.

Итак, я попытался перейти на XMLTABLE, поскольку нашел, что это последнее (EXTRACT устарел). Как известно, он используется в предложении FROM. Я пробовал несколько базовых запросов и обнаружил, что он возвращает только строки, которые соответствуют выражению XPATH (пропускает нулевые строки, возвращенные в случае EXTRACT)

Одна странная проблема, которую я нашел с использованием XMLTABLE: В моей локальной среде, когда я использую выражение XPATH

'/Items/OperatingSystem/@Version[contains(.,"4.04")]' 

в результате, он выбирает только те строки, имеющие имя, содержащее «Ди» в нем.

Но когда я запускаю тот же запрос на наши условия тестирования

Он выбирает все строки вместо только выбрать имеющее имя, содержащее «Ди». Я не мог найти подсказки, почему это происходит. Я попробовал несколько запросов, устанавливающих условие на другие поля, такие как Age и т. Д., Но результат такой же. Он возвращает все строки.

Вот версий детали - Local Oracle Version -

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 
PL/SQL Release 11.2.0.2.0 - Production 
"CORE 11.2.0.2.0 Production" 
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production 
NLSRTL Version 11.2.0.2.0 - Production 

Тестирование окружающей среды Oracle версии -

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 
PL/SQL Release 11.2.0.3.0 - Production 
"CORE 11.2.0.3.0 Production" 
TNS for HPUX: Version 11.2.0.3.0 - Production 
NLSRTL Version 11.2.0.3.0 - Production 

Существуют ли какие-либо изменения, связанные с XMLTABLE в этих версиях.

Примеры данных

Предположим, у меня есть следующая таблица

NAME | XMLDATA  | CRT_TS 
Ubuntu | UbuntuXMLDATA | 20-OCT-2016 
Windows | WindowsXMLDATA| 20-OCT-2016 

UbuntuXMLDATA

<Items> 
<OperatingSystem Name="Ubuntu 12.04" Version="12.04" /> 
<OperatingSystem Name="Ubuntu 14.04" Version="14.04" /> 
<OperatingSystem Name="Ubuntu 16.04" Version="16.04" /> 
</Items> 

WindowsXMLDATA

<Items> 
<OperatingSystem Name="Windows" Version="8" /> 
<OperatingSystem Name="Windows" Version="7" /> 
</Items> 

В таблице выше xmls присутствует в столбце XMLDATA.

Запрос

select Name,rx.COLUMN_VALUE as XPATH_OUTPUT from Operating_System, XMLTABLE('/Items/OperatingSystem/@Version[contains(.,"4.04")]' PASSING XMLTYPE(XMLDATA)) rx where CRT_TS = 20-OCT-2016; 

Ожидаемый результат

Name | XPATH_OUTPUT 
Ubuntu | 14.04 

Фактический результат

Name | XPATH_OUTPUT 
Ubuntu | 12.04 
Ubuntu | 14.04 
Ubuntu | 16.04 

Вопрос Я facin g - указанный выше запрос работает нормально в моей локальной базе данных. Но против тестовой среды Он возвращает три строки вместо одной. Я не могу понять, почему? Является ли из-за несоответствия версии Oracle (я указал выше)?

+1

Пожалуйста, разместите некоторые данные образца, запрос и неожиданный результат у вас есть – Aleksej

+0

@Aleksej Я предоставил образцы данных. Пожалуйста, посмотрите, можете ли вы помочь –

ответ

0

Для тех, кто сталкивается с подобной проблемой, я могу исправить проблему, изменив выражение XPATH. Обновлено выражение XPATH в

/Items/OperatingSystem[contains(@Version,"4.04")]/@Version 

Вместо использования точка (.) Оператора, чтобы получить значение текущего атрибута, что дает сам @version.

1

Я не уверен, что это ошибка или нет. В xmltable, если вы не используете псевдоним для передачи xml. »«. является корнем XML.

Попробуйте XPath.

'/Items/OperatingSystem/@Version[contains(.,"4.04")]' '/Items/OperatingSystem/@Version[contains(.,"OperatingSystem")]' '/Items/OperatingSystem/@Version[contains(.,"Ubuntu")]'

Результат всегда будет. 3 ряда.

содержит (., "хххх")] Проверьте весь документ содержит строку

Решение 1

Изменение xquery.

'/Items/OperatingSystem[contains(@Version,"14.04")]/@Version'

Раствор 2

Добавить псевдоним для XML. XMLTABLE('$doc/Items/OperatingSystem/@Version[contains(.,"4.04")]' PASSING XMLTYPE(XMLDATA) as "doc")

+0

Большое спасибо за объяснение. –