Exception handling 这些片段是等价的吗?(NVL与例外)

Exception handling 这些片段是等价的吗?(NVL与例外),exception-handling,plsql,nvl,no-data,Exception Handling,Plsql,Nvl,No Data,我怀疑在找不到数据的情况下,如何管理将值分配给sql语句中的变量的情况。首先,这些区块是等价的吗?如果这是真的,那两者中哪一个更好呢 declare nonsense number; begin select nvl((select 1 from dual where 1 <> 1),2) into nonsense from dual; dbms_output.put_line(nonsense); end; declare nonsense number; begin

我怀疑在找不到数据的情况下,如何管理将值分配给sql语句中的变量的情况。首先,这些区块是等价的吗?如果这是真的,那两者中哪一个更好呢

declare
nonsense number;
begin
  select nvl((select 1 from dual where 1 <> 1),2) into nonsense from dual;
  dbms_output.put_line(nonsense);
end;

declare
nonsense number;
begin
  begin
  select 1 into nonsense from dual where 1<>1;
  exception when no_data_found then
    nonsense := 2;
  end;
  dbms_output.put_line(nonsense);
end;

短回答是,长回答,在这种情况下,nvl速度更快,如果未找到结果值,则结果值正好位于取消选择内,在异常情况下,它首先执行选择,然后在处理后调用异常。在这种情况下,nvl更好,因为您有一个固定的值


如果您有其他选项,请始终选择nvl。

简短回答是,长回答,在这种情况下,nvl速度更快,如果未找到结果值,则结果值位于取消选择内,在异常中,它首先执行选择,然后在处理完后调用异常。在这种情况下,nvl更好,因为您有一个固定的值

如果有else,请始终选择nvl。

两个块都输出2,因此两者都是等效的。我认为第二种形式更标准,更容易阅读

比较两种功能:

FUNCTION getSal (p_id NUMBER) RETURN NUMBER
IS
   l_return NUMER;
BEGIN
   SELECT sal INTO l_return FROM emp WHERE id = p_id;
   RETURN l_return;
EXCEPTION
   WHEN NO_DATA_FOUND
      THEN RETURN 0;
END;

FUNCTION getSal (p_id NUMBER) RETURN NUMBER
IS
   l_return NUMER;
BEGIN
   SELECT NVL((SELECT sal INTO l_return FROM emp WHERE id = p_id), 
              0)
     INTO l_return
     FROM DUAL;
   RETURN l_return;
END;
虽然第一行还有几行,但更容易理解的是,如果找不到员工,将返回0。第二个问题需要更多的时间来理解,因此会更加混乱

我肯定会选择第一个,因为它们的性能相同,可读性等于可维护性,因此非常重要

还要注意,我的两个块不是完全相等的。如果员工的工资为空,我的第一个查询将返回空,而我的第二个查询将返回0。

这两个模块都将输出2,因此两者都是等效的。我认为第二种形式更标准,更容易阅读

比较两种功能:

FUNCTION getSal (p_id NUMBER) RETURN NUMBER
IS
   l_return NUMER;
BEGIN
   SELECT sal INTO l_return FROM emp WHERE id = p_id;
   RETURN l_return;
EXCEPTION
   WHEN NO_DATA_FOUND
      THEN RETURN 0;
END;

FUNCTION getSal (p_id NUMBER) RETURN NUMBER
IS
   l_return NUMER;
BEGIN
   SELECT NVL((SELECT sal INTO l_return FROM emp WHERE id = p_id), 
              0)
     INTO l_return
     FROM DUAL;
   RETURN l_return;
END;
虽然第一行还有几行,但更容易理解的是,如果找不到员工,将返回0。第二个问题需要更多的时间来理解,因此会更加混乱

我肯定会选择第一个,因为它们的性能相同,可读性等于可维护性,因此非常重要


还要注意,我的两个块不是完全相等的。如果员工的工资为空,我的第一个查询将返回空,而我的第二个查询将返回0。

如果用任何有用的查询替换dual上的查询,执行时间的差异将变得微不足道。我们不知道该函数的使用次数和方式,它与执行时间有关,此函数完全不起任何作用,因此我们可以假设它从未运行过:另一方面,如果我们假设此select做了一些有用的事情,那么性能上的差异将变得微不足道。如果用任何有用的查询替换dual上的查询,执行时间的差异变得可以忽略不计。我们不知道该函数的使用次数和方式,它与执行时间有关。好吧,该函数完全不起作用,因此我们可以假设它从未运行过:另一方面,如果我们假设此选择做了一些有用的事情,这样,性能上的差异就可以忽略不计了。