WHENEVER 的作用域

WHENEVER 是预处理器伪指令,而不是可执行的语句。GBase 8s ESQL/C 预处理器,不是数据库服务器,负责解释 WHENEVER 语句。当预处理器在 GBase 8s ESQL/C 源文件中遇到 WHENEVER 语句时,基于异常和 WHENEVER 指定的行动,它将适当的代码插入到每一 SQL 语句之后的预处理代码内。WHENEVER 语句的作用域起始于该语句在源模块中出现的地方,并保持有效,直到在继续处理该源模块时预处理器遇到下列情况中的一种时为止:

下列 GBase 8s ESQL/C 示例程序有三个 WHENEVER 语句,其中两个是 WHENEVER SQLERROR 语句。第 4 行使用带有 SQLERROR 的 STOP 来覆盖错误的缺省的 CONTINUE 活动。

第 8 行指定 CONTINUE 关键字来将错误的处理返回到缺省的行为。对于第 4 行与第 8 行之间的所有 SQL 语句,预处理器插入检查错误的代码,如果发生错误,则终止程序执行。因此,第 6 行 INSERT 语句产生的任何错误都会导致程序停止。

在第 8 行之后,预处理器不在 SQL 语句之后插入检查错误的代码。因此,忽略 INSERT 语句(第 10 行)、SELECT 语句(第 11 行)和 DISCONNECT 语句(第 12 行)产生的任何错误。然而,如果 SELECT 语句未定位到任何行,则它不停止程序执行;如果发生这样的异常,则第 7 行上的 WHENEVER 语句告诉程序继续:
1   main()
2   {
3   EXEC SQL connect to 'test';
4   EXEC SQL WHENEVER SQLERROR STOP;
5   printf("\n\nGoing to try first insert\n\n");
6   EXEC SQL insert into test_color values ('green');
7   EXEC SQL WHENEVER NOT FOUND CONTINUE;
8   EXEC SQL WHENEVER SQLERROR CONTINUE;
9   printf("\n\nGoing to try second insert\n\n");
10   EXEC SQL insert into test_color values ('blue');
11   EXEC SQL select paint_type from paint where color='red';
12   EXEC SQL disconnect all;
13   printf("\n\nProgram over\n\n");
14   }