powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вдруг стало не всё понятно в merge
25 сообщений из 33, страница 1 из 2
вдруг стало не всё понятно в merge
    #39571179
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу обновить одну таблицу данными другой, и менять только те строки, которые в самом деле разные,
и в этом случае не срабатывает контроль на дубли ORA-30926: невозможно получить устойчивый набор строк в исходных таблицах

Код: 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.
SQL> DROP TABLE tbl1
Table dropped.

SQL> DROP TABLE tbl2
Table dropped.

SQL> CREATE TABLE tbl1(ID NUMBER, v VARCHAR2(10))
Table created.

SQL> CREATE TABLE tbl2(ID NUMBER, v VARCHAR2(10))
Table created.

SQL> INSERT INTO tbl1 VALUES(1, '1')
1 row created.

SQL> INSERT INTO tbl2 VALUES(1, '1')
1 row created.

SQL> INSERT INTO tbl2 VALUES(1, '2')
1 row created.

SQL> COMMIT
Commit complete.

SQL> MERGE INTO tbl1 USING tbl2 ON (tbl2.ID = tbl1.ID)
WHEN MATCHED THEN UPDATE
set v = tbl2.v
WHERE tbl2.v <> tbl1.v
1 row merged.
SQL> SELECT * FROM tbl1

        ID V         
---------- ----------
         1 2         
1 row selected.

SQL> MERGE INTO tbl1 USING tbl2 ON (tbl2.ID = tbl1.ID)
WHEN MATCHED THEN UPDATE
set v = tbl2.v
WHERE tbl2.v <> tbl1.v
1 row merged.

SQL> SELECT * FROM tbl1

        ID V         
---------- ----------
         1 1         
1 row selected.

SQL> MERGE INTO tbl1 USING tbl2 ON (tbl2.ID = tbl1.ID)
WHEN MATCHED THEN UPDATE
set v = tbl2.v
WHERE tbl2.v <> tbl1.v
1 row merged.
SQL> SELECT * FROM tbl1

        ID V         
---------- ----------
         1 2         
1 row selected.





SQL> MERGE INTO tbl1 USING tbl2 ON (tbl2.ID = tbl1.ID)
WHEN MATCHED THEN UPDATE
set v = tbl2.v
--WHERE tbl2.v <> tbl1.v
MERGE INTO tbl1 USING tbl2 ON (tbl2.ID = tbl1.ID)
WHEN MATCHED THEN UPDATE
set v = tbl2.v
--WHERE tbl2.v <> tbl1.v
-- а так срабатывает, но не хочется апдейтить все 100500 тыщ строк
Error at line 35
ORA-30926: невозможно получить устойчивый набор строк в исходных таблицах

SQL> SELECT * FROM tbl1

        ID V         
---------- ----------
         1 2         
1 row selected.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571183
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxхочу обновить одну таблицу данными другой, и менять только те строки, которые в самом деле разные,Ты не понял, для чего MERGE. Обновление одной и той-же строки несколько раз - это недетерминизм результата, зависящего от последовательности обновлений, защитой от чего и является ORA-30926.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571186
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Код: plsql
1.
2.
3.
4.
5.
MERGE INTO tbl1 
USING (select * from tbl2 where exists (select * from tbl1 where tbl1.id = tbl2.id and tbl1.v <> tbl2.v)
ON (tbl2.ID = tbl1.ID)
WHEN MATCHED THEN UPDATE
set v = tbl2.v



Но если в tbl2 будет
ID v - 1 5 - 1 2 - 1 4
А в tbl1 ID v - 1 5
То всё равно будет та же ошибка.
Лучше max/min.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571200
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandreymxхочу обновить одну таблицу данными другой, и менять только те строки, которые в самом деле разные,Ты не понял, для чего MERGE. Обновление одной и той-же строки несколько раз - это недетерминизм результата, зависящего от последовательности обновлений, защитой от чего и является ORA-30926.не, это я понимаю

я не понимаю, как проапдейтить только изменившиеся названия из нестабильного источника данных

получается, придется отдельный контроль городить
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571205
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxя не понимаю, как проапдейтить только изменившиеся названия из нестабильного источника данныхНет, не понимаешь. У тебя недетерминированный источник.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571207
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а я о том и говорюElicandreymxя не понимаю, как проапдейтить только изменившиеся названия из нестабильного источника данныхНет, не понимаешь. У тебя недетерминированный источник.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571215
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxа я о том и говорюНе о том. А MERGE в этом не виноват.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571219
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxElicпропущено...
Ты не понял, для чего MERGE. Обновление одной и той-же строки несколько раз - это недетерминизм результата, зависящего от последовательности обновлений, защитой от чего и является ORA-30926.не, это я понимаю

я не понимаю, как проапдейтить только изменившиеся названия из нестабильного источника данных

получается, придется отдельный контроль городить

-MERGE, соедини мне tbl1 и tbl2 по ID, а затем подмени tbl1.v на tbl2.v
-Пользователь, я сджойнил эти таблицы, но там для ID = 1 есть 2 записи в tbl2. Мне нужно чтобы ты чётко указал что на что подменить, я сам не умею такое решать.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571400
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

ORA-30926 выстреливает при повторной попытке обновить одну и ту же строку.
Это НЕ проверка набора данных в using на наличие дублей согласно ключу в кляузе ON.
Более того, эта проверка по так называемому ключу не имеет смысла в общем случае.
Соединение может быть, например, по неравенству.

Другое дело, что в примерах ниже ошибка валится только в случаях 2 и 3 (11.2.0.4), а должна бы всегда.
Код: 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.
truncate table tbl1; 
truncate table tbl2;
INSERT INTO tbl1 VALUES(1, '1');
INSERT INTO tbl2 VALUES(1, '1');
INSERT INTO tbl2 VALUES(2, '2');
COMMIT;
MERGE INTO tbl1 USING tbl2 ON (tbl2.ID >= tbl1.ID )
WHEN MATCHED THEN UPDATE
set v = tbl2.v;
truncate table tbl1; 
truncate table tbl2;
INSERT INTO tbl1 VALUES(1, '1');
INSERT INTO tbl2 VALUES(2, '2');
INSERT INTO tbl2 VALUES(1, '1');
COMMIT;
MERGE INTO tbl1 USING tbl2 ON (tbl2.ID >= tbl1.ID )
WHEN MATCHED THEN UPDATE
set v = tbl2.v;
truncate table tbl1; 
truncate table tbl2;
INSERT INTO tbl1 VALUES(1, '1');
INSERT INTO tbl2 VALUES(1, '1');
INSERT INTO tbl2 VALUES(2, '2');
COMMIT;
MERGE INTO tbl1 USING tbl2 ON (tbl2.ID >= tbl1.ID )
WHEN MATCHED THEN UPDATE
set v = tbl2.v * 10;



Для твоего случая не совсем понятна суть претензий. Недетерминизма по факту нет.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571402
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты перепиши MERGE на UPDATE и надеюсь станет все ясно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> UPDATE TBL1
  2    SET V = (SELECT V FROM TBL2 WHERE TBL2.ID = TBL1.ID)
  3    WHERE ID IN (SELECT ID FROM TBL2)
  4  /
  SET V = (SELECT V FROM TBL2 WHERE TBL2.ID = TBL1.ID)
           *
ERROR at line 2:
ORA-01427: single-row subquery returns more than one row


SQL>



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

Это кому ответ?
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571417
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopSY,

Это кому ответ?

Вроде отвечал andreymx.

SY.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571419
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopSY,

Это кому ответ?

Вроде отвечал andreymx.

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

А как насчёт
Код: plsql
1.
WHERE tbl2.v <> tbl1.v

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

WHERE в MERGE проверяется после ON. Т.e. берем TBL1.ID = 1 и ищем WHEN MATCHED в USING. Нашли > 1 и все приехали.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> UPDATE TBL1
  2     SET V = (SELECT V FROM TBL2 WHERE TBL2.ID = TBL1.ID)
  3    WHERE ID IN (SELECT ID FROM TBL2 WHERE TBL1.V <> TBL2.V)
  4  /
   SET V = (SELECT V FROM TBL2 WHERE TBL2.ID = TBL1.ID)
            *
ERROR at line 2:
ORA-01427: single-row subquery returns more than one row


SQL>



SY.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571463
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс. Прошляпил что условие на обе таблицы, посему:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> UPDATE TBL1
  2     SET V = (SELECT V FROM TBL2 WHERE TBL2.ID = TBL1.ID AND TBL1.V <> TBL2.V)
  3    WHERE ID IN (SELECT ID FROM TBL2 WHERE TBL1.V <> TBL2.V)
  4  /

1 row updated.

SQL>



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

Вот теперь когда учтены детали случая andreymx можно перейти к моему сообщению и вот там невозникнование ошибки действительно баг.

ЗЫ. Спешка хороша только при ловле блох.
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571482
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopВот теперь когда учтены детали случая andreymx можно перейти к моему сообщению и вот там невозникнование ошибки действительно баг.

Tолько сейчас вспомнил MERGE работает по принципу "значение поля может измениться только один раз":

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
truncate table tbl1
/
truncate table tbl2
/
insert into tbl1 values(1,1)
/
insert into tbl2 select 1,1 from dual connect by level <= 10
/
merge
  into tbl1
  using tbl2
  on (tbl2.id = tbl1.id)
  when matched then
    update set v = tbl2.v
/

10 rows merged.

SQL>



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

А он умён если понимает, что обновление на текущее это вовсе не обновление. :)

Описание правила "значение поля может измениться только один раз" где-то есть на oracle.com?
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571493
Фотография 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.
truncate table tbl1; 
truncate table tbl2;

insert into tbl1 values(1, '1');
insert into tbl2 values(1, '1');
insert into tbl2 values(2, '2');
commit;

merge into tbl1 using tbl2 on (tbl2.id >= tbl1.id )
when matched then update
set v = tbl2.v;

2 rows merged.

truncate table tbl1; 
truncate table tbl2;

insert into tbl1 values(1, '1');
insert into tbl2 values(1, '10');
insert into tbl2 values(2, '20');
commit;

merge into tbl1 using tbl2 on (tbl2.id >= tbl1.id )
when matched then update
set v = tbl2.v;

ORA-30926: невозможно получить устойчивый набор строк в исходных таблицах

...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571529
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
почему триггер срабатывает 4-раза
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER tr_tbl1
  2  BEFORE UPDATE ON tbl1 FOR EACH ROW
  3  begin
  4   dbms_output.put_line(:old.v||' '||:new.v);
  5* end;
SQL> /

Trigger created.

SQL> select * from tbl2;

        ID V
---------- ----------
         1 2
         1 2
         1 2
         1 2
         1 2
         1 2
         1 2
         1 2
         1 2
         1 2

10 rows selected.

SQL> merge
  2    into tbl1
  3    using tbl2
  4    on (tbl2.id = tbl1.id)
  5    when matched then
  6      update set v = tbl2.v
  7  /
1 2
1 2
1 2
1 2
  using tbl2
        *
ERROR at line 3:
ORA-30926: unable to get a stable set of rows in the source tables




.....
stax
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571530
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

обновление на одно и тоже значение (напр на 2), тож мог бы посчитать одиночным

....
stax
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571537
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopSY,

А он умён если понимает, что обновление на текущее это вовсе не обновление. :)

Описание правила "значение поля может измениться только один раз" где-то есть на oracle.com?в журнале будет одна строка или 10?
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571542
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxdbms_photoshopSY,

А он умён если понимает, что обновление на текущее это вовсе не обновление. :)

Описание правила "значение поля может измениться только один раз" где-то есть на oracle.com?в журнале будет одна строка или 10?

триггер отрабатывает 10 раз

.....
stax
...
Рейтинг: 0 / 0
вдруг стало не всё понятно в merge
    #39571557
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Описание правила "значение поля может измениться только один раз" где-то есть на oracle.com?

Не нашел. Так-что не знаю баг или feature.

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


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