powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Выковыриваю повторяющуюся группу из XML-поля.
8 сообщений из 8, страница 1 из 1
Выковыриваю повторяющуюся группу из XML-поля.
    #37717603
Имеется файл с 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.
29.
<?xml version="1.0" encoding="Windows-1251"?>
<ФайлДляЗагрузки>
 <ИмяФайла>OUT-006.xml</ИмяФайла>
 <ПачкаИсходящихДокументов>
  <ИСХОДЯЩАЯ_ОПИСЬ>
   <Месяц>2</Месяц>
   <Год>2012</Год>
   <ДатаФормирования>13.02.2012</ДатаФормирования>
  </ИСХОДЯЩАЯ_ОПИСЬ>
  <ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК>
   <ДатаВыплаты>03.02.2012</ДатаВыплаты>
   <СведенияОсуммахПоКБК>
    <НомерФилиала>322223</НомерФилиала>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>12345678901234567890</КодВыплатыПоКБК>
     <Сумма>9291.27</Сумма>
    </СуммаПоКБК>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>09876543211234567890</КодВыплатыПоКБК>
     <Сумма>7310.63</Сумма>
    </СуммаПоКБК>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>12345678900987654321</КодВыплатыПоКБК>
     <Сумма>3590.75</Сумма>
    </СуммаПоКБК>
   </СведенияОсуммахПоКБК>
   <ДатаВыдачиДокумента>13.02.2012</ДатаВыдачиДокумента>
  </ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК>
 </ПачкаИсходящихДокументов>
</ФайлДляЗагрузки>

Повторяющийся тэг - <СуммаПоКБК>, остальные ветки присутствуют по одной штуке на каждое XML-поле.
Надо выгрузить в одну табличку типа:
<Месяц>; <Год>; <ДатаФормирования>; <НомерФилиала>; <КодВыплатыПоКБК>; <Сумма>
Такое сочинил, работает, возвращает столько строк, сколько записей в таблице:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 select p_m.id, x.pay_month, x.pay_year, Date(x.MakeDate) as MakeDate, x.branch
from sed.post_messages p_m,
xmltable('$c/ФайлДляЗагрузки/ПачкаИсходящихДокументов' passing p_m.xml_content as "c"
columns pay_month smallint path 'ИСХОДЯЩАЯ_ОПИСЬ/Месяц',
	pay_year smallint path 'ИСХОДЯЩАЯ_ОПИСЬ/Год',
	makedate char(10) path 'ИСХОДЯЩАЯ_ОПИСЬ/ДатаФормирования',
	branch char(6) path 'ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/НомерФилиала'
) as x


Такое сочинил, выдаёт по строчке на каждую группу <СуммаПоКБК>:
Код: plsql
1.
2.
3.
4.
5.
6.
select p_m.id, x.KBKSum, x.KBKCode
from sed.post_messages p_m,
xmltable('$c/ФайлДляЗагрузки/ПачкаИсходящихДокументов/ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/СуммаПоКБК' passing p_m.xml_content as "c"
columns KBKSum decimal(12,2) path 'Сумма',
	KBKCode char(20) path 'КодВыплатыПоКБК'
) as x


Пытаюсь как-то 2 вышеописаные скрестить.
Спинной мозг подсказывает что-то вроде этого:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select p_m.id, x.pay_month, x.pay_year, Date(x.MakeDate) as MakeDate, x.branch, x.KBKSum, x.KBKCode
from sed.post_messages p_m,
xmltable('$c/ФайлДляЗагрузки/ПачкаИсходящихДокументов' passing p_m.xml_content as "c"
columns pay_month smallint path 'ИСХОДЯЩАЯ_ОПИСЬ/Месяц',
	pay_year smallint path 'ИСХОДЯЩАЯ_ОПИСЬ/Год',
	makedate char(10) path 'ИСХОДЯЩАЯ_ОПИСЬ/ДатаФормирования',
	branch char(6) path 'ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/НомерФилиала',
	KBKSum decimal(12,2) path 'ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/СуммаПоКБК/Сумма',
	KBKCode char(20) path 'ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/СуммаПоКБК/КодВыплатыПоКБК'
) as x


Но оно не работает и кучеряво ругается:
SQL16003N Выражение с типом данных "( item(), item()+ )" нельзя использоватьSQL16003N Выражение с типом данных "( item(), item()+ )" нельзя использовать,
если в контексте ожидается тип данных "CHAR_100". QName ошибки =err:XPTY0004.
SQLSTATE=10507
SQL16003N Выражение с типом данных "( item(), item()+ )" нельзя использовать, если в контексте ожидается тип данных "CHAR_100 ". QName ошибки =err:XPTY0004.
Объяснение:
Выражение XQuery содержит значение с типом "<тип_значения>" в контексте,
в котором предполагается тип "<ожидаемый_тип>".
Выражение XQuery нельзя обработать.

И более того, даже вот такое не работает и так же ругается:
Код: plsql
1.
2.
3.
4.
5.
6.
select p_m.id, x.KBKSum, x.KBKCode
from sed.post_messages p_m,
xmltable('$c/ФайлДляЗагрузки/ПачкаИсходящихДокументов' passing p_m.xml_content as "c"
columns KBKSum decimal(12,2) path 'ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/СуммаПоКБК/Сумма',
	KBKCode char(20) path 'ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/СуммаПоКБК/КодВыплатыПоКБК'
) as x


Т.е. "рубить" надо, видимо, по тегу, в котором повторения начинаются, но как тогда значения из других веток цеплять непонятно.

Поможите люди добрые и далее по тексту!... Особенно эфеективно поможет ссылочка на большой, но внятный текст про то, как обращаться с XML-полями. На IBM нашёл чего-то, но отрывочно и не всегда понятно.
...
Рейтинг: 0 / 0
Выковыриваю повторяющуюся группу из XML-поля.
    #37718134
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честный чайник,

Как-то так
Код: sql
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.
select x.*, y.*
from table(values xmlparse(document '
<ФайлДляЗагрузки>
 <ИмяФайла>OUT-006.xml</ИмяФайла>
 <ПачкаИсходящихДокументов>
  <ИСХОДЯЩАЯ_ОПИСЬ>
   <Месяц>2</Месяц>
   <Год>2012</Год>
   <ДатаФормирования>13.02.2012</ДатаФормирования>
  </ИСХОДЯЩАЯ_ОПИСЬ>
  <ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК>
   <ДатаВыплаты>03.02.2012</ДатаВыплаты>
   <СведенияОсуммахПоКБК>
    <НомерФилиала>322223</НомерФилиала>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>12345678901234567890</КодВыплатыПоКБК>
     <Сумма>9291.27</Сумма>
    </СуммаПоКБК>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>09876543211234567890</КодВыплатыПоКБК>
     <Сумма>7310.63</Сумма>
    </СуммаПоКБК>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>12345678900987654321</КодВыплатыПоКБК>
     <Сумма>3590.75</Сумма>
    </СуммаПоКБК>
   </СведенияОсуммахПоКБК>
   <ДатаВыдачиДокумента>13.02.2012</ДатаВыдачиДокумента>
  </ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК>
 </ПачкаИсходящихДокументов>
</ФайлДляЗагрузки>
')) p_m(xml_content)
, xmltable('$c/ФайлДляЗагрузки/ПачкаИсходящихДокументов' passing p_m.xml_content as "c"
columns pay_month smallint path 'ИСХОДЯЩАЯ_ОПИСЬ/Месяц',
	pay_year smallint path 'ИСХОДЯЩАЯ_ОПИСЬ/Год',
	makedate char(10) path 'ИСХОДЯЩАЯ_ОПИСЬ/ДатаФормирования',
	branch char(6) path 'ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/НомерФилиала'
) as x
, xmltable('$c/ФайлДляЗагрузки/ПачкаИсходящихДокументов/ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/СуммаПоКБК' passing p_m.xml_content as "c"
columns 
	KBKSum decimal(12,2) path 'Сумма',
	KBKCode char(20) path 'КодВыплатыПоКБК'
) as y

...
Рейтинг: 0 / 0
Выковыриваю повторяющуюся группу из XML-поля.
    #37718221
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честный чайник,

А лучше так
Код: sql
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.
select x.*
from table(values xmlparse(document '
<ФайлДляЗагрузки>
 <ИмяФайла>OUT-006.xml</ИмяФайла>
 <ПачкаИсходящихДокументов>
  <ИСХОДЯЩАЯ_ОПИСЬ>
   <Месяц>2</Месяц>
   <Год>2012</Год>
   <ДатаФормирования>13.02.2012</ДатаФормирования>
  </ИСХОДЯЩАЯ_ОПИСЬ>
  <ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК>
   <ДатаВыплаты>03.02.2012</ДатаВыплаты>
   <СведенияОсуммахПоКБК>
    <НомерФилиала>322223</НомерФилиала>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>12345678901234567890</КодВыплатыПоКБК>
     <Сумма>9291.27</Сумма>
    </СуммаПоКБК>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>09876543211234567890</КодВыплатыПоКБК>
     <Сумма>7310.63</Сумма>
    </СуммаПоКБК>
    <СуммаПоКБК>
     <КодВыплатыПоКБК>12345678900987654321</КодВыплатыПоКБК>
     <Сумма>3590.75</Сумма>
    </СуммаПоКБК>
   </СведенияОсуммахПоКБК>
   <ДатаВыдачиДокумента>13.02.2012</ДатаВыдачиДокумента>
  </ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК>
 </ПачкаИсходящихДокументов>
</ФайлДляЗагрузки>
')) p_m(xml_content)
, xmltable('$c/ФайлДляЗагрузки/ПачкаИсходящихДокументов/ЕЖЕДНЕВНЫЙ_ОТЧЕТ_ПО_КБК/СведенияОсуммахПоКБК/СуммаПоКБК' passing p_m.xml_content as "c"
columns 
        pay_month smallint path '../../../ИСХОДЯЩАЯ_ОПИСЬ/Месяц',
	pay_year smallint path '../../../ИСХОДЯЩАЯ_ОПИСЬ/Год',
	makedate char(10) path '../../../ИСХОДЯЩАЯ_ОПИСЬ/ДатаФормирования',
	branch char(6) path '../НомерФилиала',
	KBKSum decimal(12,2) path 'Сумма',
	KBKCode char(20) path 'КодВыплатыПоКБК'
) as x

...
Рейтинг: 0 / 0
Выковыриваю повторяющуюся группу из XML-поля.
    #37718614
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

А точно лучше (в общем случае, с достаточно большими XML'ями)?

Когда мы от текущей ноды вверх идём в XPath могут быть условия, зависящие от контекста. Оно достаточно умное, чтобы в одном случае выдернуть ..\.... один раз, а в другом каждый раз вычислять?
...
Рейтинг: 0 / 0
Выковыриваю повторяющуюся группу из XML-поля.
    #37718635
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CawaSPbА точно лучше (в общем случае, с достаточно большими XML'ями)?

Когда мы от текущей ноды вверх идём в XPath могут быть условия, зависящие от контекста. Оно достаточно умное, чтобы в одном случае выдернуть ..\.... один раз, а в другом каждый раз вычислять?Не знаю, мне негде проверить.
Но подозреваю, что производительнее обрабатывать xml документ 1 раз, чем 2.

Вот Автор темы нам может и подскажет, как оно там лучше...
...
Рейтинг: 0 / 0
Выковыриваю повторяющуюся группу из XML-поля.
    #37718663
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinНе знаю, мне негде проверить.
Но подозреваю, что производительнее обрабатывать xml документ 1 раз, чем 2.
Хм, логично. Число ситуаций, когда можно бросить парсинг, не пропарсив весь документ - ограничено, да и парсер должен быть для этого достаточно умным.

Mark BarinsteinВот Автор темы нам может и подскажет, как оно там лучше...
Да, было бы интересно.
...
Рейтинг: 0 / 0
Выковыриваю повторяющуюся группу из XML-поля.
    #37720768
Большого объёма данных пока нет и продвинутыми методами анализа я не владею.
Поэтому могу предложить только вот такое:

ссылка на изображение, размер: 13.7 кбайт, 792 x 383 точек

Слева один проход, справа 2. 2 совсем чуть-чуть быстрее.
Видимо, откучивать назад по XML неудобно.
...
Рейтинг: 0 / 0
Выковыриваю повторяющуюся группу из XML-поля.
    #37721074
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честный чайник,

По explain'у это всё несколько условно. Но интересно уже то, что, похоже, оно догадалось объеденить два скана XML документа в один.

Но чтобы точнее сказать, надо просто "в лоб" проверить:
а) запихать в табличку XML, где элементов <СуммаПоКБК> будет с пару миллионов;
б) наоборот, обычный небольшой XML с обычным количеством <СуммаПоКБК>, но таких строчек нагенерить с те же пару миллионов.
И на тех, и на других данных попробовать оба варианта запроса. Будет познавательно.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Выковыриваю повторяющуюся группу из XML-поля.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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