SELECT AMOUNT
  INTO l_Amount
  FROM T1
 WHERE...
条件比较长,省略。可以保证最多只有一条相符结果。
无记录的时候,想把l_Amount设为0。为了应付无记录的情况,想了以下这些写法:第1种,先检查件数:
SELECT COUNT(*) INTO l_Cnt 以下省略
IF l_Cnt > 0 THEN
    SELECT AMOUNT INTO l_Amount 以下省略
END IF;第2种,用exception:
FUNCTION GETAMOUNT RETURN NUMBER
IS l_Ret BEGIN SELECT AMOUNT INTO l_Ret 以下省略
RETURN l_Ret
WHEN NO_DATA_FOUND THEN RETURN 0 END;第3种,用UNION:
SELECT AMOUNT
  INTO l_Amount
  FROM
( SELECT AMOUNT
  FROM T1
 WHERE...
UNION ALL
  SELECT 0 FROM DUAL
)
  WHERE rownum <=1;第4种,用NVL函数:
SELECT NVL(MAX(AMOUNT), 0)因为最多就一条记录,MAX,MIN之类的函数都可以
  INTO l_Amount
  FROM T1
 WHERE...个人看法:
第1种方案,太傻
第3种方案,有些罗索
第4种方案,用MAX之类的函数虽然结果正确但感觉不太合适第2种方案,觉得比其他的好一些大家怎么认为?

解决方案 »

  1.   

    第一种方案与第二种方案的执行效率是一样的
    我就喜欢用第一种
    首先,可以灵活的处理问题,在找不到数据的时候
    可以执行其他操作,
    可以提示各种不同的错误提示,
    可以RETURN,
    可以灵活的控制各种查询条件
    而第二种FUNCTION的话,就很难控制各种查询条件了吧.
    第三种第四种从来没用过.
      

  2.   

    select nvl((select ...), 0) into ... from DUAL;