异常处理"/>
PL/SQL 异常处理
一.异常的定义与基本规则
1.定义与分类
在PL/SQL中 程序员重要是需要掌握解决 运行时发生的逻辑错误.
由于PL/SQL的语法非常简单 所以语法带来的编译错误总能轻松的解决.
在运行时发生的错误和编译时发生的错误都被称为异常.
他们都会报错.
exception number :exception information
异常是由 异常编号:+异常信息组成
基于我在学习ORACLE的第一阶段 ORACLE和PL/SQL所提供的异常 大都能帮助我们解决问题(当然也有一些时候 无法通过异常所给的提示来解决问题)
简单来说,对于 程序员来说,他们的错误可以通过编译器和工具来检查 并告诉你 问题所在
而一旦工具本身出现问题 那基本是一件很棘手的事情 需要等开发团队更新补丁 或者需要找一个技术牛人来解决等等 .
上述我在这里定义的异常 是在工具被开发时就已经被预定义过的异常 它们已经被标好了对应的编号和对应的异常信息 即为预定义异常
这类异常的触发方式是隐式触发:即你不需要提前告诉工具 if xx then xx;
显示触发的自然就是 自定义异常了 需要通过关键字raise来抛出异常 并且一定要在抛出异常后告诉编译器你的 if exc_name then handle code;
自定义编号范围: -20000 到-20900 但信息范围很大
否则也会报错
另外异常的if else语句也要遵循对应的上下规则 顺序不可颠倒
除此之外 还有一类异常 他们已经被工具分类统计了 但是并没有对应的编号和信息 这类异常被称为非预定义异常
二.异常举例以及PL/SQL代码块分层能力
1.隐式抛出和显示抛出
--异常举例
--隐式抛出
DECLARE
EMP_T EMP%ROWTYPE;
BEGIN
--SELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 7369;
--当输入的EMPNO不在EMP表中时 将会报错: ORA-01403:未找到任何数据
SELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 1;
DBMS_OUTPUT.PUT_LINE(EMP_T.SAL);
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('ERROR');--当通过在EXCEPTION中输入对应的异常名称 并给予合适的 handle code 即可应对--目前需要记住两个异常信息--1.no_data_found 2.too_many_rowsDBMS_OUTPUT.PUT_LINE(SQLCODE);--SQLCODE具体内容解析可以自行查找相关信息DBMS_OUTPUT.PUT_LINE(SQLERRM);--异常的编码和信息都在这里--由于这是ORACLE中已经被预定义过的异常 所以SQLERRM信息齐全
END;--显示抛出
DECLARE
EMP_T EMP%ROWTYPE;
MYEXC EXCEPTION;--异常名定义
BEGINSELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 7369;IF EMP_T.SAL<1000 THEN--判断 是否 显示抛出异常 一旦抛出异常 则必须在异常块中提供 handle codeRAISE MYEXC;ELSEDBMS_OUTPUT.PUT_LINE(EMP_T.SAL);END IF;
EXCEPTIONWHEN MYEXC THEN DBMS_OUTPUT.PUT_LINE('ERROR');DBMS_OUTPUT.PUT_LINE(SQLCODE);DBMS_OUTPUT.PUT_LINE(SQLERRM);--这个异常由于ORACLE自己未定义 所以输出SQLCODE是1 输出SQLERRM 是User-Defined Exception
END;
2.定义非预定义异常和 定义自定义异常
--定义异常--定义非预定义异常
DECLARE
MYEXC EXCEPTION;
--用于定义在ORACLE中存在但没有名称的异常
PRAGMA EXCEPTION_INIT(MYEXC,-02292);--只能是这个码 被定义过
--这是我定义的第二个异常
BEGIN DELETE FROM DEPT WHERE DEPTNO = 30;
EXCEPTIONWHEN MYEXC THENDBMS_OUTPUT.PUT_LINE('ERROR');DBMS_OUTPUT.PUT_LINE(SQLCODE);DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;--定义自定义异常
DECLARE
EMP_T EMP%ROWTYPE;
MYEXC EXCEPTION;
BEGINSELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 7369;IF EMP_T.SAL<1000 THEN--关键字 RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERROR(-20001,'这是你的第一个自定义异常');--定义在-20000 到 -20900 间ELSEDBMS_OUTPUT.PUT_LINE(EMP_T.SAL);END IF;
EXCEPTIONWHEN OTHERS THEN --通过OTHERS即可正常输出 并打印这三行信息DBMS_OUTPUT.PUT_LINE('ERROR');DBMS_OUTPUT.PUT_LINE(SQLCODE);DBMS_OUTPUT.PUT_LINE(SQLERRM);END;--自定义 定义自定义异常
DECLARE
EMP_T EMP%ROWTYPE;
MYEXC EXCEPTION;
BEGINSELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 7369;IF EMP_T.SAL<1000 THEN--关键字 RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERROR(-20001,'这是你的第一个自定义异常');--定义在-20000 到 -20900 间RAISE MYEXC;--不能和定义异常同时用?ELSEDBMS_OUTPUT.PUT_LINE(EMP_T.SAL);END IF;
EXCEPTIONWHEN MYEXC THEN --通过OTHERS即可正常输出 并打印这三行信息DBMS_OUTPUT.PUT_LINE('ERROR');DBMS_OUTPUT.PUT_LINE(SQLCODE);DBMS_OUTPUT.PUT_LINE(SQLERRM);WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLCODE);DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
3.PL/SQL 具有分层能力 确保语句不被在一个BEGIN内干扰.
更多推荐
PL/SQL 异常处理
发布评论