Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 распарс XML одним запросом...  [new]
Sk(A)
Member

Откуда:
Сообщений: 593
Допустим есть XML вида :
<a acode="a1"> 
 <b bcode="b1">
  <c ccode="c1">
  </c>
  <c ccode="c2">
  </c>
 </b>
 <b bcode="b2">
  <c ccode="c3">
  </c>
  <c ccode="c4">
  </c>
 </b>
</a>                                  
Хотелось бы получить результат вида :
ABC
a1 b1 c1
a1 b1 c2
a1 b2 c3
a1 b2 c4

Я пока распарсиваю на отдельные таблички, а потом их джойню, но на
реальной XML-ке невдол..ый запрос получается... Можно как-то иначе ?
4 апр 07, 11:39    [3977852]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Sk(A)

...
Можно как-то иначе ?

Извращение, конечно, но проверить можно, если версия позволяет. В ту же степь и применение xslt-шаблонов

SCOTT@O102>select banner from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SCOTT@O102>select t.column_value.extract('/r/a/text()').getStringVal() a,
  2         t.column_value.extract('/r/b/text()').getStringVal() b,
  3         t.column_value.extract('/r/c/text()').getStringVal() c
  4    from
  5   xmltable('for $i in $x/a,
  6                       $j in $i/b,
  7                       $k in $j/c
  8                   return
  9                   <r>
 10                     <a>{$i/@acode}</a><b>{$j/@bcode}</b><c>{$k/@ccode}</c>
 11                   </r>
 12                   ' passing xmltype ('<a acode="a1">
 13                               <b bcode="b1">
 14                                <c ccode="c1">
 15                                </c>
 16                                <c ccode="c2">
 17                                </c>
 18                               </b>
 19                               <b bcode="b2">
 20                                <c ccode="c3">
 21                                </c>
 22                                <c ccode="c4">
 23                                </c>
 24                               </b>
 25                              </a> ') as "x") t;

A     B     C
----- ----- -----
a1    b1    c1
a1    b1    c2
a1    b2    c3
a1    b2    c4

4 апр 07, 12:32    [3978299]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
Sk(A)
Member

Откуда:
Сообщений: 593
SeaGate

Ух-ты...) Огроменное спасибо !
У меня тоже 10-ка , понял куда кОпать...)
4 апр 07, 12:45    [3978388]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
Ловец Стрекоз
Member

Откуда: Москва
Сообщений: 236
SeaGate

  5   xmltable


Интересное выражение... Но у меня завершается ошибкой такой простой пример...

select  x.text from
  XMLTable('for $i in /D
            return $i' 
  PASSING XMLType('<D text="ПРИВЕТ"></D>') 
  COLUMNS text varchar2(4000) path '/D/@text'    
) x ;

ORA-00933: SQL command not properly ended

Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 - 64bi

Что это может быть?
4 апр 07, 19:59    [3981485]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Ловец Стрекоз

...
Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 - 64bi

Что это может быть?

Судя по документации (New Features Guide для 10.1 и 10.2), поддержка XMLQUERY/XMLTABLE в SQL появилась только во втором релизе.
5 апр 07, 05:59    [3981991]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Ловец Стрекоз

Что это может быть?

Рано отправил...
На 10.2.0.1 пример работает нормально (на 10.1.0.2 ошибка таже, так что дело в релизе):
SCOTT@O102>select banner from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SCOTT@O102>select  x.text from
  2    XMLTable('for $i in /D
  3              return $i'
  4    PASSING XMLType('<D text="ПРИВЕТ"></D>')
  5    COLUMNS text varchar2(4000) path '/D/@text'
  6  ) x ;

TEXT
----------
ПРИВЕТ
5 апр 07, 06:03    [3981993]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

SeaGate wrote:

> На 10.2.0.1 пример работает нормально (на 10.1.0.2 ошибка таже, так что
> дело в релизе):

Тоже не могу понять...

SQL> select * from v$version where rownum = 1;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod

SQL> select  x.text from
   2    XMLTable('for $i in /D
   3               return $i'
   4    PASSING XMLType('<D text="ПРИВЕТ"></D>')
   5    COLUMNS text varchar2(4000) path '/D/@text'
   6  ) x;
   COLUMNS text varchar2(4000) path '/D/@text'
  *
ERROR at line 5:
ORA-01780: string literal required

Posted via ActualForum NNTP Server 1.4

5 апр 07, 11:38    [3983336]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Denis Popov

Тоже не могу понять...

Возможно, дело в установленных компонентах, у меня так (т.е. XML, XDB, как вариант..):

SYS@o102>select comp_id,comp_name from dba_registry order by 1;

COMP_ID  COMP_NAME
-------- ----------------------------------------
AMD      OLAP Catalog
APEX     Oracle Application Express
APS      OLAP Analytic Workspace
CATALOG  Oracle Database Catalog Views
CATJAVA  Oracle Database Java Packages
CATPROC  Oracle Database Packages and Types
CONTEXT  Oracle Text
EM       Oracle Enterprise Manager
EXF      Oracle Expression Filter
JAVAVM   JServer JAVA Virtual Machine
ODM      Oracle Data Mining
ORDIM    Oracle interMedia
OWM      Oracle Workspace Manager
RUL      Oracle Rules Manager
SDO      Spatial
XDB      Oracle XML Database
XML      Oracle XDK
XOQ      Oracle OLAP API

18 rows selected.

5 апр 07, 12:08    [3983649]     Ответить | Цитировать Сообщить модератору
 Re: распарс XML одним запросом...  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

SeaGate wrote:

> Возможно, дело в установленных компонентах

SQL> select comp_id,comp_name from dba_registry order by 1;

COMP_ID                        COMP_NAME
------------------------------ ----------------------------------
AMD                            OLAP Catalog
APS                            OLAP Analytic Workspace
CATALOG                        Oracle Database Catalog Views
CATJAVA                        Oracle Database Java Packages
CATPROC                        Oracle Database Packages and Types
CONTEXT                        Oracle Text
EM                             Oracle Enterprise Manager
EXF                            Oracle Expression Filter
JAVAVM                         JServer JAVA Virtual Machine
ODM                            Oracle Data Mining
ORDIM                          Oracle interMedia
OWM                            Oracle Workspace Manager
RUL                            Oracle Rules Manager
SDO                            Spatial
XDB                            Oracle XML Database
XML                            Oracle XDK
XOQ                            Oracle OLAP API

У меня нет одной строки:
APEX     Oracle Application Express
Но по-моему это к делу не относится? На всякий случай:
SQL> select comp_id, comp_name, status, version
   2  from DBA_REGISTRY
   3  order by comp_id;

COMP_ID    COMP_NAME                                          STATUS     VERSION
---------- -------------------------------------------------- ---------- ----------
AMD        OLAP Catalog                                       VALID      10.2.0.3.0
APS        OLAP Analytic Workspace                            VALID      10.2.0.3.0
CATALOG    Oracle Database Catalog Views                      VALID      10.2.0.3.0
CATJAVA    Oracle Database Java Packages                      VALID      10.2.0.3.0
CATPROC    Oracle Database Packages and Types                 VALID      10.2.0.3.0
CONTEXT    Oracle Text                                        VALID      10.2.0.3.0
EM         Oracle Enterprise Manager                          VALID      10.2.0.3.0
EXF        Oracle Expression Filter                           VALID      10.2.0.3.0
JAVAVM     JServer JAVA Virtual Machine                       VALID      10.2.0.3.0
ODM        Oracle Data Mining                                 VALID      10.2.0.3.0
ORDIM      Oracle interMedia                                  VALID      10.2.0.3.0
OWM        Oracle Workspace Manager                           VALID      10.2.0.1.0
RUL        Oracle Rules Manager                               VALID      10.2.0.3.0
SDO        Spatial                                            VALID      10.2.0.3.0
XDB        Oracle XML Database                                VALID      10.2.0.3.0
XML        Oracle XDK                                         VALID      10.2.0.3.0
XOQ        Oracle OLAP API                                    VALID      10.2.0.3.0

17 rows selected.


Posted via ActualForum NNTP Server 1.4

5 апр 07, 13:47    [3984505]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить