Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Почему не срабатывает merge?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3189
Есть такая таблица:
CREATE TABLE BM_CUSTOMER_CONTACT
(
  CUSTOMER_CONTACT_ID  NUMBER                   NOT NULL,
  CUSTOMER_ID          NUMBER                   NOT NULL,
  CONTACT_DICT_ID      NUMBER                   NOT NULL,
  VALUE                VARCHAR2(255 BYTE)       NOT NULL
);

Выполняю такой запрос (id=95767, msg='test'):
merge into BM_CUSTOMER_CONTACT D
using (select CUSTOMER_ID from BM_CUSTOMER_CONTACT where CONTACT_DICT_ID = 999 and CUSTOMER_ID = :id) S
on (S.CUSTOMER_ID = D.CUSTOMER_ID)
when matched then
  update set D.VALUE = to_char(sysdate, 'yyyy-mm-dd hh24:mi') || ': ' || :msg
when not matched then
  insert (D.CUSTOMER_ID, D.CONTACT_DICT_ID, D.VALUE)
  values (:id, 999, to_char(sysdate, 'yyyy-mm-dd hh24:mi') || ': ' || :msg)

В таблице такой записи нет, поэтому должен отработать insert.
Однако при выполнении запроса 0 rows merged и строка не добавляется.
Не могу понять, почему.
4 июн 19, 15:09    [21901614]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает merge?  [new]
merch
Member

Откуда:
Сообщений: 147
Alibek B.,


select CUSTOMER_ID from BM_CUSTOMER_CONTACT where CONTACT_DICT_ID = 999 and CUSTOMER_ID = :id


А сколько строк вернет этот запрос?
4 июн 19, 15:35    [21901636]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает merge?  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1320
Если запрос

select CUSTOMER_ID from BM_CUSTOMER_CONTACT where CONTACT_DICT_ID = 999 and CUSTOMER_ID = :id


возвращает 0 строк, нечего мёрджить.

Вставьте вместо него

select 0 customer_id from dual
4 июн 19, 15:36    [21901639]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает merge?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3189
0 строк, я же писал выше, что такой записи нет.

Переделал запрос на такой:
merge into BM_CUSTOMER_CONTACT
using DUAL on (CONTACT_DICT_ID = 999 and CUSTOMER_ID = :id)
when matched then
  update set VALUE = to_char(sysdate, '[yyyy-mm-dd hh24:mi] ') || :msg
when not matched then
  insert (CUSTOMER_ID, CONTACT_DICT_ID, VALUE)
  values (:id, 999, to_char(sysdate, '[yyyy-mm-dd hh24:mi] ') || :msg)

Так все работает правильно.
Но не могу сообразить, почему не работал первый вариант.
4 июн 19, 15:37    [21901640]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает merge?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
селект не возвращает записи, нечего вставлять (мержіть)


влоб
...
using (select :id, 999, to_char(sysdate, 'yyyy-mm-dd hh24:mi') || ': ' || :msg from dual)
...

или
select
union all
select ... from dual where not exists (....)
.....
stax
4 июн 19, 15:41    [21901641]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает merge?  [new]
-2-
Member

Откуда:
Сообщений: 14850
Alibek B.
не могу сообразить
а зачем?
4 июн 19, 15:42    [21901644]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить