Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача параметров в extractvalue / 12 сообщений из 12, страница 1 из 1
24.04.2018, 10:37
    #39635167
admontes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
Всем добрый день.

Есть проблема с которой бьюсь, но не могу разобраться. Решил попросить помощь здесь. Есть такой запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select j.url, extractvalue( k.x, j.url ) v1, extractvalue( k.x, '/h[1]/r[1]/ogrn[1]/text()[1]' ) v2
from (  select
                xmltype(
                        '<h>
                             <r>
                               <inn>111111111</inn>
                               <ogrn>0000000000</ogrn>
                             </r>
                           </h>'     
                        ) x
         from dual ) k,
     xmltable( '/'
               PASSING xmltype( '<a><b>/h[1]/r[1]/ogrn[1]/text()[1]</b></a>' )
               COLUMNS  
                      url VARCHAR2(250) PATH '//b' ) j



В поле v1 должно вывестись значение ogrn из xml-файла, путь до которого получен через разбор другой xml, в поле v2 выводится вызов extractvalue, в которое вторым параметром передано значение константой и это поле инициализируется в отличие от v1.
В первом варианте выводится пустое значение, хотя url определился правильно, о чем свидетельствует вывод поля j.url

Подскажите, в чем проблема?
...
Рейтинг: 0 / 0
24.04.2018, 11:06
    #39635188
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
admontes,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> col url format a30
SQL> col v1 format a10
SQL> col v2 format a10
SQL> /

URL                            V1         V2
------------------------------ ---------- ----------
/h[1]/r[1]/ogrn[1]/text()[1]   0000000000 0000000000


....
stax
...
Рейтинг: 0 / 0
24.04.2018, 11:20
    #39635210
admontes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
Stax,

Не работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> col url format a30;
SQL> col v1 format a10;
SQL> col v2 format a10;
SQL> select j.url, extractvalue( k.x, j.url ) v1, extractvalue( k.x, '/h[1]/r[1]/ogrn[1]/text()[1]' ) v2
  2  from (  select
  3                  xmltype(
  4                          '<h>
  5                               <r>
  6                                 <inn>111111111</inn>
  7                                 <ogrn>0000000000</ogrn>
  8                               </r>
  9                             </h>'
10                          ) x
11           from dual ) k,
12       xmltable( '/'
13                 PASSING xmltype( '<a><b>/h[1]/r[1]/ogrn[1]/text()[1]</b></a>' )
14                 COLUMNS
15                        url VARCHAR2(250) PATH '//b' ) j
16  /

URL                            V1         V2
------------------------------ ---------- ----------
/h[1]/r[1]/ogrn[1]/text()[1]              0000000000
...
Рейтинг: 0 / 0
24.04.2018, 11:24
    #39635214
admontes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
admontes,
Чтобы развеять проблемы с отображением сделал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select j.url, case when extractvalue( k.x, j.url ) is null then 'null' else 'not null' end v1, extractvalue( k.x, '/h[1]/r[1]/ogrn[1]/text()[1]' ) v2
from (  select
                xmltype(
                        '<h>
                             <r>
                               <inn>111111111</inn>
                               <ogrn>0000000000</ogrn>
                             </r>
                           </h>'     
                        ) x
         from dual ) k,
     xmltable( '/'
               PASSING xmltype( '<a><b>/h[1]/r[1]/ogrn[1]/text()[1]</b></a>' )
               COLUMNS  
                      url VARCHAR2(250) PATH '//b' ) j



В результате v1=null :(
...
Рейтинг: 0 / 0
24.04.2018, 11:25
    #39635217
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
admontes,

Проверил на livesql.oracle.com - работает
Там 12с помоему
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select j.url, extractvalue( k.x, j.url ) v1, extractvalue( k.x, '/h[1]/r[1]/ogrn[1]/text()[1]' ) v2
from (  select
                xmltype(
                        '<h>
                             <r>
                               <inn>111111111</inn>
                               <ogrn>0000000000</ogrn>
                             </r>
                           </h>'     
                        ) x
         from dual ) k,
     xmltable( '/'
               PASSING xmltype( '<a><b>/h[1]/r[1]/ogrn[1]/text()[1]</b></a>' )
               COLUMNS url VARCHAR2(250) PATH '//b' ) j

URL	V1	V2
/h[1]/r[1]/ogrn[1]/text()[1]	0000000000	0000000000


а почему text()[1] - как бы подразумевая что будет больше одного?
...
Рейтинг: 0 / 0
24.04.2018, 11:49
    #39635237
admontes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
MaximaXXL,

Этот запрос выжимка из другого, там используются результаты из xmldiff. Это он такие пути рисует.

Чувствую, что у меня проблема с кодировкой....
...
Рейтинг: 0 / 0
24.04.2018, 14:29
    #39635437
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
admontes,

у меня на 11.2.0.4 заработал "правильно" с хинтом
FORCE_XML_QUERY_REWRITE
Код: plsql
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.
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL> col url format a30
SQL> col v1 format a10
SQL> col v2 format a10
SQL>
SQL> SELECT j.url
  2        ,extractvalue(k.x, j.url) v1
  3        ,extractvalue(k.x, '/h[1]/r[1]/ogrn[1]/text()[1]') v2
  4  FROM   (SELECT     xmltype('<h>
  5                               <r>
  6                                 <inn>111111111</inn>
  7                                 <ogrn>0000000000</ogrn>
  8                               </r>
  9                             </h>') x
 10          FROM   dual) k
 11        ,xmltable('/' passing
 12                  xmltype('<a><b>/h[1]/r[1]/ogrn[1]/text()[1]</b></a>')
 13                  columns url VARCHAR2(250) path '//b') j;

URL                            V1         V2
------------------------------ ---------- ----------
/h[1]/r[1]/ogrn[1]/text()[1]              0000000000


Execution Plan
----------------------------------------------------------
Plan hash value: 4223128547

-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      | 16360 | 32720 |    24   (0)| 00:00:01 |
|   1 |  XMLTABLE EVALUATION |      |       |       |            |          |
-----------------------------------------------------------------------------

Note
-----
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)

SQL>
SQL> SELECT /*+ FORCE_XML_QUERY_REWRITE */ j.url
  2        ,extractvalue(k.x, j.url) v1
  3        ,extractvalue(k.x, '/h[1]/r[1]/ogrn[1]/text()[1]') v2
  4  FROM   (SELECT     xmltype('<h>
  5                               <r>
  6                                 <inn>111111111</inn>
  7                                 <ogrn>0000000000</ogrn>
  8                               </r>
  9                             </h>') x
 10          FROM   dual) k
 11        ,xmltable('/' passing
 12                  xmltype('<a><b>/h[1]/r[1]/ogrn[1]/text()[1]</b></a>')
 13                  columns url VARCHAR2(250) path '//b') j;

URL                            V1         V2
------------------------------ ---------- ----------
/h[1]/r[1]/ogrn[1]/text()[1]   0000000000 0000000000


Execution Plan
----------------------------------------------------------
Plan hash value: 4083502163

-----------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                       | 16360 | 32720 |    24   (0)| 00:00:01 |
|   1 |  COLLECTION ITERATOR PICKLER FETCH| XQSEQUENCEFROMXMLTYPE | 16360 | 32720 |    24   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------

Note
-----
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)

...
Рейтинг: 0 / 0
24.04.2018, 14:38
    #39635444
admontes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
Maxim Demenko,
Спасибо за совет. Завтра на работе попробую и отпишусь. У меня 12c.
...
Рейтинг: 0 / 0
25.04.2018, 01:33
    #39635726
admontes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
Maxim Demenko,
Еще раз спасибо, все работает!
...
Рейтинг: 0 / 0
25.04.2018, 14:55
    #39636072
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
admontesMaxim Demenko,
Еще раз спасибо, все работает!

А ничего что EXTRACVALUE deprecated еще в 11G?

SY.
...
Рейтинг: 0 / 0
26.04.2018, 12:49
    #39636710
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
SYadmontesMaxim Demenko,
Еще раз спасибо, все работает!

А ничего что EXTRACVALUE deprecated еще в 11G?

SY.
Да бесполезно. Дед мой их юзал, отец, и дети мой будут.
...
Рейтинг: 0 / 0
27.04.2018, 08:33
    #39637118
admontes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в extractvalue
SY,
Это да. Привычка. ) Перепишем на более кошерный вариант )
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача параметров в extractvalue / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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