WHENEVER 的各種類型的錯誤處理互相獨立,只有相同類型的WHENEVER語句才會替代之前的
比如:
EXEC SQL WHENEVER SQLERROR DO dyn_error("ORACLE error--\n"); --語句1
...
...
EXEC SQL WHENEVER NOT FOUND DO break; --語句2
...
...
EXEC SQL WHENEVER NOT FOUND CONTINUE; --語句3
語句1因為後面沒有碰到同類型的錯誤,所以他的作用域是從他開始到最後
語句2因為碰到相同類型的錯誤語句3,所以他的作用域是語句2和語句3之間
語句3的作用域是從語句3到最後
語句3之後若出現語句1類型的錯誤,會按語句1的處理方法處理,不會受語句2或3的影響,因為他們類型不一樣
其實 ...WHENEVER SQLERROR...預編譯成C之後是:在該文件該語句之後的每個EXEC SQL 語句之後添加 if (sqlca.sqlcode < 0) {...}
...WHENEVER NOT FOUND...預編譯成C之後是:在該文件該語句之後的每個select ,fetch 語句之後添加 if (sqlca.sqlcode == 1403) {...}
由此可以知道這種語句在文件內是局部的,而不是函數內局部的
這兩種類型的錯誤處理互不影響,而同類型的錯誤處理會被最新的所取代
**************************** 下面是這些語句預編譯成C之後的代碼(刪除了大部分的語句)******************
#include <stdio.h>
#include <string.h>
#include <sqlca.h>
/* EXEC SQL BEGIN DECLARE SECTION; */
/* EXEC SQL include "example.h";
/* EXEC SQL END DECLARE SECTION; */
int main()
{
/* EXEC SQL BEGIN DECLARE SECTION; */
char *usr_pwd = "train/train";
int i;
/* EXEC SQL END DECLARE SECTION; */
/* EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n"); */
/* EXEC SQL CONNECT :usr_pwd; */
{
if (sqlca.sqlcode < 0) sql_error("ORACLE error--\n");
}
printf("Connected to ORACLE!\n");
/* EXEC SQL WHENEVER NOT FOUND DO break; */
/* EXEC SQL WHENEVER NOT FOUND GOTO label_exit; */
/* EXEC SQL SELECT value INTO :i FROM proc_tab WHERE no = 1; */
{
if (sqlca.sqlcode == 1403) goto label_exit;
if (sqlca.sqlcode < 0) sql_error("ORACLE error--\n");
}
printf("%d\n", i);
label_exit:
/* EXEC SQL COMMIT WORK RELEASE; */
{
if (sqlca.sqlcode < 0) sql_error("ORACLE error--\n");
}
printf("\nDisconnected from ORACLE automaticly!\n");
return 0;
}
************************************************************************************** 程序2
#include <stdio.h>
#include <string.h>
#include <sqlca.h>
/* EXEC SQL BEGIN DECLARE SECTION; */
/* EXEC SQL include "example.h";*/
/* EXEC SQL END DECLARE SECTION; */
int main()
{
/* EXEC SQL BEGIN DECLARE SECTION; */
char *usr_pwd = "train/train";
int i;
/* EXEC SQL END DECLARE SECTION; */
/* EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n"); */
/* EXEC SQL CONNECT :usr_pwd; */
{
if (sqlca.sqlcode < 0) sql_error("ORACLE error--\n");
}
printf("Connected to ORACLE!\n");
/* EXEC SQL WHENEVER NOT FOUND DO break; */
/* EXEC SQL WHENEVER NOT FOUND GOTO label_exit; */
/* EXEC SQL WHENEVER SQLERROR CONTINUE; */
/* EXEC SQL SELECT value INTO :i FROM proc_tab WHERE no = 1; */
{
if (sqlca.sqlcode == 1403) goto label_exit;
}
printf("%d\n", i);
label_exit:
/* EXEC SQL COMMIT WORK RELEASE; */
}
printf("\nDisconnected from ORACLE automaticly!\n");
return 0;
}
*************************************************************************************************程序3
#include <stdio.h>
#include <string.h>
#include <sqlca.h>
int main()
{
/* EXEC SQL BEGIN DECLARE SECTION; */
char *usr_pwd = "train/train";
int i;
/* EXEC SQL END DECLARE SECTION; */
/* EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n"); */
/* EXEC SQL CONNECT :usr_pwd; */
{
if (sqlca.sqlcode < 0) sql_error("ORACLE error--\n");
}
printf("Connected to ORACLE!\n");
/* EXEC SQL WHENEVER NOT FOUND DO break; */
/* EXEC SQL WHENEVER NOT FOUND GOTO label_exit; */
/* EXEC SQL WHENEVER SQLERROR CONTINUE; */
/* EXEC SQL WHENEVER SQLERROR STOP; */
/* EXEC SQL SELECT value INTO :i FROM proc_tab WHERE no = 1; */
{
if (sqlca.sqlcode == 1403) goto label_exit;
if (sqlca.sqlcode < 0) exit(1);
}
printf("%d\n", i);
label_exit:
/* EXEC SQL COMMIT WORK RELEASE; */
{
if (sqlca.sqlcode < 0) exit(1);
}
printf("\nDisconnected from ORACLE automaticly!\n");
return 0;
}
void sql_error(char *msg) --和main在同一個文件裡
{
printf("\n%s\n", msg);
/* EXEC SQL ROLLBACK WORK RELEASE; */
{
if (sqlca.sqlcode < 0) exit(1); --被main函數裡面的WHENEVER SQLERROR STOP影響到了
}
exit(1);
}