Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML - вставка с изменениями по условию / 20 сообщений из 20, страница 1 из 1
28.06.2017, 09:43
    #39478807
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
У меня есть два 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
28.06.2017, 10:06
    #39478822
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
В рамках именно этого форума проще будет десериализовать, преобразовать, сериализовать.
...
Рейтинг: 0 / 0
28.06.2017, 12:59
    #39478975
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
ElicВ рамках именно этого форума проще будет десериализовать, преобразовать, сериализовать.
Извлечь, Преобразовать, Загрузить
:)
...
Рейтинг: 0 / 0
28.06.2017, 13:02
    #39478978
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
XMLerElicВ рамках именно этого форума проще будет десериализовать, преобразовать, сериализовать.
Извлечь, Преобразовать, Загрузить
:)
Это другая ветка - про ODI, Informatica, SAS DI и иже с ними :)
...
Рейтинг: 0 / 0
28.06.2017, 13:17
    #39478990
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
ART-CODEинкрементировать - updateXML

Думаю что на этом шаге ты остановишься и определишься:
либо только XMLTABLE, преобразование таблицы средствами sql, обратно в XML
либо написать xquery
...
Рейтинг: 0 / 0
28.06.2017, 13:28
    #39479003
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
ART-CODEЕсли узел с таким атрибутом ID есть, то имеющиеся нижестоящие узлы нужно "сдвинуть винз" инкрементировав их атрибут ID.
Т.е. ID в Вашем случае идентифицирующим атрибутом не является.
Это просто некая абстрактная нумерация.
Решается просто: НЕ храните такой "ID" в XML.
Просто нумеруйте узлы при парсинге.
К примеру, XMLTable позволяет описать такой атрибут "for ordinality"
...
Рейтинг: 0 / 0
28.06.2017, 14:08
    #39479049
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Спасибо за ответы.
Видимо, придется разбирать куда-то - во временную таблицу.
andrey_anonymousНЕ храните такой "ID" в XML
Так это же не я, а Excel :)
Я пытаюсь вставить строки в Sheet.xml файла xlsx,
и при этом нужно сдвинуть все, что есть на листе - вниз при вставке моих строк.
...
Рейтинг: 0 / 0
29.06.2017, 09:52
    #39479487
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
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
30.06.2017, 00:05
    #39480040
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Пока вот что получилось:
Код: 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
30.06.2017, 00:11
    #39480043
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Ой, только, что-то я с псевдонимами напутал - у меня там две разных "t" в одном куске кода. Хотя и работает.
...
Рейтинг: 0 / 0
30.06.2017, 09:00
    #39480125
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
И похоже, что "order by" в моем коде не работает. Надо думать.
...
Рейтинг: 0 / 0
30.06.2017, 09:07
    #39480128
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Перенес сортировку внутрь xmlagg. Теперь сортирует.
...
Рейтинг: 0 / 0
30.06.2017, 10:33
    #39480204
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Интересно, что дома - работало,
а на работе получил ORA-22950
"невозможно сортировать без методов MAP или ORDER".
Версия на работе 11g Release 11.2.0.3.0 64 bit.
Как обычно - надо думать что с этим делать.
...
Рейтинг: 0 / 0
30.06.2017, 10:50
    #39480221
ывфы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
ART-CODE, не вникал, что ты делаешь, но на

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



работает.
...
Рейтинг: 0 / 0
30.06.2017, 10:51
    #39480222
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Работает:
Код: 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
02.07.2017, 16:20
    #39481208
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Ну, вот - дошли руки до разбора ячеек из настоящего 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
02.07.2017, 17:38
    #39481265
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Нет, конечно можно совсем выкинуть явное указание XMLNamespaces
и написать так:
Код: plsql
1.
'//*:worksheet/*:sheetData/*:row/*:c' passing (select x from tx ) 


Но, к сожалению, и в этом случае Оракл зачем-то дописывает "неймспейс" в каждую полученную ячейчку,
хотя никто не просил его это делать.
...
Рейтинг: 0 / 0
02.07.2017, 21:03
    #39481351
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
ART-CODEхотя никто не просил его это делатьТехподдержку проплатил? - Дискутируй с ней.
...
Рейтинг: 0 / 0
03.07.2017, 01:04
    #39481400
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Все, готова процедура вставки строк на лист.
Добавляемые строки должны быть предварительно собраны как 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
03.07.2017, 11:50
    #39481590
ART-CODE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML - вставка с изменениями по условию
Ох, сколько ошибок в процедуре оказалось.
Все переделываю.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML - вставка с изменениями по условию / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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