`

(DB2)Handler基本语义与定义

    博客分类:
  • DB2
阅读更多

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翻译而来。

分享到:
评论

相关推荐

    Handler的基本使用

    Handler的基本使用,通过Handler更新UI中TextView的显示

    Handler的基本用法

    基本思路 1主线程中显示更新ui 2子线程中执行耗时操作 3子线程做的每一步耗时操作向主线程发消息,主线程更新ui;

    handler与listener的区别

    handler与Action相关联,一个Action可以有多个Component引用; Action是一个可被共享的对象,有五个主要的属性:text, handler, iconCls, disabled, hidden component的构建方式比较有意思: new Ext.Button...

    Handler与AsyncTask使用示例

    Handler与AsyncTask使用示例,Handler AsyncTask 示例 looper

    Looper、Handler与HandlerThread

    Looper、Handler与HandlerThread相关概念与简介

    线程,线程池与Handler的用法

    子线程的开启,线程池种类的介绍,线程池的应用,子线程更新Handler的用法

    Foxit PDF Preview Handler

    通过 Foxit PDF Preview Handler 可以让你的OutLook2007预览PDF 文件。 Foxit PDF Preview Handler 1.1 For XP

    用handler在两个activity之间传递数据

    资源包括如何在一个activity A里激活另一个activity B。 然后在两个activity之间用handler传输数据。在activity A里定义全局变量handler,用sendMessage来发数据,在handler里数据以消息队列的方式发送。

    handler发送和接收message的各种方式

    handler发送和接收message的各种方式 (1)Handler.SendEmptyMessage(what); (2)Handler.obtainMessage(int what, int arg1, int arg2, Object obj).sendYToTarget(); (3)Message.obtain(handler, MESSAGE_MSG, 0, 0, ...

    Handler使用

    整理了Handler的各种使用方法

    handler用法

    android:handler简单用法

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    Handler 推荐用法 demo

    Handler 推荐用法 demo

    netty-handler-4.1.68.Final-API文档-中文版.zip

    赠送jar包:netty-handler-4.1.68.Final.jar; 赠送原API文档:netty-handler-4.1.68.Final-javadoc.jar; 赠送源代码:netty-handler-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-handler-4.1.68....

    android 中Handler 的几种写法

    android 中Handler 的几种写法,很简单的demo,大神简单修改下,用的是Handler.Callback,的方法

    Fragment与Activity使用Handler进行交互

    这里简单介绍了Fragment和Activity使用Handler方式进行交互。

    EPSON NS 6040 Manual---- IC Handler

    EPSON High Speed IC Handler User Manual。硬件资源介绍,设备设置及使用。通信功能设置方法及信号定义。

    netty-handler-4.1.73.Final-API文档-中文版.zip

    赠送jar包:netty-handler-4.1.73.Final.jar; 赠送原API文档:netty-handler-4.1.73.Final-javadoc.jar; 赠送源代码:netty-handler-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-handler-4.1.73....

    线程与handler

    实现的应用为一加法器,在thread中时行计算,主线程通过handler传递参数给thread,theread处理完后再通过handler传回主线程。如果只是实现加法器,没有必要整个线程和handler,主要的目的在于数据在不同线程通过...

    handler的使用案例

    demo01: 通过handler.post()的方法可以更新ui demo02: 一秒钟切换一张图片 demo03: 霓虹灯动态效果的显示 demo04: 倒计时,停止倒计时 demo05: 通过handler.sendMessage和handleMessage发送处理消息 demo06: message...

Global site tag (gtag.js) - Google Analytics