日期:2014-05-16  浏览次数:20472 次

SELECT INTO 技巧:0 & 1问题
       我们必须从一个表选择数据插入到临时变量,但所选的数据或者存在或者不存在
       也就是返回或者0行或者1行
       那么该如何有效的避免数据不存在的情况?
       
       下面有几种技巧,希望可以帮到你

       方法一:

DECLARE
  l_sal emp.sal%TYPE;
  p_empno emp.empno%TYPE := 123; -- Invalid empno number
BEGIN
 
  BEGIN
    SELECT sal
    INTO l_sal
    FROM emp
    WHERE empno = p_empno;
  EXCEPTION
    WHEN no_data_found THEN
      l_sal := 0;
  END;
   
END;
/

       注释:
           --在异常处理句柄,之所以失却others,Think认为,是基于以后能捕获到异常
           --others会把所有未处理异常全部吞掉
     
       方法二:

DECLARE
  l_sal emp.sal%TYPE;
  p_empno emp.empno%TYPE := 123; -- Invalid empno number
BEGIN
 
  SELECT NVL(MAX(sal), 0)
  INTO l_sal
  FROM emp
  WHERE empno = p_empno;
   
END;
/

       方法三:

DECLARE
  l_sal emp.sal%TYPE;
  p_empno emp.empno%TYPE := 123; -- Invalid empno number
BEGIN
 
  SELECT NVL(MAX(sal), 0)
  INTO l_sal
  FROM emp
  WHERE empno = p_empno
  HAVING count(1) <= 1;
   
END;
/ 

       注释: 
           这种方法是为了防止因为没有约束而导致表存在多行的情况