关于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错误???
------解决方案--------------------不知道是不是因为你empno和deptno的类型不同引起的
------解决方案--------------------单步跟下试试吧
------解决方案--------------------select ... into ..from table_name
这个语句导致的,你要看下是不是没有查到数据
把你传入的参数带入去验证下
------解决方案--------------------
AVG函数在数据不存在时返回NULL(有返回值,只是值为NULL),而普通的SELECT ..INTO 在数据不存在时根本不会返回数据。所以场景②不会报错。