WHENEVER
在每条嵌入式SQL语句之后立即编写一条检查SQLCODE/SQLSTATE值的程序,是一件很繁琐的事情。为了简化错误处理,可以使用WHENEVER语句.
WHENEVER语句是SQL预编译程序的指示语句,而不是可执行语句。它通知预编译程序在每条可执行嵌入式SQL语句之后自动生成错误处理程序,并指定了错误处理操作。
如何处理三种异常处理:
lWHENEVER SQLERROR action:表示一旦sql语句执行时遇到错误信息,则执行action,action中包含了处理错误的代码(SQLCODE<0)。
lWHENEVER SQLWARNING action:表示一旦sql语句执行时遇到警告信息,则执行aciton,即action中包含了处理警报的代码(SQLCODE=1)。
lWHENEVER NOT FOUND action:表示一旦sql语句执行时没有找到相应的元组,则执行action,即action包含了处理没有查到内容的代码(SQLCODE=100)。
针对上述三种异常处理,用户可以指定预编译程序采取以下三种行为(action):
lWHENEVER …GOTO:通知预编译程序产生一条转移语句。
lWHENEVER…CONTINUE:通知预编译程序让程序的控制流转入到下一个主语言语句。
lWHENEVER…CALL:通知预编译程序调用函数。
其完整语法如下:
WHENEVER {SQLWARNING | SQLERROR | NOT FOUND} {CONTINUE | GOTO stmt_label | CALL function()}
例:WHENEVER的作用
EXEC SQL WHENEVER sqlerror GOTO errormessage1;
EXEC SQL DELETE FROM test
EXEC SQL DELETE FROM test
EXEC SQL WHENEVER sqlerror CONTINUE;
EXEC SQL UPDATE test
EXEC SQL WHENEVER sqlerror GOTO errormessage2;
.
.
.
errormessage1:
printf("SQL DELETE error: %ld\n, sqlcode);
exit();
errormessage2:
printf("SQL INSERT error: %ld\n, sqlcode);
exit();
由于第一个WHENEVER语句的作用,前面两个DELETE语句中任一语句内的一个错误会在errormessage1中形成一个转移指令。由于一个WHENEVER语句替代前面WHENEVER语句,所以,嵌入式UPDATE语句中的一个错误会直接转入下一个程序语句中。
从上面例子看出,WHENEVER/CONTINUE语句的主要作用是取消先前的WHENEVER语句的作用。WHENEVER语句使得对嵌入式SQL错误的处理更加简便。