powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с xmltype
24 сообщений из 24, страница 1 из 1
Проблема с xmltype
    #39367382
Pavel_Kudlay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запрос :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> with a as (select '<a><b>1</b><b>2</b></a>' xml from dual)
  2  select y.* from a, xmltable( '/a'
  3                        passing xmltype(a.xml)
  4                        columns
  5                        b xmltype path 'b') x,
  6                   xmltable('b'
  7                        passing x.b
  8                        columns
  9                        c xmltype path '/')(+) y
 10  ;

C
--------------------------------------------------------------------------------
<b>1</b>
<b>2</b>


возвращет две записи, как и ожидалось.
Но если вставить xml во временную таблицу и из нее выбирать данные -
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> create table tmp_xml as select xmltype('<a><b>1</b><b>2</b></a>') xml from dual;

Table created.

SQL> select y.* from tmp_xml a, xmltable( '/a'
  2                        passing a.xml
  3                        columns
  4                        b xmltype path 'b') x,
  5                   xmltable('b'
  6                        passing x.b
  7                        columns
  8                        c xmltype path '/')(+) y
  9  ;

C
--------------------------------------------------------------------------------


на выходе null.
Что не так с запросом?
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367388
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_Kudlay,

с запросом все нормально. что с версией бд?
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367389
Pavel_Kudlay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
K790,
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367396
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У этих запросов разные планы.
Код: 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.
select * from v$version;

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

with a as (select '<a><b>1</b><b>2</b></a>' xml from dual)
select y.* from a, xmltable( '/a'
                      passing xmltype(a.xml)
                      columns
                      b xmltype path 'b') x,
                 xmltable('b'
                      passing x.b
                      columns
                      c xmltype path '/')(+) y
;

C
------------------------------------------------------------------------------------------------------------------
<b>1</b>
<b>2</b>

План выполнения
----------------------------------------------------------
Plan hash value: 2113805404

------------------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |   267M|  1531M|   615K  (1)| 00:01:19 |
|   1 |  NESTED LOOPS OUTER   |      |   267M|  1531M|   615K  (1)| 00:01:19 |
|   2 |   XMLTABLE EVALUATION |      |       |       |            |          |
|   3 |   XMLTABLE EVALUATION |      |       |       |            |          |
------------------------------------------------------------------------------


select y.* from tmp_xml a, xmltable( '/a'
                          passing a.xml
                          columns
                          b xmltype path 'b') x,
                     xmltable('b'
                          passing x.b
                          columns
                          c xmltype path '/')(+) y
    ;

C
------------------------------------------------------------------------------------------------------------------



План выполнения
----------------------------------------------------------
Plan hash value: 2718754734

-------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |   267M|   499G|   615K  (1)| 00:01:19 |
|   1 |  NESTED LOOPS OUTER |         |   267M|   499G|   615K  (1)| 00:01:19 |
|   2 |   NESTED LOOPS      |         | 16360 |    31M|    42   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| TMP_XML |     1 |  2002 |     3   (0)| 00:00:01 |
|   4 |    XPATH EVALUATION |         |       |       |            |          |
|   5 |   XPATH EVALUATION  |         |       |       |            |          |
-------------------------------------------------------------------------------


Попытка поиграться хинтами обернулась неудачей.
Код: 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.
select /*+ NO_QUERY_TRANSFORMATION */ y.* from tmp_xml a, xmltable( '/a'
                          passing a.xml
                          columns
                          b xmltype path 'b') x,
                     xmltable('b'
                          passing x.b
                          columns
                          c xmltype path '/')(+) y
    ;
ERROR:
ORA-00600: код внутренней ошибки, аргументы: [qmxtixGetCSXPayload:1], [], [], [], [], [], [], [], [], [], [], []



строки не выбраны

Затрач.время: 00:00:02.48

План выполнения
----------------------------------------------------------
Plan hash value: 115835590

----------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                        |   267M|   515G|   639K  (1)| 00:01:22 |
|   1 |  NESTED LOOPS OUTER                   |                        |   267M|   515G|   639K  (1)| 00:01:22 |
|   2 |   NESTED LOOPS                        |                        | 16360 |    31M|    42   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL                  | TMP_XML                |     1 |  2002 |     3   (0)| 00:00:01 |
|   4 |    VIEW                               |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   5 |     VIEW                              |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   6 |      COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
|   7 |   VIEW                                |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   8 |    VIEW                               |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   9 |     COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367406
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый запрос с этим хинтом отрабатывает
Код: 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.
with a as (
select '<a><b>1</b><b>2</b></a>' xml from dual union all
select '<a><b>3</b><b>4</b></a>' xml from dual
           )
select /*+ NO_QUERY_TRANSFORMATION */ y.* from a, xmltable( '/a'
                      passing xmltype(a.xml)
                      columns
                      b xmltype path 'b') x,
                 xmltable('b'
                      passing x.b
                      columns
                      c xmltype path '/')(+) y;

C
----------------------------------------------------------------------------------------------------------------
<b>1</b>
<b>2</b>
<b>3</b>
<b>4</b>

Затрач.время: 00:00:00.11

План выполнения
----------------------------------------------------------
Plan hash value: 1820545903

---------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                       |   535M|    46G|  1279K  (1)| 00:02:44 |
|   1 |  NESTED LOOPS OUTER                   |                       |   535M|    46G|  1279K  (1)| 00:02:44 |
|   2 |   NESTED LOOPS                        |                       | 32720 |  1885K|    82   (0)| 00:00:01 |
|   3 |    VIEW                               |                       |     2 |    50 |     4   (0)| 00:00:01 |
|   4 |     UNION-ALL                         |                       |       |       |            |       |
|   5 |      FAST DUAL                        |                       |     1 |       |     2   (0)| 00:00:01 |
|   6 |      FAST DUAL                        |                       |     1 |       |     2   (0)| 00:00:01 |
|   7 |    VIEW                               |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|   8 |     VIEW                              |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|   9 |      COLLECTION ITERATOR PICKLER FETCH| XQSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
|  10 |   VIEW                                |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|  11 |    VIEW                               |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|  12 |     COLLECTION ITERATOR PICKLER FETCH | XQSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367414
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_Kudlay,

Для решения твоей задачи достаточно одного xmltable. Перепиши запрос соответствующим образом.
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367417
Pavel_Kudlay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

В том то и проблема что я не знаю как его переписать.
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367432
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_KudlayВ том то и проблема что я не знаю как его переписать.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select x.*
from tmp_xml a,
xmltable( '/a/b'
passing a.xml
columns
b xmltype path '.'
) x;

B
----------------------
<b>1</b>
<b>2</b>
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367442
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

а предикат по первому запросу можете показать? что-то у меня не сходится.
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367444
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K790,

вернее по второму, с таблицей.
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367451
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K790,

Код: 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.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
set autotrace on

with a as (select '<a><b>1</b><b>2</b></a>' xml from dual)
select y.* from a, xmltable( '/a'
                      passing xmltype(a.xml)
                      columns
                      b xmltype path 'b') x,
                 xmltable('b'
                      passing x.b
                      columns
                      c xmltype path '/')(+) y
;

C
--------------------------------------------------------------------------------------------------------------------------------------
<b>1</b>
<b>2</b>

Затрач.время: 00:00:00.06

План выполнения
----------------------------------------------------------
Plan hash value: 2113805404

------------------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |   267M|  1531M|   615K  (1)| 00:01:19 |
|   1 |  NESTED LOOPS OUTER   |      |   267M|  1531M|   615K  (1)| 00:01:19 |
|   2 |   XMLTABLE EVALUATION |      |       |       |            |          |
|   3 |   XMLTABLE EVALUATION |      |       |       |            |          |
------------------------------------------------------------------------------

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)


Статистика
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
       1445  bytes sent via SQL*Net to client
        892  bytes received via SQL*Net from client
          7  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed


with a as (
select '<a><b>1</b><b>2</b></a>' xml from dual
           )
select /*+ NO_QUERY_TRANSFORMATION */ y.* from a, xmltable( '/a'
                      passing xmltype(a.xml)
                      columns
                      b xmltype path 'b') x,
                 xmltable('b'
                      passing x.b
                      columns
                      c xmltype path '/')(+) y;

C
--------------------------------------------------------------------------------------------------------------------------------------
<b>1</b>
<b>2</b>

Затрач.время: 00:00:00.06

План выполнения
----------------------------------------------------------
Plan hash value: 2234799508

---------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                       |   267M|    23G|   639K  (1)| 00:01:22 |
|   1 |  NESTED LOOPS OUTER                   |                       |   267M|    23G|   639K  (1)| 00:01:22 |
|   2 |   NESTED LOOPS                        |                       | 16360 |   942K|    41   (0)| 00:00:01 |
|   3 |    VIEW                               |                       |     1 |    25 |     2   (0)| 00:00:01 |
|   4 |     FAST DUAL                         |                       |     1 |       |     2   (0)| 00:00:01 |
|   5 |    VIEW                               |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|   6 |     VIEW                              |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|   7 |      COLLECTION ITERATOR PICKLER FETCH| XQSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
|   8 |   VIEW                                |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|   9 |    VIEW                               |                       | 16360 |   543K|    39   (0)| 00:00:01 |
|  10 |     COLLECTION ITERATOR PICKLER FETCH | XQSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)


Статистика
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
       1445  bytes sent via SQL*Net to client
        892  bytes received via SQL*Net from client
          7  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed


select y.* from tmp_xml a, xmltable( '/a'
                          passing a.xml
                          columns
                          b xmltype path 'b') x,
                     xmltable('b'
                          passing x.b
                          columns
                          c xmltype path '/')(+) y
    ;

C
--------------------------------------------------------------------------------------------------------------------------------------


Затрач.время: 00:00:00.37

План выполнения
----------------------------------------------------------
Plan hash value: 2718754734

-------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |   267M|   499G|   615K  (1)| 00:01:19 |
|   1 |  NESTED LOOPS OUTER |         |   267M|   499G|   615K  (1)| 00:01:19 |
|   2 |   NESTED LOOPS      |         | 16360 |    31M|    42   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| TMP_XML |     1 |  2002 |     3   (0)| 00:00:01 |
|   4 |    XPATH EVALUATION |         |       |       |            |          |
|   5 |   XPATH EVALUATION  |         |       |       |            |          |
-------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)
   - automatic DOP: Computed Degree of Parallelism is 1
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)


Статистика
----------------------------------------------------------
         10  recursive calls
          0  db block gets
        735  consistent gets
          0  physical reads
          0  redo size
        831  bytes sent via SQL*Net to client
        421  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


select /*+ NO_QUERY_TRANSFORMATION */ y.* from tmp_xml a, xmltable( '/a'
                          passing a.xml
                          columns
                          b xmltype path 'b') x,
                     xmltable('b'
                          passing x.b
                          columns
                          c xmltype path '/')(+) y
    ;
ERROR:
ORA-00600: код внутренней ошибки, аргументы: [qmxtixGetCSXPayload:1], [], [], [], [], [], [], [], [], [], [], []



строки не выбраны

Затрач.время: 00:00:02.12

План выполнения
----------------------------------------------------------
Plan hash value: 115835590

----------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                        |   267M|   515G|   639K  (1)| 00:01:22 |
|   1 |  NESTED LOOPS OUTER                   |                        |   267M|   515G|   639K  (1)| 00:01:22 |
|   2 |   NESTED LOOPS                        |                        | 16360 |    31M|    42   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL                  | TMP_XML                |     1 |  2002 |     3   (0)| 00:00:01 |
|   4 |    VIEW                               |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   5 |     VIEW                              |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   6 |      COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
|   7 |   VIEW                                |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   8 |    VIEW                               |                        | 16360 |   543K|    39   (0)| 00:00:01 |
|   9 |     COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | 16360 |       |    39   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)
   - automatic DOP: Computed Degree of Parallelism is 1
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)


Статистика
----------------------------------------------------------
         28  recursive calls
          4  db block gets
       1220  consistent gets
          0  physical reads
          0  redo size
        835  bytes sent via SQL*Net to client
        421  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367467
Pavel_Kudlay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

Я упростил пример. Что делать если необходимо еще дополнительные данные выбирать - вот так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
drop table tmp_xml;

create table tmp_xml as select xmltype('<a><b>1</b><b>2</b><c>3</c></a>') xml from dual;

select x.c, y.* from tmp_xml a, xmltable( '/a'
                      passing a.xml
                      columns
                      b xmltype path 'b',
                      c number path 'c') x,
                 xmltable('/b'
                      passing x.b
                      columns
                      d xmltype path '/')(+) y;


в результате должно получится две записи
3 <b>1</b>
3 <b>2</b>
также как в случае
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with a as (select xmltype('<a><b>1</b><b>2</b><c>3</c></a>') xml from dual)
select x.c, y.d from a, xmltable( '/a'
                      passing a.xml
                      columns 
                      b xmltype path 'b',
                      c number path 'c') x,
                 xmltable('b'
                      passing x.b
                      columns
                      d xmltype path '/')(+) y
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367468
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

11 под рукой нет, в 12 похоже уже на явное преобразование

Код: 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.
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3985185243
-------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |    82 |  6150 |    35   (0)| 00:00:01 |
|   1 |  NESTED LOOPS OUTER |         |    82 |  6150 |    35   (0)| 00:00:01 |
|   2 |   NESTED LOOPS      |         |     1 |    41 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL| TMP_XML |     1 |    41 |     4   (0)| 00:00:01 |
|   4 |    FAST DUAL        |         |     1 |       |     2   (0)| 00:00:01 |
|   5 |   VIEW              |         |  8168 |   271K|    29   (0)| 00:00:01 |
|   6 |    XPATH EVALUATION |         |       |       |            |          |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter(EXISTSNODE(SYS_MAKEXML(0,"A"."SYS_NC00002$"),'/a')=1)
Note
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more in
 
22 rows selected
 
SQL> 

...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367482
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_Kudlayв результате должно получится две записи
3 <b>1</b>
3 <b>2</b>
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with s as
(select xmltype('<a><b>1</b><b>2</b><c>3</c></a>') x from dual)
select c, b
from s,
xmltable(
'/a/b'
passing s.x
columns
b xmltype path '.',
c number path '/parent/../c'
);

         C B
---------- ------------------------------
         3 <b>1</b>
         3 <b>2</b>
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367486
Pavel_Kudlay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

Похоже что можно сделать вот так -
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select x.c, y.* from tmp_xml a, xmltable( '/a'
                      passing a.xml
                      columns
                      b xmltype path 'b',
                      c number path 'c') x,
                 xmltable('/a/b'
                      passing a.xml
                      columns
                      d xmltype path '/')(+) y


Спасибо за наводку!
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367491
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_KudlayСпасибо за наводку!Не втыкай второй xmltable туда, где можно обойтись одним. Твоя задача решается с помощью xpath. Там где не хватит возможностей xpath, на помощь придет xquery c примерами на форуме .
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367495
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with s as
(select xmltype('<a><b>1</b><b>2</b><c>3</c></a>') x from dual)
select c, b
from s,
xmltable(
'/a/b'
passing s.x
columns
b xmltype path '.',
c number path '/parent/../c'
);

         C B
---------- ------------------------------
         3 <b>1</b>
         3 <b>2</b>


На Oracle 11g Enterprise Edition 11.2.0.2.0 - 64bit запрос возвращает пустую колонку C
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367509
Pavel_Kudlay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,

у меня аналогично
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
drop table tmp_xml;

create table tmp_xml as 
(select xmltype('<a><b>1</b><b>2</b><c>3</c><d>4</d><d>5</d></a>') xml from dual
union all
select xmltype('<a><b>6</b><b>7</b><c>8</c><d>9</d><d>10</d></a>') xml from dual);

select c, b
from tmp_xml a,
xmltable(
'/a/b'
passing a.xml
columns
b xmltype path '.',
c number path '/parent/../c'
);                      


в результате c - пусто
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367515
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadТам где не хватит возможностей xpath, на помощь придет xquery
А вот это дельный совет
Код: 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.
WITH
s AS (
  SELECT
    XMLTYPE( '<a><b>1</b><b>2</b><c>3</c></a>' ) x 
  FROM 
    dual
)
SELECT 
  t.c,
  t.b
FROM
  s,
  XMLTABLE(
    '/e' PASSING ( 
      XMLQuery(
        'for $e in /a/b
        let $e1 := $e/.
        let $e2 := $e/../c
        return ( 
          <e>{$e1}{$e2}</e>
        )'
        PASSING s.x
        RETURNING CONTENT ) )
    COLUMNS
      b XMLTYPE PATH 'b',
      c NUMBER PATH 'c' ) t
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367518
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
Код: 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.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
column b format a30

with s as
(select xmltype('<a><b>1</b><b>2</b><c>3</c><d>4</d><d>5</d></a>') x from dual)
select c, b
from s,
xmltable(
'/a/b'
passing s.x
columns
b xmltype path '.',
c number path '/parent/../c'
);

         C B
---------- ------------------------------
         3 <b>1</b>
         3 <b>2</b>

Затрач.время: 00:00:00.08

План выполнения
----------------------------------------------------------
Plan hash value: 4223128547

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

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold


Статистика
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
       1502  bytes sent via SQL*Net to client
        892  bytes received via SQL*Net from client
          7  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed


drop table tmp_xml;

Таблица удалена.

Затрач.время: 00:00:00.04

create table tmp_xml as
(select xmltype('<a><b>1</b><b>2</b><c>3</c><d>4</d><d>5</d></a>') xml from dual
union all
select xmltype('<a><b>6</b><b>7</b><c>8</c><d>9</d><d>10</d></a>') xml from dual);

Таблица создана.

Затрач.время: 00:00:00.04

select c, b
from tmp_xml a,
xmltable(
'/a/b'
passing a.xml
columns
b xmltype path '.',
c number path '/parent/../c'
);

         C B
---------- ------------------------------
           <b>1</b>
           <b>2</b>
           <b>6</b>
           <b>7</b>

Затрач.время: 00:00:00.07

План выполнения
----------------------------------------------------------
Plan hash value: 401803246

------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         | 32720 |    62M|    79   (0)| 00:00:01 |
|   1 |  NESTED LOOPS      |         | 32720 |    62M|    79   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| TMP_XML |     2 |  4004 |     3   (0)| 00:00:01 |
|   3 |   XPATH EVALUATION |         |       |       |            |          |
------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
   - Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)


Статистика
----------------------------------------------------------
         19  recursive calls
          0  db block gets
        304  consistent gets
          1  physical reads
          0  redo size
       1810  bytes sent via SQL*Net to client
       1171  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed

...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367525
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_Kudlay,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
drop table tmp_xml;

create table tmp_xml as select xmltype('<a><b>1</b><b>2</b><c>3</c></a>') xml_test from dual;

select * from tmp_xml;

select 
  name,
  value
from tmp_xml, 
xmltable('a/*' 
         passing xml_test 
         columns
             name  varchar2(30) path 'name(.)',
             value varchar2(30) path '.'
          );
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367528
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with s as (select xmltype('<a><b>1</b><b>2</b><c>3</c></a>') x from dual)
select c, b
from s,
xmltable
('for $i in /a
    for $j in /$i/b
       return <x>{$i/c}{$j}</x>'
passing s.x
columns
c number  path '/x/c',
b xmltype path '/x/b'
);

         C B
---------- ------------------------------
         3 <b>1</b>
         3 <b>2</b>
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367537
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadРуслан Дамирович,

Код: plsql
1.
2.
3.
'for $i in /a
    for $j in /$i/b
       return <x>{$i/c}{$j}</x>'



Спасибо. Зашорился на предыдущем алгоритме.
В любом случае, смысл в том, что XPATH в моей версии такое не пережевывает, а переформировывать XML "на лету" в нужный формат - для меня это "фи, как некрасиво".
...
Рейтинг: 0 / 0
Проблема с xmltype
    #39367538
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with s as (select xmltype('<a><b>1</b><b>2</b><c>3</c></a>') x from dual)
select c, b
from s,
xmltable
('for $i in /a/b    
    return <x>{$i}{$i/../c}</x>'
passing s.x
columns
c number  path '/x/c',
b xmltype path '/x/b'
);
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с xmltype
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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