Oracle专题13之异常错误处理
发布时间:2020-12-12 14:10:15 所属栏目:百科 来源:网络整理
导读:1、异常处理的概念与分类 a、什么是异常? 异常:是程序在正常执行过程中发生的未预料的事件。 b、什么是异常处理? 异常处理是为了提高程序的健壮性,使用异常处理部分可以有效地解决程序正常执行过程中可能出现的各种错误,使得程序正常运行。 c、异常处理
1、异常处理的概念与分类a、什么是异常?
b、什么是异常处理?
c、异常处理的语法格式EXCEPTION WHEN first_exception THEN statement1; ...... WHEN second_exception THEN statement1; ...... WHEN OTHERS THEN statement1; ...... d、异常处理代码的PL/SQL块中的位置DECLARE /* * 声明部分--声明变量、常量、复杂数据类型、游标等 */ BEGIN /* * 执行部分--PL/SQL语句和SQL语句 */ EXCEPTION /* * 异常处理部分--处理运行错误 */ END; --块结束标记
DECLARE v_name emp.ename%TYPE; v_sal emp.sal%TYPE; BEGIN SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno = &no; IF v_sal < 3000 THEN dbms_output.put_line(v_name || '的工资是:' || v_sal); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('员工号输入错误!'); WHEN OTHERS THEN dbms_output.put_line('其他错误!'); END; e、异常的分类
2、预定义异常
DECLARE v_name emp.ename%TYPE; v_sal emp.sal%TYPE := &salary; BEGIN SELECT ename INTO v_name FROM emp WHERE sal = v_sal; DBMS_OUTPUT.put_line(v_name || '的工资是:' || v_sal); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('没有该工资的员工'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.put_line('多个员工具有该工资'); WHEN OTHERS THEN DBMS_OUTPUT.put_line('其他错误'); END; 3、非预定义异常
a、非预定义异常的处理包括3步1、在PL/SQL块中定义部分定义异常情况:<异常情况> EXCEPTION; 2、将其定义好的异常情况与标准的ORACLE错误联系起来,使用PRAGMA EXCEPTION_INIT语句:PRAGMA EXCEPTION_INIT(<异常情况>,<错误代码>); 3、在PL/SQL块的异常情况处理部分对异常情况做出相应的处理。 b、代码演示
BEGIN DELETE FROM dept WHERE deptno = &deptno; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLCODE || '###' || SQLERRM); END;
-2292###ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录 2、删除dept表中指定部分的信息: DECLARE --1、定义非预定义异常的标识符 e_fk EXCEPTION; --2、把Oracle错误和异常信息建立关联 -- -2292 违反外键约束的错误号 PRAGMA EXCEPTION_INIT(e_fk,-2292); BEGIN DELETE FROM dept WHERE deptno = &deptno; EXCEPTION WHEN e_fk THEN -- 3、捕捉并处理异常 dbms_output.put_line('此部门下有员工,不能删除!'); WHEN OTHERS THEN dbms_output.put_line(SQLCODE || '###' || SQLERRM); END;
此部门下有员工,不能删除! 4、自定义异常
a、自定义异常的处理步骤
b、示例代码
DECLARE v_empno emp.empno%TYPE := &empno; e_no_result EXCEPTION; BEGIN UPDATE emp SET sal = sal + 100 WHERE empno = v_empno; IF SQL%NOTFOUND THEN RAISE e_no_result; ELSE COMMIT; END IF; EXCEPTION WHEN e_no_result THEN dbms_output.put_line('数据更新失败!'); WHEN OTHERS THEN dbms_output.put_line('其他错误'); END; 5、SQLCODE和SQLERRMa、异常处理函数
b、异常处理函数示例代码
DECLARE v_empno emp.empno%TYPE := &empno; v_ename emp.ename%TYPE := '&ename'; v_deptno emp.deptno%TYPE := &deptno; BEGIN INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno); IF SQL%FOUND THEN DBMS_OUTPUT.put_line('数据插入成功'); COMMIT; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line('错误号:' || SQLCODE); DBMS_OUTPUT.put_line('错误信息:' || SQLERRM); END; c、RAISE_APPLICATION_ERROR
raise_application_error(error_number,message);
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |