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 的用法 » 存储过程和触发器 » 使用过程、触发器和批处理 » 过程和触发器中的错误和警告

 

过程和触发器中缺省的错误处理

本节介绍 SQL Anywhere 在您没有在过程中内置错误处理方式的情况下会如何处理过程执行期间所发生的错误。

要改变行为方式,可以使用在在过程和触发器中使用异常处理程序中介绍的异常处理程序。

警告与错误的处理方式稍有不同:有关说明,请参见过程和触发器中警告的缺省处理

有两种无需使用显式错误处理即可处理错误的方法:

  • 缺省的错误处理   过程或触发器失败,并且将错误代码返回到调用环境。

  • ON EXCEPTION RESUME   如果 ON EXCEPTION RESUME 子句出现在 CREATE PROCEDURE 语句中,则过程将在出现错误后继续执行,在导致错误的语句之后的下一语句恢复。

    使用 ON EXCEPTION RESUME 的过程的精确行为由 on_tsql_error 选项设置来规定。请参见on_tsql_error 选项 [兼容性]

缺省的错误处理

通常,如果过程或触发器中的 SQL 语句失败,该过程或触发器会停止执行,并将控制权及对 SQLSTATE 值和 SQLCODE 值的适当设置返回给应用程序。即使错误发生在从第一个过程或触发器直接或间接调用的过程或触发器中,上述情况也同样适用。对于触发器,导致该触发器触发的操作也将撤消,错误被返回给应用程序。

以下演示过程说明了在发生下面情况时的结果:应用程序调用过程 OuterProc,OuterProc 又调用过程 InnerProc,然后遇到错误。

CREATE PROCEDURE OuterProc()
BEGIN
   MESSAGE 'Hello from OuterProc.' TO CLIENT;
   CALL InnerProc();
   MESSAGE 'SQLSTATE set to ',
      SQLSTATE,' in OuterProc.' TO CLIENT
END;
CREATE PROCEDURE InnerProc()
   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.

InnerProc 中的 DECLARE 语句为与服务器已知的错误条件相关联的某一预定义的 SQLSTATE 值声明符号名称。

MESSAGE 语句将消息发送到 Interactive SQL [消息] 选项卡。

SIGNAL 语句从 InnerProc 过程内生成错误条件。

InnerProc 中跟随在 SIGNAL 语句之后的任何语句都不会执行:InnerProc 会立即将控制权传递回调用环境,在本例中调用环境即为 OuterProc 过程。OuterProc 中没有任何跟随在 CALL 语句之后的语句执行。错误条件返回到调用环境中,并在那里进行处理。例如,Interactive SQL 通过显示描述该错误的消息窗口来处理该错误。

TRACEBACK 函数会提供在发生错误时正执行的语句的列表。可以输入以下语句以从 Interactive SQL 使用 TRACEBACK 函数:

SELECT TRACEBACK();