powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML - вставка с изменениями по условию
20 сообщений из 20, страница 1 из 1
XML - вставка с изменениями по условию
    #39478807
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть два XML и один нужно вставить в другой.
Если узла с таким атрибутом ID нет - то просто добавляем в конец.
Если узел с таким атрибутом ID есть, то имеющиеся нижестоящие узлы нужно "сдвинуть винз" инкрементировав их атрибут ID.
Подскажите пожалуйста, какими хоть функциями это лучше сделать?

сюда нужно вставить:
Код: plsql
1.
xmltyle('<doc><row id="A1">XX</row><row id="A2">YY</row><row id="A3">ZZ</row></doc>');


Вот это:
Код: plsql
1.
xmltyle('<row id="A2">MM</row>');


В результате получаем:
Код: plsql
1.
xmltyle('<doc><row id="A1">XX</row><row id="A2">MM</row><row id="A3">YY</row><row id="A4">ZZ</row></doc>');


В примере показана ситуация, когда элемент с таким ID уже был - там, куда вставляем,
и поэтому все "нижестоящие" узлы увеличили свой ID.

Видимо, эта задача разбивается на три шага
- получить индекс элемента с таким же ID, если он есть
- инкрементировать ID нижестоящих элементов
- вставить выше найденного индекса, или добавить в конец


Думаю так
добавить в конец - appendChildXML
инкрементировать - updateXML
поиск делать спец. запросом.

Или можно как-то обьединить эти три шага.
Может, я просто не знаю пока какой-то специальный метод, который лучше подходит к этой задаче?
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39478822
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В рамках именно этого форума проще будет десериализовать, преобразовать, сериализовать.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39478975
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВ рамках именно этого форума проще будет десериализовать, преобразовать, сериализовать.
Извлечь, Преобразовать, Загрузить
:)
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39478978
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerElicВ рамках именно этого форума проще будет десериализовать, преобразовать, сериализовать.
Извлечь, Преобразовать, Загрузить
:)
Это другая ветка - про ODI, Informatica, SAS DI и иже с ними :)
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39478990
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEинкрементировать - updateXML

Думаю что на этом шаге ты остановишься и определишься:
либо только XMLTABLE, преобразование таблицы средствами sql, обратно в XML
либо написать xquery
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39479003
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEЕсли узел с таким атрибутом ID есть, то имеющиеся нижестоящие узлы нужно "сдвинуть винз" инкрементировав их атрибут ID.
Т.е. ID в Вашем случае идентифицирующим атрибутом не является.
Это просто некая абстрактная нумерация.
Решается просто: НЕ храните такой "ID" в XML.
Просто нумеруйте узлы при парсинге.
К примеру, XMLTable позволяет описать такой атрибут "for ordinality"
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39479049
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы.
Видимо, придется разбирать куда-то - во временную таблицу.
andrey_anonymousНЕ храните такой "ID" в XML
Так это же не я, а Excel :)
Я пытаюсь вставить строки в Sheet.xml файла xlsx,
и при этом нужно сдвинуть все, что есть на листе - вниз при вставке моих строк.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39479487
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEВидимо, придется разбирать куда-то - во временную таблицу.

в смысле GTT?
а чем такая таблица для преобразования плохя?
Код: plsql
1.
2.
3.
4.
5.
select *
 from xmltable ('doc/row'
                passing xmltype('<doc><row id="A1">XX</row><row id="A2">YY</row><row id="A3">ZZ</row></doc>')
                columns id_val varchar2(4000) path '@id'
                      , val    clob           path 'text()')



И все же покури XQUERY
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39480040
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока вот что получилось:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as ( select xmltype('<doc><row id="A1">XX</row><row id="A2">YY</row><row id="A3">ZZ</row></doc>') x from dual)

select xmlelement("doc",xmlagg( tt.rewrited)) from (
select 

(case when (exrow >= 2) then t.exrow+1 else t.exrow end) renumerated,  
(case when (exrow >= 2) then  updatexml (t.xxx,'/row/@id',''|| t.excln||to_char(t.exrow +1)) else t.xxx end) rewrited

from (
select xxx, id_val, rtrim(upper(id_val), '1234567890')excln ,to_number(ltrim(upper(id_val), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))exrow
from xmltable ('/doc/row' passing (select x from t ) columns id_val varchar2(4000) path '@id', xxx xmltype path '.'))t 
union
select 2 renumerated, xmltype('<row id="A2">MM</row>') rewrited from dual
)tt order by tt.renumerated;


Результат:
Код: plsql
1.
2.
<doc><row id="A1">XX</row><row id="A2">MM</row>
<row id="A3">YY</row><row id="A4">ZZ</row></doc>


Здесь "магические" цифры:
2 - это номер ячейки Excel, начиная с которой - вставляем свои строки.
1 - количество вставляемых строк
Все это будет известно заранее.

Если к такому решению серьезных замечаний нет, то попробую все это провернуть на реальной
структуре файла sheet.xml ( а она немного отличается).
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39480043
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, только, что-то я с псевдонимами напутал - у меня там две разных "t" в одном куске кода. Хотя и работает.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39480125
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И похоже, что "order by" в моем коде не работает. Надо думать.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39480128
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перенес сортировку внутрь xmlagg. Теперь сортирует.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39480204
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что дома - работало,
а на работе получил ORA-22950
"невозможно сортировать без методов MAP или ORDER".
Версия на работе 11g Release 11.2.0.3.0 64 bit.
Как обычно - надо думать что с этим делать.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39480221
ывфы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ART-CODE, не вникал, что ты делаешь, но на

Код: plsql
1.
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production



работает.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39480222
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with tx as ( select xmltype('<doc><row id="A1">XX</row><row id="A2">YY</row><row id="A3">ZZ</row></doc>') x from dual)
 
select xmlelement("doc",xmlagg( ttt.rewrited order by ttt.renumerated)) from (
select
(case when (tt.exrow >= 2) then tt.exrow+1 else tt.exrow end) renumerated, 
(case when (tt.exrow >= 2) then  updatexml (tt.xxx,'/row/@id',''|| tt.excln||to_char(tt.exrow +1)) else tt.xxx end) rewrited
from (
select t.xxx,  rtrim(upper(t.id_val), '1234567890')excln ,to_number(ltrim(upper(t.id_val), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))exrow
from xmltable ('/doc/row' passing (select x from tx ) columns id_val varchar2(4000) path '@id', xxx xmltype path '.')t
)tt
union all
select 2 renumerated, xmltype('<row id="A2">MM</row>') rewrited from dual
)ttt;
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39481208
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вот - дошли руки до разбора ячеек из настоящего sheet.xml,
и столкнулся с проблемой - в полученные ячейки зачем-то дописывается "неймспейс" из worksheet.
Как от этого эффекта избавиться?

Извлечение ячеек:
Код: 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.
with tx as ( select xmltype('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<dimension ref="C5:J23"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0">
<selection activeCell="L31" sqref="L31"/>
</sheetView>
</sheetViews>
<sheetFormatPr defaultRowHeight="15"/>
<cols>
<col min="8" max="8" width="15.42578125" customWidth="1"/>
<col min="9" max="9" width="14.7109375" customWidth="1"/>
<col min="10" max="10" width="12.42578125" customWidth="1"/>
</cols>
<sheetData>
<row r="5" spans="3:3">
<c r="C5" t="s"><v>0</v></c>
</row>
<row r="19" spans="8:10">
<c r="H19" t="s"><v>1</v></c><c r="I19" t="s"><v>2</v></c><c r="J19" t="s"><v>3</v></c>
</row>
<row r="20" spans="8:10">
<c r="H20" s="2"><v>111111111</v></c><c r="I20" s="2"><v>2222222</v></c><c r="J20" s="2"><v>3333333</v></c>
</row>
<row r="21" spans="8:10">
<c r="H21" t="s"><v>5</v></c><c r="I21" t="s"><v>9be6r7ub67be657be657</v></c><c r="J21" t="s"><v>10</v></c>
</row>
<row r="22" spans="8:10">
<c r="H22" t="s"><v>4</v></c><c r="I22" t="s"><v>8</v></c><c r="J22" t="s"><v>11</v></c>
</row>
<row r="23" spans="8:10">
<c r="H23" s="1" t="s"><v>6</v></c><c r="I23" s="1" t="s"><v>7</v></c><c r="J23" s="1" t="s"><v>12</v></c>
</row>
<row r="24" spans="8:10"><c r="B24" s="1" t="s"><v>13</v></c><c r="I24" s="1" t="s"><v>14</v></c><c r="J24" s="1" t="s"><v>15</v></c></row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
<pageSetup paperSize="9" orientation="portrait" r:id="rId1"/>
<tableParts count="1">
<tablePart r:id="rId2"/>
</tableParts>
</worksheet>')  x from dual)



select
(case when (tt.exrow >= 20) then tt.exrow+1 else tt.exrow end) renumerated, 
(case when (tt.exrow >= 20) then  updatexml (tt.xxx,'/c/@r',''|| tt.excln||to_char(tt.exrow +1), 'xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"' ) else tt.xxx end) rewrited
from (
select t.xxx,  rtrim(upper(t.id_val), '1234567890')excln ,to_number(ltrim(upper(t.id_val), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))exrow
from xmltable (XMLNamespaces( default 'http://schemas.openxmlformats.org/spreadsheetml/2006/main' ),
                              '/worksheet/sheetData/row/c' passing (select x from tx ) 
                              columns id_val varchar2(100) path '@r', xxx xmltype path '.')t
)tt;


Проблема в том, что получаем:
Код: plsql
1.
2.
<c xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" r="I21" s="2"><v>2222222</v></c>
...


а нужно:
Код: plsql
1.
<c r="I21" s="2"><v>2222222</v></c>


---
(Если из xmltable убрать XMLNamespaces, то вообще не получаю ячейки.)
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39481265
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, конечно можно совсем выкинуть явное указание XMLNamespaces
и написать так:
Код: plsql
1.
'//*:worksheet/*:sheetData/*:row/*:c' passing (select x from tx ) 


Но, к сожалению, и в этом случае Оракл зачем-то дописывает "неймспейс" в каждую полученную ячейчку,
хотя никто не просил его это делать.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39481351
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEхотя никто не просил его это делатьТехподдержку проплатил? - Дискутируй с ней.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39481400
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, готова процедура вставки строк на лист.
Добавляемые строки должны быть предварительно собраны как XML.
Забавно, что проверить эту процедуру не могу - при попытке компиляции получаю "коннекшен лост" или бесконечное ожидание.
Или моя виртуалка с Ораклом накрылась или процедуру-убийцу написал.
Код: 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.
CREATE OR REPLACE PROCEDURE XML2SHEET(inout_SheetXML IN OUT xmltype, in_insertXML xmltype, in_StartRow NUMBER, in_CountRow Number)
AS 
p_TempSheet xmltype;
BEGIN
-----------------------------------------------

select  xmlagg(all_t.final_rows order by all_t.recalculated)  into  p_TempSheet from (
select appendChildXML(row_t.new_row, '/*:row', col_t.new_cols ) final_rows , 
row_t.recalculated 
from
(
select
(case when (ttr.row_number >= in_StartRow) then ttr.row_number+in_CountRow else ttr.row_number end) recalculated, 
(case when (ttr.row_number >= in_StartRow) then  updatexml (ttr.clear_row,'/*:row/@r',to_char(ttr.row_number +in_CountRow) ) else ttr.clear_row end) new_row
from (
select 
    to_number(extract(tr.excel_row,'/*:row/@r')) row_number, 
    deletexml(tr.excel_row,'/*:row/*:c') clear_row
from xmltable ('//*:worksheet/*:sheetData/*:row' passing inout_SheetXML
                             columns 
                                excel_row  xmltype       path '.'
                              )tr) ttr 
union all select (in_StartRow +rownum)-1 recalculated, deletexml(ins_row,'/*:row/*:c') new_row from xmltable ('/*:row' passing in_insertXML columns ins_row xmltype path '.')
                              ) row_t  
left join
(
select 
ttt.recalculated ,
 XMLAGG(ttt.rewrited order by ttt.excln) new_cols
from (
select
tt.excln,
(case when (tt.excelrownum >= in_StartRow) then tt.excelrownum+1 else tt.excelrownum end) recalculated, 
(case when (tt.excelrownum >= in_StartRow) then  updatexml (tt.cel_xml,'/*:c/@r', tt.excln||to_char(tt.excelrownum +in_CountRow) ) else tt.cel_xml end) rewrited
from (
select 
t.cel_xml,  
rtrim(upper(t.cel_row), '1234567890') excln ,
to_number(ltrim(upper(t.cel_row), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')) excelrownum
from xmltable ('//*:worksheet/*:sheetData/*:row/*:c' passing inout_SheetXML
                             columns 
                                cel_row    varchar2(100) path '@r',
                                cel_xml    xmltype       path '.'                            
                              )t
)tt
union all select rtrim(upper(cel_row), '1234567890') excln , (in_StartRow +rownum)-1 recalculated, rewrited from xmltable ('/*:row/*:c' passing in_insertXML columns cel_row varchar2(100) path '@r', rewrited xmltype path '.')
)ttt
group by ttt.recalculated ) col_t 
on
col_t.recalculated=row_t.recalculated
) all_t
;

inout_SheetXML:= deletexml(inout_SheetXML,'/*:sheetData/*:row');
inout_SheetXML:= appendChildXML(inout_SheetXML, '/*:sheetData', p_TempSheet );

-----------------------------------------------
END XML2SHEET;


---
Elic, платной поддержки нет.
...
Рейтинг: 0 / 0
XML - вставка с изменениями по условию
    #39481590
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох, сколько ошибок в процедуре оказалось.
Все переделываю.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML - вставка с изменениями по условию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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