日期:2014-05-17  浏览次数:20772 次

关于NO_DATA_FOUND异常的问题
场景1:输入指定员工号码查询员工姓名
SET SERVEROUTPUT ON
DECLARE
  v_ename t_myemp.ename%TYPE;
  v_empno t_myemp.empno%TYPE;
BEGIN
  v_empno:=&deptno;
  SELECT ename INTO v_ename FROM t_myemp WHERE empno=v_empno;
  DBMS_OUTPUT.PUT_LINE(v_ename);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE(v_empno||'员工没有找到');
END;
/
输入正确员工号:7900  输出: JAMES
输入错误员工号:7901  输出: 7901员工没有找到

场景2:输入指定部门号码查询部门平均工资
SET SERVEROUTPUT ON
DECLARE
  v_avg_sal t_myemp.sal%TYPE;
  v_deptno t_myemp.deptno%TYPE;
BEGIN
  v_deptno:=&deptno;
  SELECT AVG(sal) INTO v_avg_sal FROM t_myemp WHERE deptno=v_deptno;
  DBMS_OUTPUT.PUT_LINE(v_deptno||'部门的平均工资是:'||v_avg_sal);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE(v_deptno||'部门没有找到');
END;
/
输入正确部门号:20  输出: 20部门的平均工资是:2175
输入错误员工号:21  输出: 21部门的平均工资是:

请问:为什么场景2没有报NO_DATA_FOUND错误???
oracle pl/sql exception no_data_found

------解决方案--------------------
不知道是不是因为你empno和deptno的类型不同引起的
------解决方案--------------------
单步跟下试试吧
------解决方案--------------------
select ... into ..from table_name 
这个语句导致的,你要看下是不是没有查到数据
把你传入的参数带入去验证下
------解决方案--------------------


AVG函数在数据不存在时返回NULL(有返回值,只是值为NULL),而普通的SELECT ..INTO 在数据不存在时根本不会返回数据。所以场景②不会报错。