Знатокам XML DB

Да ну
Дата: 17.09.2015 17:47:19
Приветствую!

Наконец руки дошли до XML DB, пытаюсь освоить,есть вопрос.

Вот такой запрос
+

with qx as (
select * from xmltable('
  for $i in //* return <x
    pnode="{$i/../name()}"
    pocc= "{$i/../@occ}"
    node= "{$i/name()}"
    occ=  "{$i/@occ}"
    val=  "{$i/text()}"
  ></x>'
passing xmltype('
  <myxml>
      <n100>txt</n100>
      <n200><![CDATA[bin1]]></n200>
      <n300>txt0</n300>
      <n400><![CDATA[bin2]]></n400>
      <n500 occ="1">
        <n600>
          <n700>txt1</n700>
        </n600>
      </n500>
      <n500 occ="2">
        <n600>
          <n700 occ="1">txt2</n700>
          <n700 occ="2">txt3</n700>
        </n600>
      </n500>
  </myxml>
')
columns
  parent_node varchar2(100)  path './@pnode',
  parent_occ  number(10)     path './@pocc',
  line        for ordinality,
  node        varchar2(100)  path './@node',
  occ         number(10)     path './@occ',
  val         varchar2(2000) path './@val'
))
--select * from qx
,qp as (
  select (
     select max(line)
      from qx q2
     where q2.node=qx.parent_node
       and q2.line<qx.line
    ) parent_line,
    qx.*
  from qx
)
--select * from qp
,qc as (
  select
    level lvl,
    substr(sys_connect_by_path(node,'.'),2) nodepath,
    qp.*
  from qp
  start with node='myxml'
  connect by prior line = parent_line
  order siblings by line
)
select * from qc

возвращает результат

LVLNODEPATHPARENT_LINEPARENT_NODEPARENT_OCCLINENODEOCCVAL
1myxml1myxml
2myxml.n1001myxml2n100txt
2myxml.n2001myxml3n200bin1
2myxml.n3001myxml4n300txt0
2myxml.n4001myxml5n400bin2
2myxml.n5001myxml6n5001
3myxml.n500.n6006n50017n600
4myxml.n500.n600.n7007n6008n700txt1
2myxml.n5001myxml9n5002
3myxml.n500.n6009n500210n600
4myxml.n500.n600.n70010n60011n7001txt2
4myxml.n500.n600.n70010n60012n7002txt3

Подзапросы qp и qc в нем - демонстрация того, что мне нужно получить в первых 3х колонках.

Чую, что эти 3 колонки можно сформировать сразу в XMLTABLE() без лишних подзапросов, но не могу найти удобоваримую доку.
Буду признателен за советы и тынцы.

Oracle 11.2.x.x
ArtNick
Дата: 17.09.2015 18:44:32
eev
Дата: 17.09.2015 22:06:55
Да ну,
оно?
SQL> select * from xmltable('
  2  declare namespace functx = "http://www.functx.com";
  3  declare function functx:path-to-node
  4    ( $nodes as node()* )  as xs:string* {
  5  
  6  $nodes/string-join(ancestor-or-self::*/name(.), ''/'')
  7   };
  8  
  9    for $i in //* return <x
 10      pnode="{functx:path-to-node($i)}"
 11      pocc= "{$i/../@occ}"
 12      node= "{$i/name()}"
 13      occ=  "{$i/@occ}"
 14      val=  "{$i/text()}"
 15    ></x>'
 16  passing xmltype('
 17    <myxml>
 18        <n100>txt</n100>
 19        <n200><![CDATA[bin1]]></n200>
 20        <n300>txt0</n300>
 21        <n400><![CDATA[bin2]]></n400>
 22        <n500 occ="1">
 23          <n600>
 24            <n700>txt1</n700>
 25          </n600>
 26        </n500>
 27        <n500 occ="2">
 28          <n600>
 29            <n700 occ="1">txt2</n700>
 30            <n700 occ="2">txt3</n700>
 31          </n600>
 32        </n500>
 33    </myxml>
 34  ')
 35  columns
 36    parent_node varchar2(100)  path './@pnode'
 37  )
 38  ;
PARENT_NODE
--------------------------------------------------------------------------------
myxml
myxml/n100
myxml/n200
myxml/n300
myxml/n400
myxml/n500
myxml/n500/n600
myxml/n500/n600/n700
myxml/n500
myxml/n500/n600
myxml/n500/n600/n700
myxml/n500/n600/n700
12 rows selected

+ зы
я не фига не знаток ), первая ссылка https://www.google.ru/search?q=xquery get full path node&oq=xquery get full path node&aqs=chrome..69i57.1176j0j9&sourceid=chrome&es_sm=122&ie=UTF-8
Да ну
Дата: 18.09.2015 01:25:12
ArtNick, eev, спасибо.

С конкатенацией пути теперь понятно.

А как бы сформировать колонку PARENT_LINE - "... for ordinality" родительской ноды?

Просится "{$i/../position()}", но position() выдает всегда 1.