Exception handling 这些片段是等价的吗?(NVL与例外)
我怀疑在找不到数据的情况下,如何管理将值分配给sql语句中的变量的情况。首先,这些区块是等价的吗?如果这是真的,那两者中哪一个更好呢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
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上的查询,执行时间的差异变得可以忽略不计。我们不知道该函数的使用次数和方式,它与执行时间有关。好吧,该函数完全不起作用,因此我们可以假设它从未运行过:另一方面,如果我们假设此选择做了一些有用的事情,这样,性能上的差异就可以忽略不计了。