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 处理错误

如果 ON EXCEPTION RESUME 子句出现在 CREATE PROCEDURE 语句中,则该过程会在发生错误时检查随后的语句。如果该语句处理错误,则过程继续执行,在导致错误的语句之后的下一语句恢复。当发生错误时,它不会将控制权返回给调用环境。

可以通过 on_tsql_error 选项设置修改使用 ON EXCEPTION RESUME 的过程的行为。请参见on_tsql_error 选项 [兼容性]

错误处理语句包括以下这些:

以下演示过程说明了在发生下面情况时的结果:应用程序调用过程 OuterProc,OuterProc 又调用过程 InnerProc,然后遇到错误。这些演示过程基于在本节前面部分中所使用的过程:

DROP PROCEDURE OuterProc;
DROP PROCEDURE InnerProc;

CREATE PROCEDURE OuterProc()
ON EXCEPTION RESUME
BEGIN
   DECLARE res CHAR(5);
   MESSAGE 'Hello from OuterProc.' TO CLIENT;
   CALL InnerProc();
   SET res=SQLSTATE;
   IF res='52003' THEN
      MESSAGE 'SQLSTATE set to ',
         res, ' in OuterProc.' TO CLIENT;
   END IF
END;

CREATE PROCEDURE InnerProc()
ON EXCEPTION RESUME
BEGIN
   DECLARE column_not_found
      EXCEPTION FOR SQLSTATE '52003';
   MESSAGE 'Hello from InnerProc.' TO CLIENT;
   SIGNAL column_not_found;
   MESSAGE 'SQLSTATE set to ',
   SQLSTATE, ' in InnerProc.' TO CLIENT;
END;

CALL OuterProc();

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

Hello from OuterProc.
Hello from InnerProc.
SQLSTATE set to 52003 in OuterProc.

使用的执行路径如下所示:

  1. OuterProc 执行并调用 InnerProc。

  2. 在 InnerProc 中,SIGNAL 语句指示一个错误。

  3. MESSAGE 语句不是错误处理语句,因此控制将被传递回 OuterProc 并且不显示该消息。

  4. 在 OuterProc 中,跟随在错误后的语句将 SQLSTATE 值指派给名为 res 的变量。这是错误处理语句,因此过程的执行会继续并显示 OuterProc 消息。