日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

完全版 ESQL/C資料三( 六 )


SQLDA結構
N=3
V
L
T
I
F=1 describe設置
S
N
C
X
Y
Z
圖6-5 SQLDA結構示例【完全版 ESQL/C資料三】 下面這個例子是一個adhoc程序 。用戶輸入任何合法的SQL語句(可以帶參數),該程序能夠處理這個語句,并打印出結果 。這個例子非常經典,說明使用SQLDA的兩個功能 。
#include
#include
#include/* 列的最大數目或宿主變量的最大個數*/
#define MAX_ITEMS 40
/* 列名的最大長度或指示符的最大長度*/
#define MAX_VNAME_LEN 30
#define MAX_INAME_LEN 30
#ifndef NULL
#define NULL 0
#endifchar *dml_commands[] = {"SELECT", "select", "INSERT", "insert",
"UPDATE", "update", "DELETE", "delete"};
EXEC SQL BEGIN DECLARE SECTION;
char dyn_statement[1024];
EXEC SQL VAR dyn_statement IS STRING(1024);
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;
SQLDA *bind_dp;
SQLDA *select_dp;
extern SQLDA *SQLSQLDAAlloc();
extern void sqlnul();/* Define a buffer to hold longjmp state info. */
jmp_buf jmp_continue;/* A global flag for the error routine. */
int parse_flag = 0;main()
{
int oracle_connect();
int alloc_descriptors();
int get_dyn_statement();
int set_bind_variables();
int process_select_list();
int i;/*連接到數據庫 */
if (oracle_connect() != 0)
exit(1);
/* 為SQLDA分配空間*/
if (alloc_descriptors(MAX_ITEMS, MAX_VNAME_LEN, MAX_INAME_LEN) != 0)
exit(1);
/* 處理SQL 語句*/
for (;;)
{
i = setjmp(jmp_continue);
/* 獲取SQL語句 。輸入"exit"表示退出 */
if (get_dyn_statement() != 0)
break;
/* 對該SQL語句做PREPARE操作 */
EXEC SQL WHENEVER SQLERROR DO sql_error();
parse_flag = 1; /* Set a flag for sql_error(). */
EXEC SQL PREPARE S FROM :dyn_statement;
parse_flag = 0; /* Unset the flag. */
/*聲明游標*/
EXEC SQL DECLARE C CURSOR FOR S;
/* 提示用戶輸入參數值*/
set_bind_variables();
/* 打開游標 */
EXEC SQL OPEN C USING DESCRIPTOR bind_dp;/* 處理語句,并輸出結果*/
process_select_list();/*輸出處理的行數. */
for (i = 0; i < 8; i)
{
if (strncmp(dyn_statement, dml_commands[i], 6) == 0)
{
printf("nn%d row%c processed.n",
sqlca.sqlerrd[2],
sqlca.sqlerrd[2] == 1 ? "" : "s");
break;
}
}
} /* end of for(;;) statement-processing loop *//* 釋放申請的空間*/
for (i = 0; i < MAX_ITEMS; i)
{
if (bind_dp->V[i] != (char *) 0)
free(bind_dp->V[i]);
free(bind_dp->I[i]); /* MAX_ITEMS were allocated. */
if (select_dp->V[i] != (char *) 0)
free(select_dp->V[i]);
free(select_dp->I[i]); /* MAX_ITEMS were allocated. */
}SQLSQLDAFree(SQL_SINGLE_RCTX, bind_dp);
SQLSQLDAFree(SQL_SINGLE_RCTX, select_dp);EXEC SQL WHENEVER SQLERROR CONTINUE;
/* 關閉游標*/
EXEC SQL CLOSE C;EXEC SQL COMMIT WORK RELEASE;
puts("nHave a good day!n");EXEC SQL WHENEVER SQLERROR DO sql_error();
return;
}/*連接數據庫函數*/
oracle_connect()
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[128];
VARCHAR passWord[32];
EXEC SQL END DECLARE SECTION;
/提示用戶輸入用戶名*/
printf("nusername: ");
fgets((char *) username.arr, sizeof username.arr, stdin);
fflush(stdin);
username.arr[strlen((char *) username.arr)-1] = "";
username.len = strlen((char *) username.arr);
/*提示用戶輸入口令*/
printf("password: ");
fgets((char *) password.arr, sizeof password.arr, stdin);
fflush(stdin);
password.arr[strlen((char *) password.arr) - 1] = "";
password.len = strlen((char *) password.arr);
EXEC SQL WHENEVER SQLERROR GOTO connect_error;
/*連接數據庫*/
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf("nConnected to ORACLE as user %s.n", username.arr);
return 0;
/*連接錯誤處理*/
connect_error:
fprintf(stderr, "Cannot connect to ORACLE as user %sn",
username.arr);
return -1;
}
/*為SQLDA分配空間*/
alloc_descriptors(size, max_vname_len, max_iname_len)

推薦閱讀