
# 设置回调
当告警或者错误发生时，直接执行具体操作进行处理，设置回调命令如下：
```
EXEC SQL WHENEVER condition action;
```
condition取值范围：
- SQLERROR：当在SQL语句执行期间发生错误时，调用指定操作。
- SQLWARNING：当在SQL语句执行期间发生告警时，调用指定操作。
- NOT FOUND：当SQL语句检索或者影响为零行时，调用指定操作。
 
action取值范围：
- CONTINUE：忽略回调错误条件，继续执行，通常可以用来停止break包含条件，为缺省值。
- GOTO label/GO TO label：跳转到指定label（使用C语言goto语句）。
- SQLPRINT：输出消息到标准错误。
- STOP：调用exit(1)，终止程序。
- DO BREAK：执行C语句break，只能在循环或者switch语句中使用。
 
示例如下：
```
/* 当出现一个告警时打印一个消息 */
EXEC SQL WHENEVER SQLWARNING SQLPRINT; 
/* 发生一个错误时中止程序。 */
EXEC SQL WHENEVER SQLERROR STOP;
```
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- EXEC SQL WHENEVER 是 SQL 预处理器指令，而非C语言语句。它用于设置错误或警告的处理动作，该设置对后续所有嵌入式SQL语句生效，除非在第一个EXEC SQL WHENEVER语句与触发错误或警告的SQL语句之间，针对同一情况设置了不同的处理动作。因此下面的两个C语言程序都不会得到预期的效果：
  ```
  /* 错误 */ 
  void func()
  {
      ...     
      if (verbose) { 
          EXEC SQL WHENEVER SQLWARNING SQLPRINT;
      }
      ...     
      EXEC SQL SELECT ...;    
      ... 
  }
  ```
  ```
  /* 错误 */ 
  void func()
  { 
      ... 
      set_error_handler(); 
      ... 
      EXEC SQL SELECT ...; 
      ... 
  }  
  static void set_error_handler(void) 
  { 
      EXEC SQL WHENEVER SQLERROR STOP; 
  }
  ```
  
- DO BREAK只能用于while/for/switch场景，且执行结束时需要使用CONTINUE语句忽略回调错误条件。
 
