Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вдруг стало не всё понятно в merge / 25 сообщений из 33, страница 1 из 2
18.12.2017, 09:34
    #39571179
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
хочу обновить одну таблицу данными другой, и менять только те строки, которые в самом деле разные,
и в этом случае не срабатывает контроль на дубли 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
18.12.2017, 09:40
    #39571183
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
andreymxхочу обновить одну таблицу данными другой, и менять только те строки, которые в самом деле разные,Ты не понял, для чего MERGE. Обновление одной и той-же строки несколько раз - это недетерминизм результата, зависящего от последовательности обновлений, защитой от чего и является ORA-30926.
...
Рейтинг: 0 / 0
18.12.2017, 09:43
    #39571186
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
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
18.12.2017, 10:21
    #39571200
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
Elicandreymxхочу обновить одну таблицу данными другой, и менять только те строки, которые в самом деле разные,Ты не понял, для чего MERGE. Обновление одной и той-же строки несколько раз - это недетерминизм результата, зависящего от последовательности обновлений, защитой от чего и является ORA-30926.не, это я понимаю

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

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

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

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

-MERGE, соедини мне tbl1 и tbl2 по ID, а затем подмени tbl1.v на tbl2.v
-Пользователь, я сджойнил эти таблицы, но там для ID = 1 есть 2 записи в tbl2. Мне нужно чтобы ты чётко указал что на что подменить, я сам не умею такое решать.
...
Рейтинг: 0 / 0
18.12.2017, 14:17
    #39571400
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
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
18.12.2017, 14:19
    #39571402
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
А ты перепиши 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
18.12.2017, 14:24
    #39571406
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
SY,

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

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

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

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

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

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

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

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

?
...
Рейтинг: 0 / 0
18.12.2017, 14:57
    #39571453
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
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
18.12.2017, 15:04
    #39571463
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
Упс. Прошляпил что условие на обе таблицы, посему:

Код: 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
18.12.2017, 15:11
    #39571470
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
SY,

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

ЗЫ. Спешка хороша только при ловле блох.
...
Рейтинг: 0 / 0
18.12.2017, 15:31
    #39571482
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
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
18.12.2017, 15:41
    #39571489
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
SY,

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

Описание правила "значение поля может измениться только один раз" где-то есть на oracle.com?
...
Рейтинг: 0 / 0
18.12.2017, 15:45
    #39571493
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
Да, забавно
Код: 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
18.12.2017, 16:23
    #39571529
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
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
18.12.2017, 16:25
    #39571530
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вдруг стало не всё понятно в merge
dbms_photoshop,

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

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

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

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

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

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

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

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

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

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


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