当前位置: 代码迷 >> Oracle管理 >> 【Oracle】存储过程,不等于查询失败 WHERE ID<>vID解决方法
  详细解决方案

【Oracle】存储过程,不等于查询失败 WHERE ID<>vID解决方法

热度:147   发布时间:2016-04-24 04:16:06.0
【Oracle】存储过程,不等于查询失败 WHERE ID<>vID
环境:Oracle 11g 64位 win

SQL

create or replace procedure PR_USER_MODIFY
(
  vUserId in TB_USER.UserId%TYPE default 0,

  vName   in TB_USER.name%type,
  vEmail  in TB_USER.Email%type,
  oResInt out int,
  oResStr out varchar2
) is

  i         int;
  newUserId int;

begin

  select count(1)
    into i
    from TB_USER
   WHERE UserId <> vUserId --这里会导致错误,因为vUserId可能是数字也可能是空 
     AND (upper(Name) = upper(vName) or upper(Email) = upper(vEmail));

  IF i > 0 THEN
    oResInt := 0;
    oResStr := '[用户名]或者 [邮箱]已经被占用了';
    return;
  end if;

  if vUserId THEN
    update TB_USER SET Name = vName, Email = vEmail where UserId = vUserId;
    commit;
    oResStr := '更新成功';
  else
  
    SELECT MAX(UserId) + 1 INTO newUserId FROM TB_USER;
  
    INSERT INTO TB_USER
      (UserId, Email, Name)
    values
      (newUserId, vEmail, vName);
    commit;
    oResStr := '插入成功';
  end if;

  oResInt := 1;

exception
  when others then
    oResInt := 0;
    oResStr := '发生异常,请联系DBA';
  
end PR_USER_MODIFY;




疑问
1)无法查询到应该的数据

select count(1) into i from tb_user where userid<>vUserId and (upper(email) = upper(vEmail) or upper(name)=upper(vName))

当传入的vUserId 为空或的时候,这个根本就查询不到。除非传入的vUserId>0且为数字类型。

2)在存储过程中的IF块里面使用return 会导致表锁死吗?不能在存储过程的IF块中使用IF?






------解决方案--------------------
1、楼主记住一点null不是个东西,除了is null和is not null能比较null以外,其他任何比较都会是false.
2、IF是可以嵌套的。至于你说的return一般不再存储过程中用吧。
------解决方案--------------------
引用:
Quote: 引用:

1、楼主记住一点null不是个东西,除了is null和is not null能比较null以外,其他任何比较都会是false.
2、IF是可以嵌套的。至于你说的return一般不再存储过程中用吧。


那如何将非数字的转换为数字,我发现用 nvl(vUserId,0) 之后可以查询到了。

对的,nvl可以处理空的值,其实报错的原因是因为selece into造成的(如果没有结果就会报错),有null的情况下不能进行等值比较
------解决方案--------------------
null只能单独处理
字符串转换数字可以用to_number
------解决方案--------------------
引用:
Quote: 引用:

1、楼主记住一点null不是个东西,除了is null和is not null能比较null以外,其他任何比较都会是false.
2、IF是可以嵌套的。至于你说的return一般不再存储过程中用吧。


那如何将非数字的转换为数字,我发现用 nvl(vUserId,0) 之后可以查询到了。


NVL(expr1,expr2);这个的作用就是当expr1为null的时候赋予其值为expr2。
  相关解决方案