Обновление или вставка в зависимости от того, существует ли сотрудник в таблице - PullRequest
0 голосов
/ 19 марта 2012

Хотите создать сохраненный прок, который обновляет или вставляет в таблицу на основе условия, если в таблице не существует текущей строки?

Это то, что я придумал до сих пор:

PROCEDURE SP_UPDATE_EMPLOYEE
(
   SSN                              VARCHAR2,
   NAME                             VARCHAR2
)
AS
BEGIN
    IF EXISTS(SELECT * FROM tblEMPLOYEE a where a.ssn = SSN)
     --what ? just carry on to else
    ELSE
    INSERT INTO pb_mifid (ssn, NAME)
     VALUES (SSN, NAME);
END;

Это способ достичь этого?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Это довольно распространенная модель. В зависимости от того, какую версию Oracle вы используете, вы можете использовать оператор слияния (я не уверен, в какой версии он появился).

create table test_merge (id integer, c2 varchar2(255));

create unique index test_merge_idx1 on test_merge(id);

merge into test_merge t
  using (select 1 id, 'foobar' c2 from dual) s
  on (t.id = s.id)
  when matched then update set c2 = s.c2
  when not matched then insert (id, c2) 
  values (s.id, s.c2);

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

Если вы не можете использовать слияние, оптимизируйте его для наиболее распространенного случая. Будет ли процесс, как правило, не находит запись и должен вставить ее, или ему обычно нужно обновить существующую запись?

Если вставка будет наиболее распространенной, лучше всего использовать следующий код:

begin
  insert into t (columns) 
  values ()
exception
  when dup_val_on_index then
    update t set cols = values
end;

Если обновление является наиболее распространенным, измените порядок действий:

begin
  update t set cols = values;

  if sql%rowcount = 0 then  
    -- nothing was updated, so the record doesn't exist, insert it. 
    insert into t (columns)
            values ();
  end if;
end;

Вы не должны выдавать команду select для проверки строки и принятия решения на основе результата - это означает, что вам всегда нужно будет запускать два оператора SQL, когда вы можете использовать один из них большую часть времени (или всегда, если вы используете слияние). Чем меньше операторов SQL вы используете, тем лучше будет работать ваш код.

2 голосов
/ 19 марта 2012
BEGIN
  INSERT INTO pb_mifid (ssn, NAME)
  select  SSN, NAME from dual
  where not exists(SELECT * FROM tblEMPLOYEE a where a.ssn = SSN);
END;

ОБНОВЛЕНИЕ: Внимание, вы должны назвать свой параметр p_ssn (отличающийся от столбца SSN), и запрос станет:

  INSERT INTO pb_mifid (ssn, NAME)
  select  P_SSN, NAME from dual
  where not exists(SELECT * FROM tblEMPLOYEE a where a.ssn = P_SSN);

, потому что это всегда существует:

SELECT * FROM tblEMPLOYEE a where a.ssn = SSN 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...