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);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('ERROR');
    --当通过在EXCEPTION中输入对应的异常名称 并给予合适的 handle code 即可应对
    --目前需要记住两个异常信息
    --1.no_data_found  2.too_many_rows
    DBMS_OUTPUT.PUT_LINE(SQLCODE);--SQLCODE具体内容解析可以自行查找相关信息
    DBMS_OUTPUT.PUT_LINE(SQLERRM);--异常的编码和信息都在这里
    --由于这是ORACLE中已经被预定义过的异常 所以SQLERRM信息齐全
END;

--显示抛出
DECLARE
EMP_T EMP%ROWTYPE;
MYEXC EXCEPTION;--异常名定义
BEGIN
  SELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 7369;
  IF EMP_T.SAL<1000 THEN--判断 是否 显示抛出异常 一旦抛出异常 则必须在异常块中提供 handle code
  RAISE MYEXC;
  ELSE
  DBMS_OUTPUT.PUT_LINE(EMP_T.SAL);
  END IF;
EXCEPTION
   WHEN 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;
EXCEPTION
  WHEN MYEXC THEN
    DBMS_OUTPUT.PUT_LINE('ERROR');
    DBMS_OUTPUT.PUT_LINE(SQLCODE);
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;




--定义自定义异常
DECLARE
EMP_T EMP%ROWTYPE;
MYEXC EXCEPTION;
BEGIN
  SELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 7369;
  IF EMP_T.SAL<1000 THEN
    --关键字 RAISE_APPLICATION_ERROR
  RAISE_APPLICATION_ERROR(-20001,'这是你的第一个自定义异常');--定义在-20000 到 -20900 间
  ELSE
  DBMS_OUTPUT.PUT_LINE(EMP_T.SAL);
  END IF;
EXCEPTION
   WHEN 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;
BEGIN
  SELECT SAL INTO EMP_T.SAL FROM EMP WHERE EMPNO = 7369;
  IF EMP_T.SAL<1000 THEN
    --关键字 RAISE_APPLICATION_ERROR
  RAISE_APPLICATION_ERROR(-20001,'这是你的第一个自定义异常');--定义在-20000 到 -20900 间
  RAISE MYEXC;--不能和定义异常同时用?
  ELSE
  DBMS_OUTPUT.PUT_LINE(EMP_T.SAL);
  END IF;
EXCEPTION
   WHEN MYEXC THEN  --通过OTHERS即可正常输出 并打印这三行信息
    DBMS_OUTPUT.PUT_LINE('ERROR');
    DBMS_OUTPUT.PUT_LINE(SQLCODE);
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLCODE);
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

3.PL/SQL 具有分层能力 确保语句不被在一个BEGIN内干扰.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值