Использование MERGE с хранимой процедурой Oracle - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь вставить запись в мою таблицу, если она еще не существует. Если он существует, я хочу его обновить.

Я видел этот пример, опубликованный кем-то другим:

MERGE INTO mytable d
USING (SELECT 1 id, 'x' name from dual) s
ON (d.id = s.id)
WHEN MATCHED THEN UPDATE SET d.name = s.name
WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name);

Моя текущая хранимая процедура выглядит следующим образом:

procedure savePublicId(P_ACCNO in varchar2, P_PUBLICID in varchar2) is
begin
     update cc_custprofiles cpr
        set cpr.publicid       =  P_PUBLICID
      where cpr.customerlong_cpr  =  'C'||P_ACCNO
        and key_cpr = 'SINGLE';

     commit;
end;

В этой таблице нет столбцов идентификации (я знаю ...), поэтому я не могу сделать улов. Я пытался изменить это merge, чтобы оно соответствовало структуре моей таблицы, но я новичок в Oracle, поэтому не совсем уверен, что я делаю: D

Я придумал это:

merge into cc_custprofiles cpr
using (select 1 customerlong_cpr, 'x' publicid, 'SINGLE' key_cpr from dual) dual
on (cpr.customerlong_cpr = dual.customerlong_cpr)
when matched then update set cpr.publicid = P_PUBLICID
WHEN NOT MATCHED THEN INSERT (customerlong_cpr, publicid, key_cpr) values (P_ACCNO, P_PUBLICID, 'SINGLE');

Но я не думаю, что это правильно. Может кто-нибудь помочь мне с этим, пожалуйста?

1 Ответ

2 голосов
/ 26 апреля 2019

Вы почти там с вашим заявлением о слиянии. Я думаю, что вы после чего-то более похожего:

MERGE INTO cc_custprofiles tgt
USING (SELECT 'C' || p_accno customerlong_cpr,
          p_publicid publicid,
          'SINGLE' key_cpr
     FROM   dual) src
ON (tgt.customerlong_cpr = src.customerlong_cpr AND tgt.key_cpr = src.key_cpr)
WHEN MATCHED THEN
  UPDATE SET tgt.publicid = src.publicid
WHEN NOT MATCHED THEN
  INSERT (tgt.customerlong_cpr, tgt.publicid, tgt.key_cpr)
  VALUES (src.customerlong_cpr, src.publicid, src.key_cpr);

Смысл оператора слияния состоит в том, чтобы взять результаты из исходной таблицы или подзапроса и решить, добавлять ли их или обновлять в целевой таблице. В вашем случае, поскольку вы используете параметры, чтобы решить, что вставлять, вам нужно поместить их в подзапрос select ... from dual, чтобы вы могли использовать его как исходный подзапрос в операторе слияния.

Ваши условия соединения (также называемые ON) - это предикаты, которые вы используете для идентификации строк - в вашем случае это выглядит так:

where cpr.customerlong_cpr  =  'C'||P_ACCNO
        and key_cpr = 'SINGLE';

из вашего заявления об обновлении.

Тогда это просто вопрос обновления или вставки соответствующих значений по мере необходимости.

N.B. Я всегда использую tgt и src в качестве псевдонимов для целевой таблицы и исходной таблицы / подзапроса соответственно; Я считаю, что это помогает мне держать вещи в голове, пока я пишу запрос. Вы можете или не можете найти это соглашение полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...