定义:程序执行过程的警告或错误成为例外(Exception)
一、常见预定义错误
二、非预定义错误及用户定义错误
(1)非预定义oracle错误
其他标准的oracle错误,可以自定义异常名,将其与指定oracle错误关联,由系统触发。
例子:在PL/SQL定义部分声明
some_bad_error exception;
pragma exception_INIT(some_bad_error,-606);
(2)用户定义的错误
程序执行中出现的编程人员认为的非正常情况。
三、语法
(1)异常定义
myEx exception; --异常定义
pragma exception_INIT(myEx,-606); --异常赋错误码,此行可省略(2)异常抛出
A.已定义异常
raise myEx; --抛出已定义异常
B.未定义异常
raise_application_error(-20000, 'a'); --直接抛出匿名异常
(3)异常处理
exception
when 异常1 [ OR 异常2] then…pl/sql语句
[when 异常3 [ OR 异常4] then]
…
[when others then]
…
end;
例子:
exceptionwhen no_data_found thennull;when some_bad_error thennull;when others thennull;
end;
四、实例
(1)例1
DECLARE v_empno employees.employee_id%TYPE:= &empno;v_sal employees.salary%TYPE;
BEGINSELECT salary INTO v_sal FROM employeesWHERE employee_id = v_empno;IF v_sal<=15000 THENdbms_output.put_line('编码为'||v_empno||'员工该加100元!');ELSEdbms_output.put_line('编码为'||v_empno||'员工工资已经超过规定值!');END IF;
EXCEPTIONWHEN NO_DATA_FOUND THENdbms_output.put_line('数据库中没有编码为'||v_empno||'的员工');WHEN TOO_MANY_ROWS THENdbms_output.put_line('程序运行错误!请使用游标');WHEN OTHERS THENdbms_output.put_line(SQLCODE||'---'||SQLERRM);
END;
(2)例2
set serveroutput on
declare v_name varchar2(20);v_email varchar2(25);v_sal number(8,2);begin --v_name:='test';select first_name, email,salaryinto v_name,v_email,v_salfrom employeeswhere employee_id=102;dbms_output.put_line('姓名:'||v_name||' 邮箱:'||v_email||' 工资:'||v_sal);exceptionwhen no_data_found then dbms_output.put_line('你输入的员工不存在');when others thendbms_output.put_line('other');
end;
(3)例3
set serveroutput on
declare myException exception;begin dbms_output.put_line('准备抛出异常');raise myException; --抛出异常dbms_output.put_line('此行不会输出');exception when myException then dbms_output.put_line(SQLCODE||'---'||SQLERRM); when others then dbms_output.put_line('other');
end;
注意:
输出信息,要设置: Set serveroutput on
输出用: DBMS_OUTPUT.PUT_LINE(‘’);
输入变量用: &变量名
Show error: 命令显示错误
错误代码与解决办法参考: Ora 10G Err_Msg.chm