在存储过程执行的过程中,经常因为数据或者其他问题产生异常(condition)。根据业务逻辑,存储过程应该对异常进行相应处理或直接返回给调用者。此处暂且将condition译为异常以方便读者理解。实际上有些异常(condition)并非是由于错误引起的,下面将详细讲述。
当存储过程中的语句返回的SQLSTATE值超过00000的时候,就表明在存储过程中产生了一个异常(condition),它表示出现了错误、数据没有找到或者出现了警告。为了响应和处理存储过程中出现的异常,我们必须在存储过程体中声明异常处理器(condition handler),它可以决定存储过程怎样响应一个或者多个已定义的异常或者预定义异常组。声明条件处理器的语法如下,它会位于变量声明和游标声明之后:
声明异常处理器
DECLARE handler-type HANDLER FOR condition handler-action
异常处理器类型(handler-type)有以下几种:
CONTINUE 在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。
EXIT 在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
UNDO 在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:
NOT FOUND 标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。
SQLEXCEPTIOIN 标识导致SQLCODE值为负的异常。
SQLWARNING 标识导致警告异常或者导致+100以外的SQLCODE正值的异常。
如果产生了NOT FOUND 或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。
以下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为"ABORTED",并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。
清单5:异常处理器示例
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
SET stmt = 'ABORTED';
|
DECLARE UNDO HANDLER FOR NOT FOUND;
|
如果预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下:
清单6:定制异常处理器
DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
|
处理器可以由单独的存储过程语句定义,也可以使用由BEGIN…END块界定的复合语句定义。注意在执行符合语句的时候,SQLSATE和SQLCODE的值会被改变,如果需要保留异常前的SQLSATE和SQLCODE,就需要在执行复合语句的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。
通常,我们会为存储过程定义一个执行状态的输出参数(例如:poGenStatus)。
根据这个输出状态,可以表明存储过程是否正确执行完毕。我们需要定义一些异常处理器为这个输出参数赋值。
异常处理例子:
create table test(id int, num int)
insert into test values(1,30),(2,40),(3,50)
没有定义异常处理的时候:
create procedure Test(
OUT sum int
)
LANGUAGE SQL
BEGIN
declare v_num int;
select id into v_num from test where id > 1;
set sum = v_num;
END@
调用时出现这样的结果
call Test(?)
SQL0811N 标量全查询、SELECT INTO 语句或 VALUES INTO 语句的结果有多行。
SQLSTATE=21000
Statement processed with ERROR.
有异常处理的时候:
create procedure Test(
OUT sum int
)
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INT;
DECLARE v_errCode INT DEFAULT 0;
DECLARE v_num int;
--------------------------------------------------------
--定义异常处理
--------------------------------------------------------
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
SET v_errCode = SQLCODE;
END;
select id into v_num from test where id > 1;
set sum = v_num;
RETURN v_errCode;
END@
调用时的结果:
call Test(?)
completed successfully.
输出参数的值
--------------------------
参数名: SUM
参数值: -
返回状态 = -811
Statement processed successfully in 0.23 secs.
可以看到,没有异常处理的时候,程序出现错误就崩溃了,并不能继续正常运行。而有异常处理的时候,出现错误程序会继续正常运行,并返回错误代码。
分享到:
相关推荐
异常处理是每个应用程序都会用到的,纵然在程序编写期间我们都会最大限度的考虑可能发生的异常并进行相应的处理,但是往往并不能完全考虑周全,百密一疏,出现未处理异常而导致程序出错,数据丢失,如用户输入错误...
一个`__try`块包含了可能会抛出异常的代码,而`__except`块则包含处理异常的代码。值得注意的是,`__try`块后面必须跟一个`__except`或`__finally`块,但不能同时存在两者。然而,`__try`-`__except`块可以嵌套在`__...
1.文件包括污水处理异常工况的数据集 2.文件包括污水处理异常工况迁移学习的网络结构best1.mat 3.文件包括污水处理异常工况,论文50篇左右 4.文件配合博主文章进行讲解使用,readme important.txt文件查看目录 5....
### 第07章 处理异常和错误 #### 异常的概念 在计算机编程中,异常(Exception)指的是程序在运行过程中出现的错误或者非预期的行为。这些异常情况包括但不限于除以零的操作、代码语法错误、操作系统资源不可用等...
前一章讨论了当一个异常过滤器返回 E X C E P T I O N _ C O N T I N U E _ S E A R C H时会发生什么事 情。返回EXCEPTION_CONTINUE_SEARCH 是...在这种情况下,就出现了所谓的“未处理异常”(Unhandled exception)。
抛出异常是指程序中出现错误时,抛出异常对象,以便于捕获和处理异常。捕获异常是指使用 catch 语句捕获抛出的异常对象,并进行相应的处理。 实验代码 ```java class Example1 { static void method() { int a = ...
Spring Cloud Gateway默认使用`DefaultErrorWebExceptionHandler`类来处理异常,该类继承自`AbstractErrorWebExceptionHandler`,并在内部使用了`ErrorAttributes`和`ResourceProperties`等组件来收集错误信息。...
### UI处理异常知识点详解 #### 异常处理基础概念 在计算机编程中,异常处理是一种用于处理程序运行过程中出现的错误或非预期行为的技术。Java作为一种广泛应用的编程语言,提供了强大的异常处理机制来帮助开发者...
### 精通Java处理异常:深入理解与实践 在Java编程中,异常处理是确保程序稳定性和健壮性的重要机制。本文将深入探讨Java异常处理的核心概念、分类以及如何在实际开发中有效地管理和捕获异常,从而帮助开发者提升...
Java捕获和处理异常 Java捕获和处理异常是Java编程语言中的一种机制,用于处理程序中的异常情况。异常是指程序在执行过程中出现的、不期望的事件,可能会导致程序的崩溃或错误。Java提供了try、catch和finally三种...
总的来说,正确地使用`try-catch-finally`可以帮助我们编写出更加健壮的代码,能够优雅地处理异常,保持程序的稳定运行,并提供有价值的错误反馈,从而提高用户体验。理解并熟练掌握异常处理是每个IT专业人士必备的...
数据预处理是数据挖掘和分析过程中至关重要的一步,它包括数据清洗、数据集成、数据转换和数据规约等多个环节。其中,剔除异常值和数据...正确地处理异常值和平滑数据,可以帮助研究者和分析师得到更为真实可靠的结果。
与Retrofit结合使用时,可以将网络请求转换为可观察的序列,从而更容易控制数据流和处理异常。 在Retrofit接口中返回`Observable`,我们可以通过订阅(subscribe)来处理数据: ```java apiService.getUser(userId...
在这个“375.373.JAVA基础教程_异常处理-处理异常:try-catch方式(375)”的教程中,我们将深入探讨Java中的异常处理机制,特别是如何通过try-catch语句块来处理异常。 异常在Java中是一种对象,它是类`Exception`或...
然而,C语言本身并不直接支持异常处理机制,它依赖于错误返回码和自定义错误处理函数来处理异常情况。但在某些情况下,开发者可能需要在C语言中实现类似异常处理的功能,以增强代码的健壮性和可维护性。本篇文章将...
在.NET开发环境中,C#语言提供了丰富的特性(Attributes)、依赖注入(DI)和面向切面编程(AOP)等机制,使得我们可以...通过对这些文件的分析和学习,开发者可以进一步理解如何在实际项目中应用C#和AOP来处理异常。
在ASP.NET开发中,处理异常和错误是至关重要的部分,因为这直接影响到应用程序的稳定性和用户体验。本资源主要探讨了如何有效地在ASP.NET环境中管理异常,确保程序在遇到问题时能够优雅地处理并提供有用的反馈。 1....
比如,源码可能包含了如何使用`易出错`和`恢复出错`等关键字来处理系统级异常,如何自定义异常类来扩展异常处理功能,以及如何在多线程环境下正确处理异常。 此外,这些源码还可能涉及到一些高级的异常处理技术,如...
这个"Java实例 - 使用catch处理异常源代码-详细教程.zip"文件显然包含了一组示例代码,旨在帮助开发者深入理解如何在Java中有效地管理异常。在本文中,我们将深入探讨Java中的异常处理机制,并通过catch块的使用来...