XMLtable с Oracle 11g - PullRequest
       1

XMLtable с Oracle 11g

5 голосов
/ 17 февраля 2012

Вот пример таблицы:

create table xmltemp (mydoc xmltype)

Вот небольшой документ XML для него:

insert into xmltemp values (
xmltype
('<?xml version="1.0"?>
<countries>
  <country>
    <name>Canada</name>
  </country>
  <country>
    <name>US</name>
    <states>
      <state>
        <name>Washington</name>
        <name>Oregon</name>        
      </state>
    </states>
  </country>
</countries>
')
)  

Обратите внимание, что в Канаде нет элемента "штатов", а в США - нет. Я пытаюсь получить эти результаты запроса (порядок и форматирование не важны):

Canada,
US,Washington
US,Oregon

Когда я выполняю это, я вижу и Канаду, и США в результате:

select
countryname
from xmltemp,
xmltable('/countries/country' passing mydoc
   columns countryname varchar2(10) path 'name') 

Когда я делаю это, я получаю оба состояния:

select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
   columns statename   varchar2(20) path '.') c

Я пытался получить и страну, и штат, но, похоже, оракулу не нравится синтаксис '..':

select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
   columns statename   varchar2(20) path '.',
           countryname varchar2(20) path '../../../name') c

Вот ошибка:

ORA-19110: unsupported XQuery expression

Когда я пытаюсь это сделать, я получаю ошибку «multi-item» из-за двух состояний:

select
countryname,
statename
from xmltemp,
xmltable('/countries/country' passing mydoc
   columns countryname varchar2(10) path 'name',
           statename   varchar2(20) path 'states/state/name') c

Вот эта ошибка:

ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton 
sequence - got multi-item sequence

Какой запрос даст мне желаемый результат:

Canada,
US,Washington
US,Oregon

Спасибо

1 Ответ

4 голосов
/ 17 февраля 2012

Попробуйте это:

select      X.COUNTRYNAME, Y.STATENAME
from        XMLTEMP
           ,xmltable('/countries/country'
                     passing MYDOC
                     columns COUNTRYNAME varchar2(20) path './name', 
                             STATES xmltype path './states') X,
            xmltable('/states/state/name' passing X.STATES 
                    columns STATENAME varchar2(20) path '.') (+) Y

Поскольку у вас есть несколько состояний, вы должны присоединиться к другой таблице XML.Поскольку в некоторых странах нет государств, то это должно быть левое внешнее объединение.Я использую старый метод (+), так как я пытаюсь это сделать на 10g, и кажется, что есть проблема с использованием left outer join в 10g, но, видимо, это должно быть хорошо в 11g.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...