DB2 条件处理器定义(Condition Handler Declarations)
可以在SQL procedure中定义一个条件处理器(Handler)来处理特殊的行为。下面是一个通用的处理器(Handler)定义格式:
DECLARE handler-type HANDLER FOR conditionSQL-procedure-statement
当DB2触发一个满足定义的条件时,就会将控制权交给条件处理器(Condition handler),条件处理器根据指定的处理类型(Handle Type)来执行指定的SQL-Procedure-Statement。
处理类型(Handler-types)
CONTINUE 执行SQL-procedure-statement的过程中如果出现错误,则跳到引起错误sql statement后的语句继续执行。
EXIT 执行SQL-procedure-statement的过程中如果出现错误,直接跳到定义该condition的语句块(compound statement,类似oracle PL/SQL block)之后的语句。
UNDO 在执行SQL-procedure-statement之前定义,如果在定义该handler的语句块(compound statement)内发生错误,DB2将rollback所有执行的SQL statement.
Note: UNDO处理器(handler)只能定义在ATOMIC的语句块(compound statements)中。ATOMIC的含义:如果在语句块(compound statement)中一条语句出现了错误,该语句块(compound statement)中所有的语句将被rollback.NOT ATOMIC含义相反。
处理条件(Conditions)
DB2预定义了3中处理条件(Condition):NOT FOUND SQLCODE等于于正100(+100)或者SQLSTATE以‘02’开头的所有错误(Condition)。
SQLEXCEPTION SQLCODE为负数的所有错误(Condition)。
SQLWARNING 所有的警告类型的错误(Condition)(SQLWARNO等于‘W’),或者一个正SQL(positiveSQL)的SQLCODE不同于正100(+100)(这句话翻译有点confused,引用原文:or that results in a positive SQL return code other than +100).这种类型的SQLSTATE都以’01’开头。
DB2支持通过DECLARE为一个特定的SQLSTATE定义自定义的条件(condition)。
SQL-procedure-statement
条件处理器(condition handler)的行为语句可以是单SQL(Single SQL)的SQL Statement,也可以是用BEGIN..END来定义一个语句块(compound statement).如果你是通过语句块来定义条件处理器(condition hander)的行为时,那么你必须首先定义2个本地变量(local variable)或者参数来接收SQLCODE和SQLSTATE。如果你没有将SQLSTATE或SQLCODE指定给本地的变量或者参数的话,调用该条件处理器的SQLCODE和SQLSTATE值将丢失。
以下是一些条件处理器的Samples:
CONTINUE handler 当DB2触发一个NOT FOUND错误(condition)时,以下的处理器(handler)将1赋给本地变量at_end.并且将控制权交给引起NOT FOUND错误语句的下一条语句,继续执行。
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end = 1;
EXIT handler 在这个例子中,退出处理器(Exit Handler)的生效范围被限制在Label A限定的语句块(compound statement)中。如果表JAVELIN不存在,“DROP TABLE JAVELIN”将触发NO_TABLE错误(Condition), 退出处理器(Exit Handler)被激活,变量OUT_BUFFER被置值为“Table does not exist”,程序跳到C处的insert statement继续执行,忽略Label A限定的语句块(compound statement)中的其他语句。如果DROP statement能都执行成功,退出处理器(Exit Handler)将不被激活,执行将逐句执行下去,包括Label B限定的语句。
CREATE PROCEDURE EXIT_TEST ()
LANGUAGE SQL
BEGIN
DECLARE OUT_BUFFER VARCHAR(80);
DECLARE NO_TABLE CONDITION FOR SQLSTATE '42704';
A: BEGIN
DECLARE EXIT HANDLER FOR NO_TABLE
BEGIN
SET OUT_BUFFER='Table does not exist';
END;
-- Drop potentially nonexistent table:
DROP TABLE JAVELIN;
B: SET OUT_BUFFER='Table dropped successfully'; END;
-- Copy OUT_BUFFER to some message table:
C: INSERT INTO MESSAGES VALUES OUT_BUFFER;
END
UNDO handler 本例中,撤销处理器(undo handler)的生效范围被限定在Label A限定的语句块(compound statement)中。如果表JAVELIN不存在,DROP语句将触发NO_TABLE错误(condition),撤销处理器(undo handler)被激活,DROP语句之前的insert将被回滚,同时OUT_BUFFER被置值为“Table does not exist”,执行调转到Label C限定的insert语句,Label A限定的其他语句将被忽略。如果DROP语句能够执行成功,撤销处理器(undo handler)不会被激活,执行将逐句执行下去,包括B限定的语句。
CREATE PROCEDURE UNDO_TEST () LANGUAGE SQL BEGIN DECLARE OUT_BUFFER VARCHAR(80); DECLARE NO_TABLE CONDITION FOR SQLSTATE '42704';
A: BEGIN ATOMIC DECLARE UNDO HANDLER FOR NO_TABLE BEGIN SET OUT_BUFFER='Table does not exist'; END;
INSERT INTO MESSAGES VALUES 'This message will be removed by a rollback.';
-- Drop potentially nonexistent table: DROP TABLE JAVELIN;
B: SET OUT_BUFFER='Table dropped successfully'; END;
-- Copy OUT_BUFFER to some message table: C: INSERT INTO MESSAGES VALUES OUT_BUFFER; END
Note:
撤销处理器(undo handler)只能被定义在ATOMIC语句块中。ATOMIC的含义:如果在语句块(compound statement)中一条语句出现了错误,该语句块(compound statement)中所有的语句将被rollback.NOT ATOMIC含义相反。
说明:本文是根据IBM DB2 Application Development Guide翻译而来。
分享到:
相关推荐
本文将详细介绍在DB2中进行的一些常用基本操作,包括启动和停止DB2实例、创建和连接数据库,以及各种管理和监控数据库的命令。 1. **启动DB2实例**:使用`db2start`命令可以启动DB2实例,确保服务正常运行。 2. *...
在Android应用开发中,Handler是实现多线程间通信、特别是主线程与工作线程间交互的重要工具。本文将深入探讨Handler的基本用法,以及它如何帮助开发者在UI线程中进行更新,同时确保在子线程中执行耗时操作。 ### ...
在Android开发中,`Handler`是一个至关重要的组件,主要用于处理线程间的通信,尤其是主线程(UI线程)与后台线程之间的数据交互。本文将详细介绍`Handler`的基本使用及其在更新UI中的应用。 首先,我们需要理解...
通过创建一个Handler实例并与Looper(消息循环)关联,我们可以发送和处理Message,从而实现在不同线程间的数据传递和回调。 在Fragment和Activity之间使用Handler,通常涉及以下步骤: 1. **创建Handler实例**:...
创建DB2存储过程的基本语法如下: ```sql CREATE PROCEDURE procedure_name (IN input_param1 datatype, INOUT input_output_param datatype, OUT output_param datatype) BEGIN -- SQL statements END; ``` ...
### DB2存储过程基本语法详解 在数据库管理与应用程序开发领域,存储过程是提升数据处理效率、增强数据安全性和简化复杂操作的关键技术之一。DB2作为IBM推出的一款高性能关系型数据库管理系统,其存储过程功能强大...
例如,使用`Ext.util.Observable.capture`方法可以捕获并控制事件的传播,但如果`handler`已定义,它可能不会受到`capture`方法的影响。 3. **对比与应用场景** - `handler`是`listener`的一个特殊形式,更适用于...
`Handler`是Android消息处理机制的核心部分,它与`Looper`和`Message`共同协作,实现了线程间的消息传递。`Handler`通常在主线程(UI线程)中创建,用于接收并处理来自其他线程的消息。 ### 2. Handler工作原理 - ...
// 后台线程发送消息,与基本用法相同 ``` 3. **使用WeakReference防止内存泄漏** 当`Handler`被绑定到Activity或Fragment等生命周期有限的对象时,如果不正确处理,可能导致内存泄漏。使用`WeakReference`可以...
在Android开发中,线程和线程池是处理异步任务的重要工具,而Handler则是用于在主线程和子线程之间通信的关键组件。本篇文章将深入探讨这些概念,以及它们在实际应用中的用法。 首先,让我们理解什么是线程。线程是...
首先,Handler的基本结构主要包括三部分:Handler对象、Looper循环器和Message消息对象。在Android系统中,每个线程都有一个Looper,它是消息队列的管理者,负责取出Message并分发给相应的Handler进行处理。 主线程...
本篇文章将详细介绍`Handler`的基本概念、工作原理以及如何在一个`Activity`中简单使用它来实现动画效果。 `Handler`的核心功能是发送和处理消息。在Android系统中,主线程负责处理用户交互,如显示界面、更新UI等...
这通常在UI线程中完成,因为`Handler`与运行它的线程绑定。创建`Handler`时,可以重写`handleMessage(Message msg)`方法来定义处理消息的方式: ```java Handler handler = new Handler() { @Override public ...
- **定时任务**:支持cron表达式定义任务的执行时间,实现复杂的定时任务调度。 - **任务控制**:提供了任务暂停、恢复、删除、重试等操作,便于任务管理。 - **日志跟踪**:完整记录任务执行的日志,方便问题...
2. 在HandlerThread内部,创建一个Handler实例,这样Handler就会与HandlerThread的Looper关联。 3. 使用主线程中的Handler实例,通过`sendMessage()`或者`post()`方法发送消息到后台线程的Handler,这些消息会被放入...
本篇文章将详细讲解Handler的基本概念、工作原理以及如何在实际项目中应用。 首先,Handler的核心作用是在不同的线程间传递消息(Message)并执行相应的回调方法。在Android中,大部分UI操作必须在主线程(也称为UI...
Handler、Looper和Message三者共同构建了一个消息传递机制,使得非UI线程可以安全地与UI线程交互。下面我们将深入探讨Handler的各个方面。 首先,我们来理解Handler的基本概念。Handler是一个接口,它定义了如何...
当我们在主线程中创建一个Handler实例时,这个Handler会自动与当前线程的Looper绑定。我们可以通过Handler发送Message对象到消息队列,Looper会按照先进先出(FIFO)的规则将这些消息传递给Handler来处理。 创建...
在Android开发中,`Handler`是一个至关重要的组件,主要用于处理线程间的通信,尤其是主线程(UI线程)与工作线程之间的交互。本`Handler`推荐用法的示例,旨在帮助开发者理解和掌握如何有效地使用`Handler`来管理...