PLSQL例外

例外,相当于java中的异常,是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。

有三种类型的异常错误

1、预定义(Predefined)错误

ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。

2、非预定义(Predefined)错误

即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。

3、用户定义(User_define)错误

程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

预定义的异常处理

对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。

WHEN 异常错误信息名称 THEN ...

--使用oracle系统内置例外,查询100号部门的员工姓名,演示没有找到数据【no_data_found】
declarepename varchar2(20);
beginselect ename into pename from emp where deptno = 100;dbms_output.put_line(pename);
exceptionwhen NO_DATA_FOUND then dbms_output.put_line('查无该部门员工');
end;
/

非预定义的异常处理

对于这类异常情况的处理,首先必须对非定义的ORACLE错误进行定义。步骤如下:

1、在PL/SQL块的定义部分定义异常情况:

<异常情况>  EXCEPTION;

2、将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:

PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理:

WHER <异常情况> THEN ...
WHER OTHERS THEN ...
--删除指定部门的记录信息,以确保该部门没有员工。
INSERT INTO departments VALUES(50, ‘FINANCE‘, ‘CHICAGO‘);
DECLAREv_deptno departments.department_id%TYPE := &deptno;deptno_remaining EXCEPTION;PRAGMA EXCEPTION_INIT(deptno_remaining, –2292);/* -2292 是违反一致性约束的错误代码 */
BEGINDELETE FROM departments WHERE department_id = v_deptno;
EXCEPTIONWHEN deptno_remaining THEN DBMS_OUTPUT.PUT_LINE(‘违反数据完整性约束!’);WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLCODE||‘—‘||SQLERRM);
END;
/

用户自定义的异常处理

当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。对于这类异常情况的处理,步骤如下:

1、 在PL/SQL块的定义部分定义异常情况:

<异常情况>  EXCEPTION;

2、在BEGIN节中抛出异常:

RAISE <异常情况>;

3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理:

WHER <异常情况> THEN ...
WHER OTHERS THEN ...
--使用用户自定义例外,使用光标cursor,查询10/20/30/100号部门的员工姓名,演示没有找到数据【nohave_emp_found】
declare--游标cursor cemp(pdeptno number) is select ename from emp where deptno=pdeptno;--例外nohave_emp_found exception;--变量pename emp.ename%type;
begin--打开游标,这时游标位于第一条记录之前open cemp(&xx);--向下移动游标一次,指定第一条记录fetch cemp into pename;--判断if cemp%notfound then--抛异常raise nohave_emp_found;else--输出变量pename的值dbms_output.put_line(pename);--循环loop--向下移动游标一次,指向第二条记录fetch cemp into pename;--如果找不到记录,就退出exit when cemp%notfound;--输出变量pename的值dbms_output.put_line(pename);end loop;end if;close cemp;
exceptionwhen nohave_emp_found thendbms_output.put_line('查无此部门员工');
end;
/ 

异常处理函数

由于ORACLE 的错信息最大长度是512字节,为了得到完整的错误提示信息,我们可用SQLERRM和SUBSTR 函数一起得到错误提示信息,方便进行错误,特别是如果WHEN OTHERS异常处理器时更为方便。

SQLCODE:返回遇到的Oracle错误号

SQLERRM:返回遇到的Oracle错误信息

WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLCODE||‘——‘||SQLERRM);
--将ORACLE错误代码及其信息存入错误代码表
CREATE TABLE errors (errnum NUMBER(4), errmsg VARCHAR2(100));
DECLAREerr_msg VARCHAR2(100);
BEGIN/*  得到所有 ORACLE 错误信息  */FOR err_num IN –100 .. 0 LOOPerr_msg := SQLERRM(err_num);INSERT INTO errors VALUES(err_num, err_msg);END LOOP;
END;
/

Oracle:PLSQL例外相关推荐

  1. 【转】oracle PLSQL基础学习

    [转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...

  2. mysql plsql循环语句吗,Oracle PLSQL 在游标中用while循环实例程序

    Oracle PLSQL 在游标中用while循环实例程序 Oracle PLSQL 在游标中用while循环实例程序 Oracle PLSQL 在游标中用while循环实例程序 declare cu ...

  3. lower() oracle,PLSQL LOWER用法及代码示例

    PLSQL LOWER函数用于将指定字符串中的所有字母都转换为小写.如果字符串中的字符不是字母,则不受此功能的影响. 要转换的char可以是任何数据类型,例如CHAR,VARCHAR2,NCHAR,N ...

  4. Oracle PLSQL 导出数据table xx contains one or more CLOB columns 解决方案

    Oracle PLSQL 导出数据table xx contains one or more CLOB columns 解决方案 参考文章: (1)Oracle PLSQL 导出数据table xx ...

  5. plsql例外_大例外背后的真相

    plsql例外 异常可能是最被滥用的Java语言功能. 这就是为什么 让我们打破一些神话. 没有牙仙子. 圣诞老人不是真实的. TODO评论. finalfinalversion-final.pdf. ...

  6. oracle中plsql块的结构,oracle plsql的结构

    变量声明部分(没有变量可以不写declare) begin 执行部分 exception 异常处理部分 end *:declare 和 exception部分是可选的 (1)PL/sql中变量的定义 ...

  7. oracle sum函数返回类型,Oracle / PLSQL SUM函数

    这个Oracle教程解释了如何使用Oracle / PLSQL SUM函数. SUM(x) 添加x中的所有值,并返回总和. SUM函数对一组行进行操作,并返回一行输出. Null值被SUM函数忽略.您 ...

  8. oracle提交数据按键,Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)...

    Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link) 有没有办法只通过数据库链接而不是当前会话的数据提交在表上插入/更新的 ...

  9. Oracle/PLSQL Repeat Until Loop

    Oracle/PLSQL: Repeat Until Loop Oracle doesn't have a Repeat Until loop, but you can emulate one. Th ...

最新文章

  1. 08_传智播客iOS视频教程_Foundation框架
  2. 成功解决 OSError: [WinError 193] %1 不是有效的 Win32 应用程序
  3. 通过 getResources 找不到jar包中的资源和目录的解决方法
  4. virtualbox ,centos 的多网卡如何设置
  5. 关于“H5小游戏源代码如何转换微信小游戏发布”
  6. 动态添加SqlParameter
  7. python绘制箱线图-python绘制箱线图
  8. 反正切熵(Arctangent entropy):2022.7月最新SCI论文
  9. 24基础指标、macd指标详解、macd指标分析
  10. python小游戏_课程设计_期末大作业——小游戏合集(含源代码)
  11. Kubeedge 1.5 部署指南
  12. python turtle画动物_用python画简单的动物
  13. html5 canvas图片缩放,拖拽
  14. 线性方程组个数和方程未知数与方程解的关系
  15. datagrip 导出数据库表结构
  16. 【Linux】文件类型
  17. Vue使用Stompjs接收Activemq的信息
  18. Python 抓取新浪财经股票数据
  19. ctfhub JWT
  20. html5 jquery 鼠标拖动例子,jquery实现鼠标拖动实现DIV排序示例代码

热门文章

  1. 华硕飞行堡垒安装Ubuntu16.04
  2. DM数据库体系结构(易理解版)
  3. 移动边缘计算意味着真正的5G时代已经来临
  4. 2023 安卓 iapp画质助手源码
  5. Zookeeper分布式应用协调软件的核心概念以及部署
  6. 如何学JavaScript?前辈的经验之谈
  7. Https 公钥私钥交换过程
  8. Vue后台 - 利用 mockjs 完成数据的获取、编辑、增加、删除和分页【详细步骤篇】
  9. (摘自网络)范跑跑对话录
  10. catboost参数详解及实战(强推)