powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
25 сообщений из 239, страница 4 из 10
XML в Oracle9i. Примеры разборки
    #34188095
for93t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно увидеть результат
Код: plaintext
select * from v$version
?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188096
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for93tМожно увидеть результат
Код: plaintext
select * from v$version
?
Конечно:

Код: plaintext
1.
2.
3.
4.
5.
6.
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 1 . 0  - Production
PL/SQL Release  9 . 2 . 0 . 1 . 0  - Production
CORE	 9 . 2 . 0 . 1 . 0 	Production
TNS for  32 -bit Windows: Version  9 . 2 . 0 . 1 . 0  - Production
NLSRTL Version  9 . 2 . 0 . 1 . 0  - Production

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188101
for93t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем я тоже сижу репу чешу, ничего не понимаю. Ваш пример у меня вообще обрывает сессию, хотя синтаксис правильный. Я и сам сейчас сижу, пытаюсь решить подобную задачку, но как-то ничего не получается. Вот мои баннеры:
Код: plaintext
1.
2.
3.
4.
5.
6.
BANNER
----------------------------------------------------------------
Personal Oracle9i Release  9 . 2 . 0 . 5 . 0  - Production
PL/SQL Release  9 . 2 . 0 . 5 . 0  - Production
CORE     9 . 2 . 0 . 6 . 0        Production
TNS for  32 -bit Windows: Version  9 . 2 . 0 . 5 . 0  - Production
NLSRTL Version  9 . 2 . 0 . 5 . 0  - Production
Оракл домашний. На работе с 7 патчсетом. Все подобное отрабатывает на раз. Да и на 9.2.0.2 тоже все отлично работало. Ниччего не понимаю!!!
Будем ждать более опытных товарищей...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188114
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И на моей работе такой как Вас Оракл стоит. Проблем никаких!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188116
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всмысли 7.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34514701
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появился ещё вопрос.
Есть XML, который использует несколько пространств имён.
Код: plaintext
1.
2.
3.
4.
5.
6.
<n1:MyResp xmlns:n1="http://testws/ns1">
 <n1:Result>OK</n1:Result>
 <n2:TestNode xmlns:n2="http://testws/ns2">
   <n2:SubResult>OK2</n2:SubResult>
 </n2:TestNode>
</n1:Resp>

Как его разбирать extract'ом? Указывая только имена элементов MyResp, Result, TestNode, SubResult, либо каждый элемент нужно писать вместе с пространством имён: n1:MyResp/n2:TestNode/n2:SubResult' ?

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34515673
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
alp@uni>; edit
Wrote file afiedt.buf

   1   with t as (
   2       select xmltype('<xmldoc xmlns:n1="http://testws/ns1" xmlns:n2="http://testws/ns2">
  3       <n1:Result>OK</n1:Result>
  4       <n2:TestNode>
  5         <n2:SubResult>OK2</n2:SubResult>
  6       </n2:TestNode>
  7      </xmldoc>') x from dual)
   8 * select extract(x,'//Result/text()', 'xmlns="http://testws/ns1"').getstringval() r from t
alp@uni>; /

R
----------------------------------------------------------------------------------------------------
OK
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516422
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А откуда появился таг "<xmldoc xmlns:n1="http://testws/ns1" xmlns:n2="http://testws/ns2">"?

Я вот так вот пробую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
    select
    xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
         <n1:Result>OK</n1:Result>
         <n2:TestNode xmlns:n2="http://testws/ns2">
           <n2:SubResult>OK2</n2:SubResult>
         </n2:TestNode>
        </n1:MyResp>
') x
    from dual
)
select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns2"') data from t;
Ничего не возвращает. Если указывать namespace ns1 - так же ничего не происходит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516468
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если попробывать запустить такой запрос пару раз, вылетает:
Код: plaintext
1.
ORA- 03118 : two-task coroutine has invalid state

Описание:
Cause: This is an internal error message not usually issued.
Action: Contact Oracle Support Services.

:(
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516512
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> with t as (
   2       select
   3       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4           <n1:Result>OK</n1:Result>
  5           <n2:TestNode xmlns:n2="http://testws/ns2">
  6             <n2:SubResult>OK2</n2:SubResult>
  7           </n2:TestNode>
  8          </n1:MyResp>
  9  ') x
  10       from dual
  11   )
  12   select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns2"') data from t;

DATA                                                                            
--------------------------------------------------------------------------------
                                                                                

SQL> ed
Wrote file afiedt.buf

   1   with t as (
   2       select
   3       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4           <n1:Result>OK</n1:Result>
  5           <n2:TestNode xmlns:n2="http://testws/ns2">
  6             <n2:SubResult>OK2</n2:SubResult>
  7           </n2:TestNode>
  8          </n1:MyResp>
  9  ') x
  10       from dual
  11   )
  12 * select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns1"') data from t
SQL> /*
DOC>izmenil namespace v extract()
DOC>*/
SQL> /
ERROR:
ORA- 31011 : XML parsing failed 

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516514
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyЕсли попробывать запустить такой запрос пару раз, вылетает:
Код: plaintext
1.
ORA- 03118 : two-task coroutine has invalid state

Описание:
Cause: This is an internal error message not usually issued.
Action: Contact Oracle Support Services.

:(

Ошибка появляется только в туле, с которым я работал. В Sql*Plus её нет!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516636
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky
Я вот так вот пробую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
    select
    xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
         <n1:Result>OK</n1:Result>
         <n2:TestNode xmlns:n2="http://testws/ns2">
           <n2:SubResult>OK2</n2:SubResult>
         </n2:TestNode>
        </n1:MyResp>
') x
    from dual
)
select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns2"') data from t;
Ничего не возвращает. Если указывать namespace ns1 - так же ничего не происходит.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
alp@uni>; edit
Wrote file afiedt.buf

   1   with t as (
   2       select
   3       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4           <n1:Result>OK</n1:Result>
  5           <n2:TestNode xmlns:n2="http://testws/ns2">
  6             <n2:SubResult>OK2</n2:SubResult>
  7           </n2:TestNode>
  8          </n1:MyResp>
  9  ') x
  10       from dual
  11   )
  12 * select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns1"').getstringval() data from t
alp@uni>; /

DATA
----------------------------------------------------------------------------------------------------
OK

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516727
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!

Возвращая результат как текст, он, наконец, появляется и у меня.

А как вернуть значение элемента SubResult? Пробую так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> /* seichas hotim poluchitj SubResult*/
SQL> ed
Wrote file afiedt.buf

   1     with t as (
   2         select
   3         xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4             <n1:Result>OK</n1:Result>
  5             <n2:TestNode xmlns:n2="http://testws/ns2">
  6               <n2:SubResult>OK2</n2:SubResult>
  7             </n2:TestNode>
  8            </n1:MyResp>
  9    ') x
  10         from dual
  11     )
  12 * select extract(x,'MyResp//TestNode/SubResult/text()','xmlns="http://testws/ns1"').getstringval() data from t
SQL> /

DATA
--------------------------------------------------------------------------------


Результата нет и с 'xmlns="http://testws/ns2.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516788
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас 2 разных пространства, имхо либо вложеным extract'ом, либо так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
alp@uni>; edit
Wrote file afiedt.buf

   1   with t as (
   2           select
   3           xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4               <n1:Result>OK</n1:Result>
  5               <n2:TestNode xmlns:n2="http://testws/ns2">
  6                 <n2:SubResult>OK2</n2:SubResult>
  7               </n2:TestNode>
  8              </n1:MyResp>
  9      ') x
  10           from dual
  11       )
  12 * select extract(x,'//TestNode/SubResult/text()','xmlns="http://testws/ns2"').getstringval() data from t
alp@uni>; /

DATA
----------------------------------------------------------------------------------------------------
OK2
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34517016
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо! Идея понятна!
А если задачу усложнить тем, что мы не знаем конкретного адреса namespace, однако известно, что они разные.
Начал реализовывать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
declare
    d1  varchar2( 10 );
    d2  varchar2( 10 );
    xml      xmltype;
    sub_xml  xmltype;
    my_namespace1  varchar2( 300 );
    my_namespace2  varchar2( 300 );
    function get_namespace(p_xml  in xmltype)
    return varchar2
    is
    begin
        return('xmlns="'||
            p_xml.transform(
                xmltype(
            '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              <xsl:template match="/*">
                <xsl:value-of select="namespace-uri(.)"/>
              </xsl:template>
            </xsl:stylesheet>'
                )
              ).getStringVal()||'"'
        );
    end get_namespace;
begin

    xml :=       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
           <n1:Result>OK</n1:Result>
           <n2:TestNode xmlns:n2="http://testws/ns2">
             <n2:SubResult>OK2</n2:SubResult>
           </n2:TestNode>
          </n1:MyResp>
  ');

    my_namespace1 := get_namespace(xml);
    dbms_output.put_line('my_namespace1 = '||my_namespace1);

    -- zdesj chto-to ne tak...
    sub_xml := xml.extract('MyResp',my_namespace1);
--    dbms_output.put_line(sub_xml.getStringVal());
    --/

    my_namespace2 := get_namespace(sub_xml);
    dbms_output.put_line('my_namespace2 = '||my_namespace2);

 with t as (
      select xml
 x
      from dual
  )
select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns1"').getstringval() data1
      ,extract(x,'//TestNode/SubResult/text()','xmlns="http://testws/ns2"').getstringval()  data2
into d1, d2
from t;

dbms_output.put_line('without additional namespace function');
dbms_output.put_line('d1 = '||d1);
dbms_output.put_line('d2 = '||d2);

dbms_output.put_line('with additional namespace function');

d1:= null; d2:= null;

 with t as (
      select
            xml x
      from dual
  )
select extract(x,'MyResp//Result/text()',my_namespace1).getstringval() data1
      ,extract(x,'//TestNode/SubResult/text()',my_namespace2).getstringval()  data2
into d1, d2
from t;

dbms_output.put_line('d1 = '||d1);
dbms_output.put_line('d2 = '||d2);

end;
/


my_namespace1 = xmlns="http://testws/ns1"
my_namespace2 = xmlns="http://testws/ns1"
without additional namespace function
d1 = OK
d2 = OK2
with additional namespace function
d1 = OK
d2 =

PL/SQL procedure successfully completed.

SQL> 


Как мне вытянуть внутренний namespace ns2?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34567695
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> select
   2        x.extract('v4:MyResp/CarList/@v3:servicename').getStringVal() as service_name
   3       ,x.extract('v4:MyResp/CarList/v2:Car/v2:Mark/text()').getStringVal() as car_mark
   4   from
   5       table(
   6           XMLSequence(
   7               xmltype('
  8                  <v4:MyResp xmlns="http://testserver/v1"
  9                             xmlns:v2="http://testserver/v2"
 10                             xmlns:v3="http://testserver/v3"
 11                             xmlns:v4="http://testserver/v4" >
 12                      <CarList v3:servicename="Auvtoservis 123">
 13                          <v2:Car>
 14                              <v2:Mark>AUDI</v2:Mark>
 15                          </v2:Car>
 16                      </CarList>
 17                  </v4:MyResp>
 18              ').extract('v4:MyResp','
 19                                              xmlns="http://testserver/v1"
 20                                              xmlns:v2="http://testserver/v2"
 21                                              xmlns:v3="http://testserver/v3"
 22                                              xmlns:v4="http://testserver/v4"')
  23           )
  24       ) x;

SERVICE_NAME
--------------------------------------------------------------------------------
CAR_MARK
--------------------------------------------------------------------------------




SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 6 . 0  - Production
PL/SQL Release  9 . 2 . 0 . 6 . 0  - Production
CORE     9 . 2 . 0 . 6 . 0        Production
TNS for Linux: Version  9 . 2 . 0 . 6 . 0  - Production
NLSRTL Version  9 . 2 . 0 . 6 . 0  - Production

Что тут не так?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34567836
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 7 . 0  - Production

SQL> 
select
      x.extract('v4:MyResp/CarList/@v3:servicename','xmlns="http://testserver/v1" xmlns:v4="http://testserver/v4" xmlns:v3="http://testserver/v3"').getStringVal() as service_name
     ,x.extract('v4:MyResp/CarList/v2:Car/v2:Mark/text()','xmlns="http://testserver/v1" xmlns:v2="http://testserver/v2" xmlns:v4="http://testserver/v4"').getStringVal() as car_mark
 from
     table(
         XMLSequence(
             xmltype('
                 <v4:MyResp xmlns="http://testserver/v1"
                            xmlns:v2="http://testserver/v2"
                            xmlns:v3="http://testserver/v3"
                            xmlns:v4="http://testserver/v4" >
                     <CarList v3:servicename="Auvtoservis 123">
                         <v2:Car>
                             <v2:Mark>AUDI</v2:Mark>
                         </v2:Car>
                     </CarList>
                 </v4:MyResp>
             ').extract('v4:MyResp','xmlns:v4="http://testserver/v4"')
         )
     ) x;

SERVICE_NAME                                                                     CAR_MARK
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Auvtoservis  123                                                                   AUDI
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34567965
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот пример, мне видится, более наглядным для демонстрации механизма пространства имен.
Ты можешь сам алиасить URI пространства имен, как тебе заблагорасудится. И пофик алиасы, которые расставлены в тексте XML
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
elect
      x.extract('foo1:MyResp/foo2:CarList/@foo3:servicename','xmlns:foo2="http://testserver/v1"
                                                              xmlns:foo1="http://testserver/v4"
                                                              xmlns:foo3="http://testserver/v3"').getStringVal() as service_name
     ,x.extract('bar1:MyResp/bar2:CarList/bar3:Car/bar3:Mark/text()','xmlns:bar2="http://testserver/v1"
                                                                      xmlns:bar3="http://testserver/v2"
                                                                      xmlns:bar1="http://testserver/v4"').getStringVal() as car_mark
 from
     table(
         XMLSequence(
             xmltype('
                 <v4:MyResp xmlns="http://testserver/v1"
                            xmlns:v2="http://testserver/v2"
                            xmlns:v3="http://testserver/v3"
                            xmlns:v4="http://testserver/v4" >
                     <CarList v3:servicename="Auvtoservis 123">
                         <v2:Car>
                             <v2:Mark>AUDI</v2:Mark>
                         </v2:Car>
                     </CarList>
                 </v4:MyResp>
             ').extract('MyResp','xmlns="http://testserver/v4"')
         )
     ) x;

SERVICE_NAME                                                                     CAR_MARK
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Auvtoservis  123                                                                   AUDI
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34571764
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновили базу до 9.2.0.7.0 - заработал!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34575443
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zloxa, спасибо про объяснения с алиасами - это как раз то, что надо. Разработчики веб-сервиса утверждают, что будут меняться только имена алиасов. Поэтому, пока могу ограничиться определением своих алиасов.

Теперь вопрос. Есть такой XML:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID> 1 </v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID> 2 </v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>

Нужно найти все CarID.

Попытка 1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select
     x.extract('Level_1:Resp/Level_2:List/Level_3:Item/Level_3:CarID/text()','xmlns:Level_1="http://testserver/v1"
                                                                 xmlns:Level_2="http://testserver/v2"
                                                                 xmlns:Level_3="http://testserver/v3"') as car_id
from
    table(
        XMLSequence(
            xmltype('
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID>1</v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID>2</v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>
            ')
        )
    ) x

CAR_ID
--------------------------------------------------------------------------------
 12 


Удаётся найти значения, но они все выстраиваются в одну строку.

Попытка 2:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
select
     x.getStringVal()
from
    table(
        XMLSequence(
            xmltype('
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID>1</v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID>2</v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>
            ').extract('Level_1:Resp/Level_2:List/Level_3:Item','xmlns:Level_1="http://testserver/v1"
                                                                 xmlns:Level_2="http://testserver/v2"
                                                                 xmlns:Level_3="http://testserver/v3"')
        )
    ) x

X.GETSTRINGVAL()
--------------------------------------------------------------------------------
<v3:Item>
  <v3:CarID> 1 </v3:CarID>
</v3:Item>

<v3:Item>
  <v3:CarID> 2 </v3:CarID>
</v3:Item>

-- теперь пробуем вытянуть значения CarID

select
     x.extract('Level_3:Item/Level_3:CarID/text()','xmlns:Level_3="http://testserver/v3"') as car_id
from
    table(
        XMLSequence(
            xmltype('
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID>1</v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID>2</v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>
            ').extract('Level_1:Resp/Level_2:List/Level_3:Item','xmlns:Level_1="http://testserver/v1"
                                                                 xmlns:Level_2="http://testserver/v2"
                                                                 xmlns:Level_3="http://testserver/v3"')
        )
    ) x

ERROR:
ORA- 31011 : XML parsing failed
ORA- 19202 : Error occurred in XML processing
LPX- 00234 : namespace prefix "v3" is not declared
Error at line  1 
ORA- 06512 : at "SYS.XMLTYPE", line  0 
ORA- 06512 : at line  1 



no rows selected

Как обойти эту ошибку, чтобы вытащить нужные значения:
1
2

?

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34575775
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему метод Extract, в отличии от фунции Extract не спускает в извлеченный фрагмент разименование алиасов - не знаю, может быть баг, может фича, но так - работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
select
     extractValue(value(x),'Level_3:CarID','xmlns:Level_3="http://testserver/v3"') as car_id
from
    table(
        XMLSequence(
            extract(xmltype(' <v1:Resp
                                      xmlns:v1="http://testserver/v1"
                                      xmlns="http://testserver/v2"
                                      xmlns:v3="http://testserver/v3">
                                <List>
                                  <v3:Item>
                                    <v3:CarID>1</v3:CarID>
                                  </v3:Item>
                                  <v3:Item>
                                    <v3:CarID>2</v3:CarID>
                                  </v3:Item>
                                </List>
                              </v1:Resp>'
                             )
                     ,'Level_1:Resp/Level_2:List/Level_3:Item/Level_3:CarID'
                     ,'xmlns:Level_1="http://testserver/v1"
                       xmlns:Level_2="http://testserver/v2"
                       xmlns:Level_3="http://testserver/v3"'
            )
        )
    ) x;

CAR_ID
--------------------------------------------------------------------------------
 1 
 2 

SQL> 

PS. Хотел бы заодно акцентировать на том, что для меня, в свое время, оказавшись не очевидным, крайне больно стукнуло по голове:
Extract возвращает XML-фрагмент. ExtractValue возвращает значение, со всеми вытекающими:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> 
select
  extractValue(value(t),'tag') extractValue
  ,t.Extract('tag/text()').getStringVal() Extract
from
  table(xmlSequence(XMLType('<tag>'||chr( 38 )||'lt;Hello'||chr( 38 )||'gt;</tag>'))) t;

EXTRACTVALUE                                                                     EXTRACT
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
<Hello>                                                                          & lt;Hello& gt;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34771478
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
В документации есть такая штука:
имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  <EMPLOYEES>
                     <EMP>
                        <EMPNO> 112 </EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                        <SALARY> 50000 </SALARY>
                      </EMP>
                     <EMP>
                        <EMPNO> 217 </EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SALARY> 60000 </SALARY>
                     </EMP>
                     <EMP> 
                        <EMPNO> 412 </EMPNO> 
                        <EMPNAME>Jack</EMPNAME>
                        <SALARY> 40000 </SALARY>
                     </EMP>
                    </EMPLOYEES>
с помощью
Код: plaintext
1.
2.
3.
SELECT SYS_XMLAGG(value(e), xmlformat('EMPLOYEES'))
   into xml_res
   FROM TABLE(XMLSequence(Extract(xml_str, '/EMPLOYEES/EMP'))) e
   WHERE EXTRACTVALUE(value(e), '/EMP/SALARY') >=  50000 
выбираются те блоки EMP, в которых salary >=5000

А как аналогичным способом обновить данные? Например, установить <SALARY>100000</SALARY> для тех, где salary >= 5000 ????
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34771611
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALDВ документации есть такая штука:
имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  <EMPLOYEES>
                     <EMP>
                        <EMPNO> 112 </EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                        <SALARY> 50000 </SALARY>
                      </EMP>
                     <EMP>
                        <EMPNO> 217 </EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SALARY> 60000 </SALARY>
                     </EMP>
                     <EMP> 
                        <EMPNO> 412 </EMPNO> 
                        <EMPNAME>Jack</EMPNAME>
                        <SALARY> 40000 </SALARY>
                     </EMP>
                    </EMPLOYEES>
с помощью
Код: plaintext
1.
2.
3.
SELECT SYS_XMLAGG(value(e), xmlformat('EMPLOYEES'))
   into xml_res
   FROM TABLE(XMLSequence(Extract(xml_str, '/EMPLOYEES/EMP'))) e
   WHERE EXTRACTVALUE(value(e), '/EMP/SALARY') >=  50000 
выбираются те блоки EMP, в которых salary >=5000

А как аналогичным способом обновить данные? Например, установить <SALARY>100000</SALARY> для тех, где salary >= 5000 ????

Аналогичным имхо никак. Но если Вам не страшны альтернативные пути, то вот так можно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> WITH t AS (
   2   SELECT XMLTYPE('<EMPLOYEES>
  3   <EMP>
  4      <EMPNO>112</EMPNO>
  5      <EMPNAME>Joe</EMPNAME>
  6      <SALARY>50000</SALARY>
  7    </EMP>
  8   <EMP>
  9      <EMPNO>217</EMPNO>
 10      <EMPNAME>Jane</EMPNAME>
 11      <SALARY>60000</SALARY>
 12   </EMP>
 13   <EMP>
 14      <EMPNO>412</EMPNO>
 15      <EMPNAME>Jack</EMPNAME>
 16      <SALARY>40000</SALARY>
 17   </EMP>
 18  </EMPLOYEES>') x
  19   FROM dual)
  20   SELECT x,updatexml(x,'//SALARY[text()>50000]/text()', 100000 ).extract('/') y
  21   FROM t
  22   /

X                                        Y
---------------------------------------- ----------------------------------------
<EMPLOYEES>                              <EMPLOYEES>
 <EMP>                                     <EMP>
    <EMPNO> 112 </EMPNO>                       <EMPNO> 112 </EMPNO>
    <EMPNAME>Joe</EMPNAME>                   <EMPNAME>Joe</EMPNAME>
    <SALARY> 50000 </SALARY>                   <SALARY> 50000 </SALARY>
  </EMP>                                   </EMP>
 <EMP>                                     <EMP>
    <EMPNO> 217 </EMPNO>                       <EMPNO> 217 </EMPNO>
    <EMPNAME>Jane</EMPNAME>                  <EMPNAME>Jane</EMPNAME>
    <SALARY> 60000 </SALARY>                   <SALARY> 100000 </SALARY>
 </EMP>                                    </EMP>
 <EMP>                                     <EMP>
    <EMPNO> 412 </EMPNO>                       <EMPNO> 412 </EMPNO>
    <EMPNAME>Jack</EMPNAME>                  <EMPNAME>Jack</EMPNAME>
    <SALARY> 40000 </SALARY>                   <SALARY> 40000 </SALARY>
 </EMP>                                    </EMP>
</EMPLOYEES>                             </EMPLOYEES>

Best regards

Maxim
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34777546
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
Спасибо.

а подскажите пож-та еще такую штуку:

имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  xml_str := XMLType('<EMPLOYEES>
                     <EMP>
                        <EMPNO>112</EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                        <SALARY>50000</SALARY>
                      </EMP>
                     <EMP>
                        <EMPNO>217</EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SAL>
                             <SALARY>60000</SALARY>
                        </SAL>
                     </EMP>
                    </EMPLOYEES>');
когда пишу
Код: plaintext
1.
str_id := xml_str.extract('//SALARY/text()').getStringVal();
  dbms_output.put_line(str_id);
получаю просто 50006000.
хочется распарсить нормально, по-одному числу, но
Код: plaintext
1.
2.
3.
4.
5.
6.
	  select d.extract('/').getStringVal() as "temp_table"
		bulk collect into cur_clob
		from table(XMLSequence(xml_str.extract('//SALARY'))) d;
        
    for i in cur_clob.first..cur_clob.count loop
        dbms_output.put_line(cur_clob(i).cl);
    end loop;
дает
<SALARY>50000</SALARY>
<SALARY>60000</SALARY>
а не
50000
60000
Когда применяю .../text() - ругается.
Как получить значения внутри <SALARY>?
(в будущем хочется таким образом выдирать ID и по ним получать еще некий блок xml-я. сразу все что надо в реальной задаче, в одном запросе выводить не получается)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34777624
jenyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALDКак получить значения внутри <SALARY>?

EXTRACTVALUE(d.column_value, '/SALARY')
...
Рейтинг: 0 / 0
25 сообщений из 239, страница 4 из 10
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]