更新前存在检查记录

时间:2019-01-25 01:56:26

标签: oracle stored-procedures

我想更新一个表,但是我想检查记录是否存在。如果不是,则抛出异常。在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 :(得分:1)

您的代码似乎没问题。看起来此问题与某些未提交的数据有关-您在插入了该记录的会话中看到了该记录,而在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;