powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML замена значения
11 сообщений из 11, страница 1 из 1
XML замена значения
    #39577450
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаю с xml-кой. Структура:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<ROWSET>
  <ROW>
    <FFIELD1>Name1</FFIELD1>
    <FFIELD2>Value1</FFIELD2>
  </ROW>
  <ROW>
    <FFIELD1>Name2</FFIELD1>
    <FFIELD2>Value2</FFIELD2>
  </ROW>
</ROWSET>


Цель: имея имя (Name1) определить номер ROW, в котором есть FFIELD1 с таким значением, и в этом ROW заменить значение в FFIELD2.

Как это сделать?
...
Рейтинг: 0 / 0
XML замена значения
    #39577459
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как раз о тебе сегодня вспоминал, думал посоветовать тебя на вакансию Позиция SQL-developer г. Москва (Химки) .
...
Рейтинг: 0 / 0
XML замена значения
    #39577460
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужто из питера люди сами не справятся ;-)
...
Рейтинг: 0 / 0
XML замена значения
    #39577466
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя во всему XML получен поверх курсора. На этапе SQL-запроса замену сделать не проще?
...
Рейтинг: 0 / 0
XML замена значения
    #39577468
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Петров Андрей,

Код: 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.
with v as (
select q'[
<ROWSET>
  <ROW>
    <FFIELD1>Name1</FFIELD1>
    <FFIELD2>Value1</FFIELD2>
  </ROW>
  <ROW>
    <FFIELD1>Name2</FFIELD1>
    <FFIELD2>Value2</FFIELD2>
  </ROW>
</ROWSET>
]' x
from dual
)
select
  x
 ,xmlquery('copy $new := $old 
              modify(
                 for $i in $new/ROWSET/ROW[FFIELD1="Name1"]
                 return replace value of node $i/FFIELD2 with $newval
              )
            return $new
           '
           passing xmltype(x) as "old"
                  ,'newval' as "newval"
           returning content
          ) xnew
from v
/
...
Рейтинг: 0 / 0
XML замена значения
    #39577613
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петров Андрей,

Код: 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.
SQL> create table t_xml as
  2  select xmltype('<ROWSET>
  3    <ROW>
  4      <FFIELD1>Name1</FFIELD1>
  5      <FFIELD2>Value1</FFIELD2>
  6    </ROW>
  7    <ROW>
  8      <FFIELD1>Name2</FFIELD1>
  9      <FFIELD2>Value2</FFIELD2>
 10    </ROW>
 11  </ROWSET>') xml
 12    from dual;

Table created.

SQL>
SQL> update t_xml set xml = updatexml(xml, '/ROWSET/ROW/FFIELD1[text()="Name1"]/parent::ROW/FFIELD2/text()', 'dummy1');

1 row updated.

SQL>
SQL> select * from t_xml;

XML
--------------------------------------------------
<ROWSET>
  <ROW>
    <FFIELD1>Name1</FFIELD1>
    <FFIELD2>dummy1</FFIELD2>
  </ROW>
  <ROW>
    <FFIELD1>Name2</FFIELD1>
    <FFIELD2>Value2</FFIELD2>
  </ROW>
</ROWSET>



Есть другой способ c помощью xpath выйти через значение одного узла на его соседа или родителя.
-2- вроде приводил пример.
...
Рейтинг: 0 / 0
XML замена значения
    #39577616
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, вот запись короче
Код: plsql
1.
update t_xml set xml = updatexml(xml, '/ROWSET/ROW/FFIELD1[text()="Name1"]/../FFIELD2/text()', 'dummy1');

XPath: Get parent node from child node
...
Рейтинг: 0 / 0
XML замена значения
    #39577621
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopСобственно, вот запись короче


Ho начиная c 12C The UPDATEXML function is deprecated. It is still supported for backward compatibility.

SY.
...
Рейтинг: 0 / 0
XML замена значения
    #39577627
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Жаль, такой приятный был сахарок. Вынуждают переходить на монструозные xmlquery или хуже того dbms_xmldom. :))
...
Рейтинг: 0 / 0
XML замена значения
    #39577677
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopзапись короче
Код: plsql
1.
update t_xml set xml = updatexml(xml, '/ROWSET/ROW/FFIELD1[text()="Name1"]/../FFIELD2/text()', 'dummy1');

Тут хитрости с вверх-вниз не нужны. См. xpath у xtender

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 ,xmlquery('copy $new := $old 
              modify(
                 for $i in $new/ROWSET/ROW[FFIELD1="Name1"]
                 return replace value of node $i/FFIELD2 with $newval
              )
            return $new
           '
           passing xmltype(x) as "old"
                  ,'newval' as "newval"
           returning content
          ) xnew
...
Рейтинг: 0 / 0
XML замена значения
    #39577821
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

Согласен, мне изначально двойной спуск по row показался несколько нелепым. Надо было присмотреться.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML замена значения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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