Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 存储过程和触发器 » 使用过程、触发器和批处理 » 过程和触发器中的错误和警告

 

嵌套的复合语句和异常处理程序

只有 ON EXCEPTION RESUME 子句出现在过程定义中,跟随在导致出现错误的语句之后的代码才会执行。

您可以使用嵌套的复合语句来增强相关控制,以控制哪些语句在出现错误之后仍执行,哪些语句不执行。

以下示例说明如何使用嵌套的复合语句来控制程序流。此过程基于在过程和触发器中缺省的错误处理中用作示例的过程。

DROP PROCEDURE OuterProc;
DROP PROCEDURE InnerProc;

CREATE PROCEDURE InnerProc()
BEGIN
   BEGIN
      DECLARE column_not_found
      EXCEPTION FOR SQLSTATE VALUE '52003';
      MESSAGE 'Hello from InnerProc' TO CLIENT;
      SIGNAL column_not_found;
      MESSAGE 'Line following SIGNAL' TO CLIENT
      EXCEPTION
         WHEN column_not_found THEN
            MESSAGE 'Column not found handling' TO
            CLIENT;
         WHEN OTHERS THEN
            RESIGNAL;
   END;
   MESSAGE 'Outer compound statement' TO CLIENT;
END;

CALL InnerProc();

Interactive SQL [消息] 选项卡随后会显示以下内容:

Hello from InnerProc
Column not found handling
Outer compound statement

在遇到导致错误的 SIGNAL 语句时,控制权会传递给复合语句的异常处理程序,并输出 [Column not found handling] 消息。控制权然后传递回外部复合语句,并输出 [Outer compound statement] 消息。

如果在内部复合语句中遇到了 [未找到列] 以外的其它错误,则异常处理程序会执行 RESIGNAL 语句。RESIGNAL 语句将控制权直接传递回调用环境,不再执行其余的外部复合语句。