0

データが見つからない場合に、SQLステートメントに基づいて変数に値を割り当てる状況を管理することに疑問があります。まず、これらのブロックは同等ですか?それが本当なら、2つのうちのどちらが良いですか?

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の方が適しています。

「else」がある場合は、常にnvlを選択してください。

于 2012-10-11T13:07:12.963 に答える
1

両方のブロックが出力2されるため、両方とも「同等」です。私は、2番目の形式がより標準的で読みやすいと主張します。

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が返されることを理解しやすくなります。2つ目は、理解するのに時間がかかるため、混乱を招きます。

それらは同じように機能し、読みやすさは保守性と同等であり、したがって重要であるため、私は間違いなく最初のものを選びます。

また、私の2つのブロックは完全に同等ではないことに注意してください。従業員の給与がNULLの場合、最初のクエリはNULLを返しますが、2番目のクエリは0を返します。

于 2012-10-11T13:08:08.043 に答える