DECLARE HANDLER 语句创建错误处理程序用来处理异常。
您可以在显式声明的(BEGIN...END)作用域和隐式声明的作用域(例如 IF 语句的 ELSE 子句)中声明处理程序。但是,所有的处理程序声明必须一起放在作用域的顶部,任何其他语句之前。
如果没有异常,处理程序的存在对 SQL 程序的行为或性能没有任何影响。如果发生异常,WebSphere Message Broker 会将异常的 SQL 状态与所有相关处理程序的 SQL 状态进行比较,直到异常离开节点(就象没有处理程序时那样)或发现一个匹配的处理程序。在任何作用域中,都会按照处理程序的声明顺序搜索它们;即从第一个搜索到最后一个。从作用域的最里面搜索到最外面。
DECLARE... HANDLER... 语句中提供的 SQL 状态值可以直接与异常的 SQL 状态进行比较或使用通配符进行比较。要直接比较状态值,请指定 VALUE 或不指定条件运算符。要进行通配比较,请使用下划线和百分比字符分别表示单个和多个通配符,并指定 LIKE 运算符。此通配方法可以处理所有一般类型的异常,而无需将它们详尽列出。
如果找到匹配的处理程序,就会根据下面描述的规则更新 SQLSTATE 和其他专用寄存器,并处理处理程序的语句。
由于处理程序的语句必须是单条语句,因此它通常是一个组合语句(如 BEGIN...END),其中包含多条其他语句。这些内部语句没有关联的专门行为,也没有专门的限制。例如,它们可以包含 RETURN、ITERATE 或 LEAVE;这些会影响它们包括例程和循环构造的方式,该方式与作用域本身中包括它们的方式相同。
处理程序可以包含自身发生的异常的处理程序。
每个处理程序都有自己的 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;