ORACLE异常处理及函数

 

 

 

有三种类型的异常错误 :
预约义 ( Predefined )错误
ORACLE预约义的异常状况大约有24个。对这种异常状况的处理,无需在程序中定义,由ORACLE自动将其引起。 数据库


非预约义 ( Predefined )错误
即其余标准的ORACLE错误。对这种异常状况的处理,须要用户在程序中定义,而后由ORACLE自动将其引起。编程


用户定义(User_define) 错误
程序执行过程当中,出现编程人员认为的非正常状况。对这种异常状况的处理,须要用户在程序中定义,而后显式地在程序中将其引起。app

 

异常处理结构:
异常处理部分通常放在 PL/SQL 程序体的后半部
EXCEPTION
WHEN first_exception THEN <code to handle first exception >
WHEN second_exception THEN <code to handle second exception >
WHEN OTHERS THEN <code to handle others exception >
END;
异常处理能够按任意次序排列,但 OTHERS 必须放在最后 函数


预约义的异常处理编码

 


对于预约义异常状况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常状况名,并对其完成相应的异常错误处理便可。
例: DECLARE
v_empno emp.empno%TYPE :=&empno;
v_sal emp.sal%TYPE;
BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno=v_empno;
IF v_sal<=1500 THEN
UPDATE emp SET sal=sal+100 WHERE empno=v_empno;
DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已更新!');
ELSE
DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已经超过规定值!');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_empno||'的员工');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);
END;spa


非预约义的异常处理
对于这类异常状况的处理,首先必须对非定义的ORACLE错误进行定义
步骤以下:
在PL/SQL 块的声明部分定义异常状况:
<异常状况> EXCEPTION;
将其定义好的异常状况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句
PRAGMA EXCEPTION_INIT(<异常状况>, <错误代码>);
在PL/SQL 块的异常状况处理部分对异常状况作出相应的处理。
deptno_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(deptno_remaining, -2292);
/* -2292 是违反一致性约束的错误代码 */code


用户自定义的异常处理
用户定义的异常错误是经过显式使用 RAISE 语句来触发。当引起一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
对于这类异常状况的处理,步骤以下 :
在PL/SQL 块的声明部分定义异常状况 :
<异常状况> EXCEPTION;
RAISE <异常状况>
在PL/SQL 块的异常状况处理部分对异常状况作出相应的处理blog


DECLARE
v_empno emp.empno%TYPE :=&empno;
no_result EXCEPTION;
BEGIN
UPDATE emp SET sal=sal+100 WHERE empno=v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
EXCEPTION
WHEN no_result THEN
DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);
END;rem

 

 

RAISE_APPLICATION_ERROR函数
例:declare
v_deptid departments.department_id%type := &no;
v_dname departments.department_name%type;
begin
select department_name into v_dname from departments
where department_id = v_deptid;
dbms_output.put_line(v_dname);
exception
when others then
raise_application_error(-20001 , 'department '||v_deptid||' does not exists');
end;io

相关文章
相关标签/搜索