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

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 存储过程、触发器、批处理和用户定义的函数 » 错误和警告处理

 

异常处理程序

对于某些类型的错误,通常需要进行拦截并在过程或触发器内处理,而不是将其传递回调用环境。这是通过使用异常处理程序完成的。

使用复合语句的 EXCEPTION 部分来定义异常处理程序。

只要在复合语句中发生错误,异常处理程序就会执行。与错误不同,警告不会导致执行异常处理代码。如果错误出现在嵌套的复合语句中,或者出现在复合语句内任何地方所调用的过程或触发器中,异常处理代码也会执行。

中断错误 SQL_INTERRUPT、SQLSTATE 57014 的异常处理程序应只包含不可中断的语句,如 ROLLBACK 和 ROLLBACK TO SAVEPOINT 等。如果异常处理程序包含连接中断时调用的可中断语句,数据库服务器将在第一个可中断语句处停止异常处理程序,并返回中断错误。

异常处理程序可以使用 SQLSTATE 或 SQLCODE 特殊值以确定语句失败的原因。也可以使用 ERRORMSG 函数(无需参数)返回与 SQLSTATE 相关的错误状况。只有每个 WHEN 子句中的第一个语句可以指定此信息,并且该语句不得为复合语句。

用来说明异常处理情况的这一演示过程基于在缺省的错误处理中所使用的过程。

在本例中,附加代码会在 InnerProc 过程中处理有关未找到的列的错误。



DROP PROCEDURE OuterProc;
DROP PROCEDURE 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 'Line following SIGNAL.' TO CLIENT;
   EXCEPTION
      WHEN column_not_found THEN
        MESSAGE 'Column not found handling.' TO CLIENT;
      WHEN OTHERS THEN
        RESIGNAL ;
END;

CALL OuterProc();

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

Hello from OuterProc.
Hello from InnerProc.
Column not found handling.
SQLSTATE set to 00000 in OuterProc.

EXCEPTION 子句声明异常处理程序。EXCEPTION 后的各行直到错误发生时才会执行。每一 WHEN 子句都指定一个异常名称(用 DECLARE 语句声明)以及在遇到该异常时要执行的语句。WHEN OTHERS THEN 子句指定当所发生的异常没有出现在之前的 WHEN 子句时要执行的语句。

在上述示例中,RESIGNAL 语句将该异常传递给更高级别的异常处理程序。如果在异常处理程序中不指定 WHEN OTHERS THEN,则 RESIGNAL 是缺省操作。

 附加说明
 异常处理和原子复合语句
 另请参见