程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Proc WHENEVER 錯誤處理作用域問題

Proc WHENEVER 錯誤處理作用域問題

編輯:關於C語言
 

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);
}
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved