Oracle11g 如何处理输入参数过程中的异常
我希望输入参数出现陷阱异常:Oracle11g 如何处理输入参数过程中的异常,oracle11g,exception-handling,procedure,Oracle11g,Exception Handling,Procedure,我希望输入参数出现陷阱异常: create or replace procedure dept_employee_info (P_deptno in emp.deptno%type) is CURSOR employee is select * from emp where deptno = p_deptno; v_employee employee%rowtype; dept_employee_number number:
create or replace procedure
dept_employee_info (P_deptno in emp.deptno%type)
is
CURSOR employee is
select * from emp
where deptno = p_deptno;
v_employee employee%rowtype;
dept_employee_number number:=0;
dept_total_sal number :=0;
dept_max_salary number :=0;
dept_avg_sal number :=0;
BEGIN
BEGIN
dbms_output.put_line (p_deptno||' employee information ');
OPEN employee ;
LOOP
FETCH employee into v_employee;
EXIT WHEN employee%notfound;
dbms_output.put_line (rpad(v_employee.empno,5)||rpad(v_employee.ename,12)
||rpad(v_employee.job,12)
||rpad(v_employee.mgr,5)||rpad(v_employee.hiredate,12)||rpad(v_employee.sal,8)
||rpad(nvl(v_employee.comm,0) ,8)||rpad(v_employee.deptno,4));
dept_employee_number :=dept_employee_number+1;
dept_total_sal :=dept_total_sal+v_employee.sal;
IF dept_max_salary < v_employee.sal then
dept_max_salary :=v_employee.sal;
END IF;
END LOOP ;
if employee%rowcount=0 then
raise no_data_found ;
end if;
CLOSE EMPLOYEE;
EXCEPTION --inner block exception
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('inner bock error no data found raising into outer exception block');
RAISE no_data_found;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('ERROR CODE : '||SQLCODE||CHR(10)||'ERORR MESSAGE '||SUBSTR(SQLERRM,1,100));
END ;
dept_avg_sal :=round( to_number(dept_total_sal/dept_employee_number),3);
dbms_output.put_line ( 'employee number : '||dept_employee_number||chr(10)
||'total salary is : '||dept_total_sal||chr(10)
||'max salalry is : '||dept_max_salary||chr(10)
||'avrage salary : '||dept_avg_sal) ;
EXCEPTION --outer block exception
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('no data found raise from inner block');
WHEN OTHERS THEN
dbms_output.put_line ('outer block error;'||sqlcode||chr(10)||sqlerrm);
END DEPT_EMPLOYEE_INFO;
输入参数是数字数据类型,但如果有人传递其他任何东西,则
我们将如何捕获异常
如果我执行这样的过程
execute DEPT_EMPLOYEE_INFO(30A);
然后我收到错误消息,如何处理此异常?请更清楚地说明您正在尝试执行的操作。如果希望在使用非数值调用过程时引发异常,为什么不能在参数中使用数字定义过程?或者,是否要从过程中处理异常?我要跟踪异常并向用户显示一条消息“请检查输入值,它不是数字”
execute DEPT_EMPLOYEE_INFO(30A);