1、异常处理
<<exception_01>>
DECLARE
v_n1 INTEGER := &v_n1;
v_n2 INTEGER := &v_n2;
v_result NUMBER;
BEGIN
v_result := v_n1 v_n2;
DBMS_OUTPUT.put_line ('v_result:' || v_result);
EXCEPTION
WHEN ZERO_DIVIDE
THEN
DBMS_OUTPUT.put_line ('除数为0');
END exception_01;
2、内置异常
--no_data_found:当没有调用分组函数(例如sum 或者count等)时select into语句没有任何数据行,此时就会抛出这个异常。
--too_many_rows:当select into语句返回多个数据行时,就会抛出这个异常。
--zero_divide:当程序中除法运算的除数是0时,就会抛出这个异常。
--login_denied:当用户尝试使用无效的用户名或者密码登陆oracle时,就会抛出这个异常。
--program_error:当PL/SQL程序存在某个内部问题时,就会抛出这个异常。
--value_error:当出现转换或者大小匹配错误时,会抛出这个异常。
--dup_value_on_index:当程序尝试在定义唯一性索引的数据列中保持重复值时,会抛出这种异常。
3、自定义异常
/*自定义异常*/
<<exception_02>>
DECLARE
e_name EXCEPTION;
BEGIN
raise e_name;
EXCEPTION
WHEN e_name
THEN
DBMS_OUTPUT.put_line ('name error');
END exception_02;
4、异常传播
当PL/SQL语句块的声明部分出现运行时错误时,该语句块的异常处理部分不能捕获此错误。
当内部语句块的声明部分发生运行时错误时,该异常会立即传播到外部语句块。
当PL/SQL语句块的异常处理部分发生运行时错误时,该语句块的异常处理部分不能防止这个错误。
当内部语句块的异常处理部分发生运行时错误时,该异常会立即传播到外部语句块。
/* 再次抛出异常 */
DECLARE
e_excep EXCEPTION;
BEGIN
--inner block
BEGIN
RAISE e_excep;
EXCEPTION
WHEN e_excep
THEN
RAISE e_excep;
END;
EXCEPTION
WHEN e_excep
THEN
DBMS_OUTPUT.put_line ('error');
END;
5、异常:高级概念
raise_application_error是oracle 提供的一种特殊的内置过程,允许程序员为特定应用程序创建有意义的错误消息。raise_application_error 过程适用于用户定义异常。
raise_application_error(error_number,error_message)或者raise_application_error(error_number,error_message,keep_errors);
--error_number是与特定错误消息相关联的错误编号。这个编号的范围在-20999和-20000之间。
--error_message是错误文本,最多包含2048个字符。
--keep_errors是可选的boolean参数,如果设置为ture,新错误会被添加到已经抛出的错误列表中。这种错误列表被称为错误栈。如果keep_errors被设置为false,新错误会替换已经抛出的错误栈。keep_errors参数默认值是flase。
DECLARE
v_id test01.id%TYPE := &v_id;
BEGIN
IF v_id > 6
THEN
raise_application_error (-20001, 'error');
END IF;
END;
6、exception_init编译指令
declare
exception_name exception;
pragma exception_init(exception_name,error_code);
用户定义异常的声明出现在所使用的exception_init编译指令之前。
exception_name 是异常的名称,
error_code是希望与该异常建立关联的oracle错误编号。
DECLARE
v_id test01.id%TYPE := &v_id;
e_excep EXCEPTION;
PRAGMA EXCEPTION_INIT (e_excep, -20222);
BEGIN
IF v_id > 6
THEN
raise_application_error (-20222, 'error');
END IF;
EXCEPTION
WHEN e_excep
THEN
DBMS_OUTPUT.put_line ('oracle -20222,error');
END;
7、sqlcode 和 sqlerrm
用于实现others异常处理程序。
sqlcode函数返回oracle错误编号。
sqlerrm函数返回错误消息。最大长度512字节。
DECLARE
v_id test01.id%TYPE := &v_id;
v_name test01.name%TYPE;
e_code NUMBER;
e_msg VARCHAR2 (200);
BEGIN
SELECT name INTO v_name FROM test01 WHERE id = v_id;
EXCEPTION
WHEN OTHERS
THEN
e_code := SQLCODE;
e_msg := SUBSTR (SQLERRM, 1, 200);
DBMS_OUTPUT.put_line ('code ' || e_code || ' msg ' || e_msg);
END;
本公众号是个人学习工作笔记,希望大家发现问题能及时和我本人沟通,希望你与我共同成长。个人微信zgjt12306。

欢迎关注“自学Oracle”




