例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
系统例外
No_Data_Found
--系统例外:no_data_found
DECLARE
pename emp.ename%TYPE;
BEGIN
--查询员工号是1234的员工姓名
SELECT ename INTO pename FROM emp WHERE empno=1234;
EXCEPTION
WHEN no_data_found THEN dbms_output.put_line('没有找到该员工');
WHEN OTHERS THEN dbms_output.put_line('其他例外');
END;
too_many_rows
--系统例外:too_many_rows
DECLARE
pename emp.ename%TYPE;
BEGIN
--查询所有10号部门的员工姓名
SELECT ename INTO pename FROM emp WHERE deptno=10;
EXCEPTION
WHEN too_many_rows THEN dbms_output.put_line('SELECT INTO 匹配了多行');
WHEN OTHERS THEN dbms_output.put_line('其他例外');
END;
zero_divide
--系统例外:zero_divide
DECLARE
pnum NUMBER;
BEGIN
pnum := 1/0;
EXCEPTION
WHEN zero_divide THEN dbms_output.put_line('0不能做被除数');
WHEN OTHERS THEN dbms_output.put_line('其他例外');
END;
value_error
--系统例外:value_error
DECLARE
pnum NUMBER;
BEGIN
pnum := 'abc';
EXCEPTION
WHEN value_error THEN dbms_output.put_line('算数或者转换错误');
WHEN OTHERS THEN dbms_output.put_line('其他例外');
END;
自定义例外
定义变量,类型是exception,使用raise抛出自定义例外
--自定义例外:查询50号部门的员工姓名
DECLARE
--定义游标,代表50号部门的员工姓名
CURSOR cemp IS SELECT ename FROM emp WHERE deptno=50;
pename emp.ename%TYPE;
--自定义例外
no_emp_found EXCEPTION;
BEGIN
OPEN cemp;
FETCH cemp INTO pename;
IF cemp%NOTFOUND THEN
--抛出例外
RAISE no_emp_found;
END IF;
--Oracle自动启动pmon(process monitor)自动关闭游标
CLOSE cemp;
EXCEPTION
WHEN no_emp_found THEN dbms_output.put_line('没有找到员工');
WHEN OTHERS THEN dbms_output.put_line('其他例外');
END;