我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle对PL/SQL中的异常处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle对PL/SQL中的异常处理

一、异常处理

PL/SQL提供了良好的异常处理机制,当程序运行出现错误时就会触发异常。异常被触发时,程序执行即终止,在PL/SQL块中提供了异常处理的部分,从而可以捕获一个异常进行特殊处理。

1、三种的异常类型:

  • 预定义 ( Predefined )错误: 
    --ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。
  • 非预定义 ( Predefined )错误: 
    --即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。
  • 用户定义(User_define) 错误: 
    --程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

2、异常的SQLCode 和 SQLERRM

EXCEPTION
WHEN first_exception THEN <code to handle first exception >
WHEN second_exception THEN <code to handle second exception >
WHEN OTHERS THEN <code to handle others exception >
END;

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

  • SQLCODE 返回遇到的Oracle 错误号
  • SQLERRM 返回遇到的Oracle错误信息

二、处理预定义例外

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

常见错误预定义的名称

  • ACCESS_INTO_NULL(ORA-06530):引用对象类型变量的属性时,未对变量进行初始化;
  • CASE_NOT_FOUND(ORA-06592):使用case-when结构时,未使用else子句,并且处理了不包含的case条件;
  • COLLECTION_IS_NULL(ORA-06531):引用集合类型元素时,未对集合类型变量初始化;
  • CURSOR_ALREADY_OPEN(ORA-06511):使用open命令打开已经处于打开状态的显式游标;
  • DUL_VAL_ON_INDEX(ORA-00001):在唯一约束的列上插入重复的值时会触发;
  • INVALID_NUMBER(ORA-01722):不能将字符转换为合理的数字时会触发;
  • NO_DATA_FOUND(ORA-01403):select语句未返回行或引用未初始化的索引表元素;
  • TOO_MANY_ROWS(ORA-01422):select into时,返回数据超过一行时即被触发;
  • ZERO_DEVIDE(ORA-01476):除0异常;
  • SUBSCRIPT_BEYOUND_COUNT(ORA-06533):使用数组类型是,下标超出元素范围;
  • SUBSCRIPT_OUTSIDE_LIMIT(ORA-06532):使用嵌套表或Varry元素时,使用了负数作为下标;
  • VALUE_ERROR(ORA-06502):赋值操作时,变量长度不足以容纳实际数据长度
  • ROWTYPE_MISMATCH(ORA-06504):位游标变量赋值时,返回类型与游标定义类型不一致
--例1:更新指定员工工资,如工资小于1500,则加100;
DECLARE
   v_empno employees.employee_id%TYPE := &empno;
   v_sal   employees.salary%TYPE;
BEGIN
   SELECT salary INTO v_sal FROM employees WHERE employee_id = v_empno;
   IF v_sal<=1500 THEN 
        UPDATE employees SET salary = salary + 100 WHERE employee_id=v_empno; 
        DBMS_OUTPUT.PUT_LINE(‘编码为‘||v_empno||‘员工工资已更新!‘);     
   ELSE
        DBMS_OUTPUT.PUT_LINE(‘编码为‘||v_empno||‘员工工资已经超过规定值!‘);
   END IF;
EXCEPTION
   WHEN NO_DATA_FOUND THEN  
      DBMS_OUTPUT.PUT_LINE(‘数据库中没有编码为‘||v_empno||‘的员工‘);
   WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE(‘程序运行错误!请使用游标‘);
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||‘—‘||SQLERRM);
END;

三、处理非预定义例外(exception_init)

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

  • 在PL/SQL 块的定义部分定义异常情况:
<异常情况> EXCEPTION;
  • 将系统异常转为用户定义异常:将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:
PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

举例:

--例2:删除指定部门的记录信息,以确保该部门没有员工。
 
INSERT INTO departments VALUES(50, ‘FINANCE‘, ‘CHICAGO‘);
DECLARE
   v_deptno departments.department_id%TYPE := &deptno;
   deptno_remaining EXCEPTION;--定义一个异常变量
   PRAGMA EXCEPTION_INIT(deptno_remaining, –2292); 
BEGIN
   DELETE FROM departments WHERE department_id = v_deptno;
EXCEPTION
   WHEN deptno_remaining THEN 
      DBMS_OUTPUT.PUT_LINE(‘违反数据完整性约束!‘);
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||‘—‘||SQLERRM);
END;

四、处理自定义例外(通过Raise )

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

  • 在PL/SQL 块的定义部分定义异常情况:
<异常情况> EXCEPTION;
RAISE <异常情况>;
  • 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
--例3:更新指定员工工资,增加100;
 
DECLARE
   v_empno employees.employee_id%TYPE :=&empno;
   no_result  EXCEPTION;-定义异常
BEGIN
   UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
   IF SQL%NOTFOUND THEN
      RAISE no_result;//触发异常
   END IF;
EXCEPTION
   WHEN no_result THEN //捕捉异常
      DBMS_OUTPUT.PUT_LINE(‘你的数据更新语句失败了!‘);
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||‘—‘||SQLERRM);

五、应用程序的异常处理。(通过Raise_Application_Error )

调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。

RAISE_APPLICATION_ERROR 的语法如下:

RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors] );
  • error_number:从 –20,000 到 –20,999 之间的参数,
  • error_message:是相应的提示信息(< 2048 字节),
  • keep_errors:可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。

例:创建一个函数get_salary, 该函数检索指定部门的工资总和,其中定义了-20991和-20992号错误,分别处理参数为空和非法部门代码两种错误:

CREATE OR REPLACE FUNCTION get_salary(p_deptno NUMBER) #函数检索指定部门的工资总和
RETURN NUMBER 
AS
  v_sal NUMBER; #函数get_salary返回v_sal值
BEGIN
  IF p_deptno IS NULL THEN
    RAISE_APPLICATION_ERROR(–20991, '部门代码为空'); #用户定义的异常处理
  ELSIF p_deptno<0 THEN
    RAISE_APPLICATION_ERROR(–20992, '无效的部门代码');
  ELSE
    SELECT SUM(employees.salary) INTO v_sal FROM employees 
    WHERE employees.department_id=p_deptno;
    RETURN v_sal;
  END IF;

调用函数

DECLARE 
  V_salary NUMBER(7,2);
  V_sqlcode NUMBER;
  V_sqlerr VARCHAR2(512);
  Null_deptno EXCEPTION;  #定义异常情况
  Invalid_deptno EXCEPTION; #定义异常情况
  PRAGMA EXCEPTION_INIT(null_deptno,–20991);  #非预定义的异常,将它与oracle错误联系起来
  PRAGMA EXCEPTION_INIT(invalid_deptno, –20992); #非预定义的异常,将它与oracle错误联系起来
BEGIN
  BEGIN
    V_salary :=get_salary(–10);
  EXCEPTION
    WHEN invalid_deptno THEN
      V_sqlcode :=SQLCODE;
      V_sqlerr  :=SQLERRM;
      INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode, v_sqlerr); #将错误SQLCODE及SQLERRM存入到表errlog中  
      COMMIT;
  END ;

例:定义触发器,使用RAISE_APPLICATION_ERROR阻止没有员工姓名的新员式记录插入:

CREATE OR REPLACE TRIGGER tr_insert_emp
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
  IF :new.first_name IS NULL OR :new.last_name is null THEN
    RAISE_APPLICATION_ERROR(–20000,‘Employee must have a name.‘);
  END IF;

到此这篇关于Oracle对PL/SQL异常处理的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle对PL/SQL中的异常处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PL/SQL异常处理机制是什么

PL/SQL异常处理机制是一种用于处理运行时错误和异常情况的技术。当PL/SQL程序执行过程中发生错误或异常时,可以使用异常处理机制来捕获和处理这些异常,以便程序可以继续执行或者提供更好的错误信息给用户。异常处理机制通常包括以下几个关键步
PL/SQL异常处理机制是什么
2024-05-08

PHP 异常处理:对错误和异常的全面处理

异常处理是 php 中处理错误和异常的重要机制,提高了应用程序的健壮性和稳定性。错误由解释器抛出,表示无法恢复的严重问题。异常由代码抛出,表示可恢复的运行时问题。php 提供了 error、exception 和 throwable 类来处
PHP 异常处理:对错误和异常的全面处理
2024-05-11

PHP异常处理:处理异步操作中的异常

处理异步操作中的 php 异常需要:协程中,使用 try-catch-finally 语法捕获异常。promise 中,使用 then() 和 catch() 方法处理异常。实战案例:使用协程处理 http 请求中的异常,并捕获和处理异常。
PHP异常处理:处理异步操作中的异常
2024-05-14

变量在Oracle异常处理中的作用

在Oracle异常处理中,变量主要用于存储和操作错误信息SQLCODE:SQLCODE是一个预定义的变量,用于存储最近执行的SQL语句产生的错误代码。当发生异常时,可以使用SQLCODE来获取错误代码,以便进行相应的处理。SQLERRM:S
变量在Oracle异常处理中的作用
2024-08-28

C++ 技术中的异常处理:异常处理对程序性能的影响有哪些?

异常处理对 c++++ 程序性能的影响包括:异常抛出和捕获会导致堆栈操作和额外的代码路径。动态内存分配可能导致内存碎片化。优化技巧包括避免过度异常、优化异常处理程序、使用 noexcept 规范和异常规范。C++ 技术中的异常处理:异常处理
C++ 技术中的异常处理:异常处理对程序性能的影响有哪些?
2024-05-09

PHP异常处理:理解异常对象的属性和方法

php 异常对象提供重要异常信息。其属性包括:错误消息(getmessage())、错误代码(getcode())、异常文件路径(getfile())、异常文件行号(getline())、前一个异常(getprevious())。其方法包括
PHP异常处理:理解异常对象的属性和方法
2024-05-14

Python 中的异常处理

异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不部分高级语言一样,使用了try/except/finally语句块来处理异常,如果你有其他
2023-01-31

STL 中的函数对象如何处理异常?

stl的函数对象可处理异常。stl算法通过catch语句自动捕获函数对象抛出的异常并转发给调用算法的函数,从而确保异常的正确处理。STL 中的函数对象如何处理异常函数对象是 STL 中一种轻量级、可调用的类型,它可以在容器算法中作为操作元
STL 中的函数对象如何处理异常?
2024-04-26

C++ 技术中的异常处理:异常处理对程序可读性有什么影响?

异常处理提升了 c++++ 代码的可读性,因为它:分离了错误处理逻辑,使代码更加清晰易懂。简化了错误处理,提供统一的方法处理不同类型的异常。提高了代码可靠性,能处理不可恢复的错误,防止程序意外终止。C++ 技术中的异常处理:对程序可读性的影
C++ 技术中的异常处理:异常处理对程序可读性有什么影响?
2024-05-09

PL/SQL中的并行处理技术怎么实现

在PL/SQL中实现并行处理技术通常可以通过以下几种方式来实现:使用并行循环:可以通过使用FORALL语句结合BULK COLLECT功能来实现并行处理。FORALL语句允许一次性提交多个DML操作,而不是逐条提交,从而提高处理效率。使用并
PL/SQL中的并行处理技术怎么实现
2024-05-08

Spring Boot中怎么对异常进行处理

今天就跟大家聊聊有关Spring Boot中怎么对异常进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。先谈谈“异常处理”这件事。下面有 2 份伪代码,对比下:// ① 基于 i
2023-05-31

MyBatis ORM的SQL语句条件异常处理

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,你可以使用动态 SQL 来处理不同的条件,以实现更灵活的查询。要处理 MyBatis ORM 的 SQL 语句条件异常,你可以采用
MyBatis ORM的SQL语句条件异常处理
2024-09-11

Oracle中如何编写异常处理代码

在Oracle中,异常处理代码通常使用PL/SQL语言来编写。以下是一个示例:DECLAREv_num1 NUMBER := 10;v_num2 NUMBER := 0;v_result NUMBER;BEGINv_result := v
Oracle中如何编写异常处理代码
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录