PL/SQL 异常处理

编程入门 行业动态 更新时间:2024-10-20 20:46:52

PL/SQL <a href=https://www.elefans.com/category/jswz/34/1771210.html style=异常处理"/>

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 异常处理

本文发布于:2024-02-25 16:35:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1699623.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:异常   PL   SQL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!