0

当没有找到数据时,我对管理基于 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;
4

2 回答 2

2

简短答案是,长答案,在这种情况下 nvl 更快,如果未找到结果值就在 de select 内部,在异常中它首先执行 select 并在它调用异常的过程之后。在这种情况下,nvl 更好,因为您有一个固定值。

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

于 2012-10-11T13:07:12.963 回答
1

两个块都输出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。第二个需要更多时间来理解,因此会更加混乱。

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

另请注意,我的两个块并不完全等效。如果员工的薪水为 NULL,我的第一个查询将返回 NULL,而我的第二个查询将返回 0。

于 2012-10-11T13:08:08.043 回答