DECLARE HANDLER 语句

DECLARE HANDLER 语句创建错误处理程序用来处理异常。

语法

您可以在显式声明的(BEGIN...END)作用域和隐式声明的作用域(例如 IF 语句的 ELSE 子句)中声明处理程序。但是,所有的处理程序声明必须一起放在作用域的顶部,任何其他语句之前。

如果没有异常,处理程序的存在对 SQL 程序的行为或性能没有任何影响。如果发生异常,WebSphere Message Broker 会将异常的 SQL 状态与所有相关处理程序的 SQL 状态进行比较,直到异常离开节点(就象没有处理程序时那样)或发现一个匹配的处理程序。在任何作用域中,都会按照处理程序的声明顺序搜索它们;即从第一个搜索到最后一个。从作用域的最里面搜索到最外面。

DECLARE... HANDLER... 语句中提供的 SQL 状态值可以直接与异常的 SQL 状态进行比较或使用通配符进行比较。要直接比较状态值,请指定 VALUE 或不指定条件运算符。要进行通配比较,请使用下划线和百分比字符分别表示单个和多个通配符,并指定 LIKE 运算符。此通配方法可以处理所有一般类型的异常,而无需将它们详尽列出。

如果找到匹配的处理程序,就会根据下面描述的规则更新 SQLSTATE 和其他专用寄存器,并处理处理程序的语句。

由于处理程序的语句必须是单条语句,因此它通常是一个组合语句(如 BEGIN...END),其中包含多条其他语句。这些内部语句没有关联的专门行为,也没有专门的限制。例如,它们可以包含 RETURN、ITERATE 或 LEAVE;这些会影响它们包括例程和循环构造的方式,该方式与作用域本身中包括它们的方式相同。

处理程序可以包含自身发生的异常的处理程序。

如果处理程序的代码在未抛出其他未处理异常的情况下完成处理,则按以下方式继续执行常规代码:
  • 对于 EXIT 处理程序,下一条要处理的语句是处理程序作用域之后的第一条语句。
  • 对于 CONTINUE 处理程序,是产生异常的语句后面的第一条直接包含的语句。

每个处理程序都有自己的 SQLCODE、SQLSTATE、SQLNATIVEERROR 和 SQLERRORTEXT 专用寄存器。它们在执行处理程序的第一条语句之前进入作用域,并设置它们的值。在执行处理程序的最后一条语句之前,它们一直有效。由于 SQLSTATE 值不会从一个处理程序延续到另一个处理程序,因此处理程序可以独立编写。

处理程序吸收异常,防止它们到达输入节点,因此会导致事务被落实而不是回滚。处理程序可以使用 RESIGNAL 或 THROW 语句防止发生这种情况。

示例

-- 删除表,以便用最新的定义重新创建它们。
-- 如果程序以前从未运行过,将发生错误,因为您
-- 无法删除不存在的表。忽略这些消息。
               BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE LIKE'%' BEGIN END;

    PASSTHRU 'DROP TABLE Shop.Customers' TO Database.DSN1;    PASSTHRU 'DROP TABLE Shop.Invoices' TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Sales' TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Parts' TO Database.DSN1;
    END;
相关概念
ESQL 概述
相关任务
正在开发 ESQL
相关参考
RESIGNAL 语句
语法图:可用类型
ESQL 语句
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak20700_