Проверьте запись существует перед обновлением - PullRequest
0 голосов
/ 25 января 2019

Я хочу обновить таблицу, но я хочу проверить, существует ли запись.Если нет, то выбросить исключение.В приложении C # я передаю параметры и выполняю команду следующим образом.

procedure usp_update_example
(
   p_id            in mydb.member.idn_member%type,
   p_idn_person    in mydb.member.idn_person%type,
   p_ind_rep       in mydb.member.ind_rep%type
) 
as
    v_exist   pls_integer := 0;
    v_step    varchar2(250);
    v_exception_not_exist exception;
begin
    v_step := 'Check for record '  || p_id;
    select count(1)
      into v_exist
      from mydb.member
      where idn_member = p_id;

      if v_exist = 0 then
         raise v_exception_not_exist;
      end if;

      if (v_exist > 0) then
      v_step := 'Update table :' || p_id;
      update mydb.member
      set
         idn_person   =  p_idn_person,
         ind_rep      =  p_ind_rep
      where idn_member = p_id;
      end if;
   exception
   when v_exception_not_exist then
     Raise_application_error(-20001, 'Not exist');
end usp_update_example;

Однако, даже если мое условие верно, у меня есть запись, существующая в таблице.Я всегда получаю Not exist исключение.Если я не использую if v_exist = 0 и использую WHEN NO_DATA_FOUND THEN.Тогда все в порядке.

Я не уверен, что не так.

1 Ответ

0 голосов
/ 25 января 2019

Ваш код, кажется, в порядке.Похоже, что эта проблема связана с некоторыми незафиксированными данными - вы видите запись в сеансе, куда вы ее вставили, и вы не видите ее в сеансе C #, поскольку запись еще не зафиксирована.Следовательно, сессия C # генерирует исключение.

Что я хотел бы предложить, так это то, что код процедуры должен сделать его более компактным.Примерно так:

...
begin
  update mydb.member
  set    idn_person   =  p_idn_person,
         ind_rep      =  p_ind_rep
  where idn_member = p_id;

  if SQL%ROWCOUNT = 0 then
    raise_application_error(-20001,'Not exist');
  end if;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...